😎 クラッキング ハッキング CTF 学習サイト
https://minegishirei.hatenablog.com/entry/2024/08/17/110233
データベースを利用したサイトの脆弱性で、攻撃者がSQL (構造化クエリ) を使用してサイトのデータベースをクエリまたは攻撃することができる場合、 これは SQL インジェクション (SQLi) と呼ばれます。
SQLiは壊滅的な影響を与える可能性があるため、攻撃者orバグハンターからすれば非常にやりがいがある攻撃です。
人気のRDSデータベースには、MySQL、PostgreSQL、SQLServer、Oracle などが存在しますが、一般的な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' ";
この場合、
name
にtest' OR 1=1 --
を入力password
にhello
を入力
した場合、クエリは次のようになります。
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 Rails、Django、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