1. Welcome ☆
問題文の中に書かれているフラグを入力すれば成功
flag{abcd}
2. よいしょ、よいしょ ☆☆
これはシーザー暗号で暗号化されています。
このサイトを使うとすぐにフラグを見つけることができます
flag{Caesar_Caesar_Caesar_Caesar}
3. つーとん、つーとん ☆☆
つーとんから連想されるのは、電信。
フラグはローマ字になるのでアルファベットのモールス信号で解読します。
flag(morse_code_morse_code_morse_code)
4. 氷を溶かすように ☆☆
氷を溶かす=>解凍する=>zipを解凍する
flag{d715e102-4869-749e-76d3-2e6435b5bd3e}
5. 認証はどこで? ☆☆☆
ただのログインページに見えますが、どうでしょうか。
HTMLを見てみると次のコードがある事がわかります。
function login() {
const username = document.form.username.value;
const password = document.form.password.value;
console.log(username)
console.log(password)
if (username === "admin" && password === "admin123456") {
alert(`Login successful \nflag: flag{eeecafba-11ad-3779-67b8-5c98f699490b}`);
} else {
alert("Login failed");
}
}
if文でuserとpasswordを一致させて認証していることがわかります。
ログインページにadminとadmin123456を入力するとフラグがわかります
flag{eeecafba-11ad-3779-67b8-5c98f699490b}
6. ログインできますか ☆☆☆
またログインページです。一つ前の問題のようにHTMLを見てもなにもわかりません。
ログインページでアタックできる方法は色々ありますが、単純なのがSQLインジェクション
コードは次のようになっていて入力部分の内容を直接入力していることがわかります。
try {
const results = await db.query(`SELECT * FROM test where user='${req.body.name}' AND pass='${req.body.pass}';`)
await db.end()
console.log(results)
if (results.length !== 0 ){
res.status(200).json({ message: `ログインに成功しました。\nflag: ${process.env.FLAG}`});
}else{
res.status(401).json({message: `ログインに失敗しました`});
}
}
ユーザー名に
1'OR'1'='1'-- ;
と入力するし、パスワードに適当な文字列を入れるとフラグ入手
flag{9362c960-388d-c9d4-db85-15705f47d602}
ちなみに、ユーザー名に入力すると以下のSQLクエリ文が生成でき、
SELECT * FROM test where user='1'OR'1'='1'-- ; ' AND pass='${req.body.pass}';
「-- ;」によってパスワードのAND文が無効化され、userの条件式は常にTrueになるのでログインできるという仕組みになります
7. 本当に消えてる? ☆☆☆
Gitのレポジトリを使用した問題でした。
Gitはバージョン管理のソフトウェアで、一度コミットしてしまうと、
取り消しをしない限り消えないという仕様があります。
間違えて機密情報をのせてしまった場合、当該ファイルを消しても消えないのです。
問題に載せられていたgitレポジトリの2番めのコミットを見ると、flagが表示されます。
flag{8dd8ea2f-e76f-7d90-0d92-ed238abe5e3a}