Kioptrix: Level1.2 SQL Injectionについて
SQL Injectionについて出てきたのでまとめる
※筆者は理解しようとしてこの記事書いてるので、思考回路まんま記載してます
解説記事ではないのでご了承ください
内容について
もともとはこっちから
phpにおけるSQL Injectionの脆弱性の例
?id=1'を挿入することで、SQL構文エラーとなった
また、?id=''を挿入することで、SQL構文エラーが回避された
この時のphp側の形は・・・・?
XXX['$VARIABLE']
=> XXX['1''] => ERROR!
=> XXX[''''] => OK
ということか?
SQL Injectionの参考文献をいくつか確認する必要あり
その後、union select columns_sequenceを1, 2, 3, x-1に置き換えて発行
これって、カラムが6列あることは試してみないとわからないってことですよね??
?id=-1 union select XXXで、
(aaa, bbb, ccc, ddd, eee, fff)
(qqq, www, eee, rrr, ttt, yyy)
(1 , 2 , 3 , 4 , 5 , 6 )
こうすることで初めてエラーなく出力が可能になる
それ以外の場合の出力についても確認すること
※id=-1としているのは、union以下の行が確実に読まれるように存在しないidを指定している、であってるかな
さらに、脆弱な出力が2の部分であることが判明したので、
この部分にいろいろな組み込み関数を入れて出力を試している
version()やdetabase()、user()などがあるが、どのようなものが他にあるか・・・?
=>情報関数として、いろいろあるようだ
といっても、これくらいしか有用なのなかった
で、次のSQL
?id=-1 union select 1,group_concat (table_name),3,4,5,6 from information_schema.tables where table_schema=database()--
group_concatは連結された文字列を返却する
上記の内容の意味は、
information_schemaスキーマにあるtablesテーブルのtable_nameカラムを引っ張っている
tablesテーブルには少なくとも2つのカラムがあり、table_nameおよびtable_schemaを持っている
tablesテーブルの構成は以下
確かに、teble_nameとtable_schemaカラムが存在していることが確認できる
で、テーブル名を列挙して、それっぽいテーブルdev_accountsを確認
次のSQL Injectionでは以下の構文
?id=-1 union select 1,group_concat (column_name),3,4,5,6 from information_schema.columns where table_name=CHAR(100, 101, 118, 95, 97, 99, 99, 111, 117, 110, 116, 115)--
columnsテーブルは以下の感じ
とあるtable_schemaのとあるtable_nameにあるcolumn_nameってことで特定できる、と
これで検索かけて、id, username, passwordというカラム構成になっていることがわかるそう
ちょっと疑問だったのが、table_nameの部分をCHARであらわさなければいけないという部分
少し調べても出てこなかったので、どうしよう
ちなみにCHARとの変換は以下を使いました
http://www.waraxe.us/sql-char-encoder.html
で、3段目
?id=-1 union select 1,group_concat (username, 0x3a, password),3,4,5,6 from dev_accounts--
これでようやくユーザ名とパスワードハッシュが抜けましたとさ
Information_schemaについて
Information_schemaとは、特定のDBに対するテーブル名、カラム名といった読み取り専用情報のこと
おわりに
mysqlを題材としたphpのSQL Injectionについて理解が深まりましたー!
以上!