バグバウンティの知識習得用のアウトプットとしてまとめます。
随時更新していきます。
※バグバウンティの勉強の一貫として記載しています。
検証環境はすべて渡しのローカル環境です。
絶対に悪用しないでください
SQLインジェクションとは
OWASPが1番詳しい。
ペイロード
脆弱なSQL構文
SELECT * FROM table WHERE data ="'" + value + "'";
基本形
シングルクォーテーション
'
シングルクォーテーションで基本的なことは確認できる。
以下のようなSQLになる。
SELECT * FROM table WHERE data =''';
SQLの構文としてエラーになるため、エラーが発生するかどうかで確認できる。
正常系
ペイロード入力
URLエンコーディングされているが、ペイロード入力した方ではSQLエラーが出ていることがわかる。
BWAが便利であることの裏付けでもある。
そのため、SQLインジェクションがあるかざっくり調べるだけならシングルクォーテーションだけでも使える。
認証回避系
or とか and とか
' or 'a'='a ' and 'a'='a
毎度おなじみなSQLインジェクションペイロード。
以下のようなSQLになる。
SELECT * FROM table WHERE data ='' or 'a'='a'; SELECT * FROM table WHERE data ='' and 'a'='a';
or は普通に攻撃になってしまうので絶対に使わない。
and を利用して構文自体が通るか確認する。
ログイン成功
ログイン失敗
ログイン成功時のクエリは以下のようになる。
SELECT * FROM table WHERE data ='test' and 'a'='a';
ログイン失敗時のクエリは以下のようになる。
SELECT * FROM table WHERE data ='test' and 'a'='b';
構文的には当然成功時は認証に成功し、失敗時は認証に失敗する結果となる。
実際の挙動も構文と同様となると、SQLの構文を注入できていることになるので、脆弱であることがわかる。
ログイン画面でシングルクォーテーションを入力した際、SQLエラーなんだかパスワードエラーなんだかわからないときに使ったりする。
関数実行系
absとか
abs(123) '+abs(123)+'
認証回避系とだいたい一緒で、関数が実行できるか確認する。
absなど影響が少なく、確実に実行できるもので確認することが多い。
以下のようなSQLになる。
SELECT * FROM table WHERE data =''+abs(123)+'';
文字列連結して、関数が実行されているか確認するが、DBによって連結の方法が変わる。
都度調べるか、面倒くさい場合は別の方法でやったりする。
関数未使用
関数使用
正常なパスワードは「123」だが、「abs(123)」でも通っているため脆弱であることがわかる。
画像ではURLエンコーディングしている。時と場合によっていろいろなんとかする。
まとめ
SQLインジェクションはSQLがからむため、検証方法がたくさん。
難しいね。