第6回詳解セキュリティコンテスト輪読会の記録

今回は p.157 - p.176が範囲。内容はSQL InjectionのはじめのSELECT文パート。

9章

サニタイズ

以下のPyMySQLで使われるようなところは、変数がORMライブラリによるサニタイズ、もしくはプリペアードステートメントによるものどちらか分からないが、攻撃は成立しない。

sql = "insert into kv (k,v) values(%s, %s);"

Pythonの文字列

Pythonは変数がダブルクオートでもシングルクオートでも文字列の挙動が同じ?

ダブルクオートで囲わないといけない気持ちはbashからくる感覚かもしれない。

"'" # これはOK

'"' # これもOK

f"aaa'" # これはOK

f'aaa"' # これもOK

secretsデータベース名がわかっている

CTFの問題ではデータベース名を特定するところから始める必要がある。

エラーベースSQLi

エラー文で環境の情報も分かってしまうので、発生したエラーをそのまま投げるのは良くない。

Timeベースはwebだけではない

revで、命令数ベースで深いネストに入っていることをperfを用いて判定することがあり、これも一種のTimeベースのように見做せる

SQLiって問題作るの大変そう

データベースが破壊されると困る、SLEEP使ってDoSされると困る、みんなの環境を分けないと、掲示板にFLAGがポンと出てくるとまずい。

Second Order SQL Injection

CTFの問題で、クエリログがDBに蓄積されてそのログを見に行くと色々情報が得られるタイプの問題があった