SQLインジェクションとは?

😎 クラッキング ハッキング CTF 学習サイト

https://minegishirei.hatenablog.com/entry/2024/08/17/110233

データベースを利用したサイトの脆弱性で、攻撃者がSQL (構造化クエリ) を使用してサイトのデータベースをクエリまたは攻撃することができる場合、 これは SQL インジェクション (SQLi) と呼ばれます。

SQLiは壊滅的な影響を与える可能性があるため、攻撃者orバグハンターからすれば非常にやりがいがある攻撃です。

人気のRDSデータベースには、MySQLPostgreSQLSQLServerOracle などが存在しますが、一般的なSQLiの概念はすべての データベースに適応可能です。

サンプル

多くのウェブサイトは、情報を保存するためにデータベースに依存し、その情報を使用して動的にコンテンツを生成します。 もっと簡単に言えば、ほとんど全てのアプリケーションはデータをCRUDしているだけです。

以下の例では、ユーザー一覧から特定の名前のユーザーを取得しています。

$name = $_GET['name'];
$query = "SELECT * FROM users WHERE name = '$name' ";
mysql_query($query);

このコードは、$_GET[] を使用して、URLパラメーターで指定された名前の値にアクセスし、その値を $name 変数に格納します。 その後、パラメーターはサニタイズされることなく $query 変数に渡されます。 $query 変数は実行するクエリを表し、name列が URL パラメーターの値と一致するユーザーテーブルからすべてのデータを取得します。

サイトは name に通常のテキストが含まれることを期待しています。(鈴木example@mail.comなど) しかし、ユーザーが悪意のある入力 test' OR 1='1 を URL パラメーターに入力した場合、例えば、https://www.example.com?name=test' OR 1='1 のように、実行されるクエリは次のようになります

$query = "SELECT * FROM users WHERE name = 'test' OR 1='1' ";

この場合、OR句が評価されてしまうので、意図していない入力でもエラーが出てしまいます。

パスワード

同様のことが、パスワードを使ったログイン画面でも起きる恐れがあります。

以下の例では、一般的なwebアプリケーションの認証用コードですが、SQLiが可能です。

$name = $_GET['name'];
$password = mysql_real_escape_string($_GET['password']);
$query = "SELECT * FROM users WHERE name = '$name' AND password = '$password' ";

この場合、

  • nametest' OR 1=1 --を入力
  • passwordhelloを入力

した場合、クエリは次のようになります。

SELECT * FROM users WHERE name = 'test' OR 1=1 --' AND password = 'hello'

これでは、passwordにいかなる値が入ろうとも、 --コメントアウトされてしまうので認証チェックが行われません。

SQLi に対する対策

SQLi を防ぐための保護策の一つは、プレペアドステートメントの使用です。 プレペアドステートメントの使用によりクエリが動的に実行されなくなるため、SQLi に対する保護となります。

$stmt = $dbh->prepare('SELECT * FROM users WHERE name = :name');
$stmt->bindValue(":name","てすと太郎",PDO::PARAM_STR);
$stmt->execute();

https://qiita.com/wakahara3/items/d7a3674eecd3b021a21e

Ruby on RailsDjango、Symphony などのウェブフレームワークも、SQLi を防ぐための組み込みの保護を提供しています。 しかし、これらは完璧ではなく、すべての脆弱性を防ぐことはできません。

SQLインジェクションの攻撃例

https://minegishirei.hatenablog.com/entry/2024/08/17/110237

https://minegishirei.hatenablog.com/entry/2024/08/14/095756

page:https://minegishirei.hatenablog.com/entry/2024/08/26/171838