SQLインジェクションの基本検証

f:id:NickShadows:20190725220556j:plain

バグバウンティの知識習得用のアウトプットとしてまとめます。
随時更新していきます。
※バグバウンティの勉強の一貫として記載しています。
 検証環境はすべて渡しのローカル環境です。
 絶対に悪用しないでください





SQLインジェクションとは

OWASPが1番詳しい。

www.owasp.org



ペイロード

脆弱なSQL構文

SELECT * FROM table WHERE data ="'" + value + "'";



基本形

シングルクォーテーション

'



シングルクォーテーションで基本的なことは確認できる。
以下のようなSQLになる。

SELECT * FROM table WHERE data =''';



SQLの構文としてエラーになるため、エラーが発生するかどうかで確認できる。




正常系
f:id:NickShadows:20190725213525p:plain:w600

f:id:NickShadows:20190725214346p:plain:w600



ペイロード入力
f:id:NickShadows:20190725213806p:plain:w600

f:id:NickShadows:20190725214441p:plain:w600



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 を利用して構文自体が通るか確認する。




ログイン成功
f:id:NickShadows:20190725220022p:plain:w600

f:id:NickShadows:20190725220050p:plain:w600





ログイン失敗 f:id:NickShadows:20190725220252p:plain

f:id:NickShadows:20190725220310p:plain





ログイン成功時のクエリは以下のようになる。

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によって連結の方法が変わる。
都度調べるか、面倒くさい場合は別の方法でやったりする。




関数未使用
f:id:NickShadows:20190727093218p:plain:w600

f:id:NickShadows:20190727093243p:plain:w600





関数使用 f:id:NickShadows:20190727093310p:plain:w600

f:id:NickShadows:20190727093338p:plain:w600

正常なパスワードは「123」だが、「abs(123)」でも通っているため脆弱であることがわかる。
画像ではURLエンコーディングしている。時と場合によっていろいろなんとかする。




まとめ

SQLインジェクションはSQLがからむため、検証方法がたくさん。
難しいね。