はじめに
CTF学習のため、cpawというサイトの問題を解いていく記事です。
今回はLevel3前編(2問しかありませんが...)解いていきます。
この記事の対象者
- CTF超初心者
- cpawの問題を解いてみたい人
問題一覧
Q24. [Web] Baby's SQLi Stage 2
SQL文書く問題
Level2前半で解いた Q22.[Web] Baby's SQLi Stage 1の続編です。
Stage1を解いた際に出てきたnext stage urlからStage2を始められます!
この問題ではSQLインジェクションの常套手段的なものを使うようです。
SQLインジェクション:不正なSQLでデータベースに意図しない操作をさせる攻撃
【 考え方 】
パスワードがわからなくてもSQLが通るなら、php側に"パスワードは正しい"と
解釈させれば良いので、どうやっても値が「真」になるSQLを入力してやりましょう。
SQL大ヒント
使いそうなものたち
'
:ここから始まると入力文字がSQLとして解釈されるOR
AND
: 条件式を与える' '=' '
:' 'の中に何かを入れて常に成り立つ等式を作る--
:残りのSQLを無効化して構文エラーを防ぐ
これらをいい感じに組み合わせればSQLインジェクション体験ができます!
flag見つけるSQL文
' OR '1'='1'--
これを入力することで、常に値が真になり、
パスワードなしでもログインできてしまいます!
ちなみに'1'='1'ではなく'a'='a'などでも問題ありません。
入力できるとぱろっく先生を捕獲でき、感謝状とともにflagをもらえました!
flag
cpaw{p@ll0c_1n_j@1l3:)}
Q26. [PPC] Remainder theorem
合同式を解く問題
合同式を解いて解を求めましょう!
ソースコードにはPythonとCの2パターンのプログラムを記載しておきます。
x ≡ 32134 (mod 1584891)
x ≡ 193127 (mod 3438478)
x = ?
求めるソースコードと解説
i×a+b≡c(mod m)
における最小の解を探索します。
- a = 1584891
- b = 32134
- c = 193127
- m = 3438478
最終的にx=i⋅a+b
を求めていきましょう。
i = 0
while True:
i = i + 1
x = i * 1584891 + 32134;
if x % 3438478 == 193127:
print(x);
break;
C言語の方は、数値が大きいので
long long型
という64ビット格納できる型を使用します
#include <stdio.h>
int main(){
long long x = 0;
for(long long i=0; ; i++){
x = i * 1584891 + 32134;
if(x % 3438478 == 193127){
printf("%lld", x);
break;
}
}
return 0;
}
ここで出力された値がflagです。
flag
cpaw{35430270439}
おわりに
第5回目はLevel3の2問について解説しました。
個人的にはSQLインジェクションの問題がとても面白くて好きでした。
次回がcpaw攻略最終回になると思います!