脆弱性についてまとめてみるぼっちアドベントカレンダー4日目の記事です。最近バグバウンティやCTFをやりたいと思っているのでHackerOneのレポートを読んでみたり実際の活用方法がわかるように心がけています。
SQL Injectionについて
データベースへアクセスする言語SQLに対して不正な文を挿入することによってデータベースの内容を不正に取得したり改竄するのがSQL Injectionです。
下記のようにただただ文字列を連結させてSQL文を作成し実行している場合によくSQL Injectionは起きます。
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = $mysqli->query($sql);
if ($result->num_rows > 0) {
echo "Success login from" . $username;
} else {
echo "Failed Login";
}
このような場合任意のユーザー名にパスワードを' OR '1'='1とするだけで任意のアカウントにログインできてしまいます。
SQL Injectionの悪用について
わかりやすいものではまずアカウント乗っ取りです。認証をバイパスできるためパスワードを知らずともログインすることができてしまうことがあります。また他のユーザーのパスワードを強制的に変更したりなどもできます。
次に情報漏洩でデータベースのすべてのデータを出力してしまうかもしれません。
またDBMSによってはOSコマンドの実行ができる場合もあります。これによりデータ流出や改竄だけでなく同じネットワーク内の他のサービスに影響を与えることができます。
SQL Injectionの対策について
SQL Injectionの代表的な対策はプレースホルダを利用することです。
SQL文中の変数を埋め込みたい場所にプレースホルダを指定してあとから変数を機械的に連結する仕組みでSQL Injectionの可能性を限りなく下げます。
またデータベースサイドで必要以上の権限を与えないというものもあります。これはSQL Injection自体を防ぐ訳ではありませんがSQL Injectionが起きてしまった際の影響範囲を縮めることができ必須です。
HackerOneレポート
実際にどのような場所でSQL Injectionが起こるのかを少しでも理解するためにHackerOneレポートを読んでみました。
1, SQL Injection Extracts Starbucks Enterprise Accounting, Financial, Payroll Database
リンク: https://hackerone.com/reports/531051
このレポートはStarbucksに提出されたSQL Injectionに関するレポートです。
サブドメイン列挙で見つけたファイルアップロードフォームを利用することでSQL Injectionが成功しました。
最初は見つけたフォームをリバースシェルなどを試していましたがサーバーサイドでXMLとして処理していることがわかり次はXXE攻撃などを考えました。しかし脆弱性は見つからなかったようです。
一ヶ月ぐらいしてからふとXMLがSQLの入力に使われている可能性を考えSQL Injectionの調査を始めたところ見つけることができました。
バックエンドで利用していたSQLサーバーはMicrosoft Dynamics AXで利用していたもので数千のテーブルがあり実際の会計情報も含まれていたようです。
このレポーターは最後にまとめをしていてファイルアップロードできるからと言ってリバースシェルだけに注目してはいけないことやメモをとり再調査する必要性を書いていました。
上の二つは本当に共感で固定観念に惑わされないのとふと思いつくことを考えたらメモは大事だなと思いました。
2, SQL injection in GraphQL endpoint through embedded_submission_form_uuid parameter
リンク: https://hackerone.com/reports/435066
このレポートは文書化するためにHackerOne内部のユーザーがHackerOneに対して作成したレポートです。embedded_submission_form_uuidというGraphQLエンドポイントで得た入力を不十分なサニタイズをした上でPostgresqlに流していたようでSQL Injectionになりました。
この脆弱性が見つかった引き金はアプリケーションで例外が発生しているため調査したら見つかりました。ログの監視基盤は大きめのところだとあると思いますが自宅鯖にもやっぱ導入したくなってきますね。