私は現在、(技術者が作成した)学校のWebサイトに対してSQLインジェクション攻撃を行っています。残念ながら、問題のサイトに誰も案内できず、教師は必要に応じて知識を得るようにしてくれました。 なぜ私が答えを知りたいのかと尋ねられる前に、このサイトに対してテストする許可があります。 Webサイトに新しいユーザーを作成するための注入可能なunameフィールドであると思うものを見つけましたが、複数行のクエリを使用しようとすると、クエリの実行に失敗します。INSERTクエリを実行する前に、SELECTクエリを実行して確認しているようですunameがすでにシステムに存在する場合。
ユーザー名フィールドは、姓に一重引用符を付けて新しいユーザーを作成するかのように悪用可能であると想定しています。
uname: o'connor
次の冗長SQLエラーが表示されます。
OH DEAR - unable execute SQL query: SELECT * FROM usertable WHERE uname='o'connor'
しかし、セミコロンを使用して複数行のステートメントを実行しようとすると、実行に失敗します。次に例を示します。
uname: admin'; UPDATE usertable SET password='pass' WHERE uname='admin';
エラーが発生しました:
OH DEAR - unable execute SQL query: SELECT * FROM usertable WHERE uname='admin'; UPDATE usertable SET password='pass' WHERE uname='admin'; '
PHPスクリプトがPOSTデータを処理するスクリプトは、最後に単一引用符を追加するようですが、私の単一の引用符に達する前に、挿入されたクエリが実行されることを理解していました。複数行のクエリを適切に実行していますか?
**更新私も試しました:
uname: admin'; UPDATE usertable SET password='pass' WHERE uname='admin'; --
実行できないという同じ問題はありません。これらの列名とテーブル名はすべて正しいことを知っています。とにかく、元のクエリをテキストファイルなどに出力したり、結果が返されたときにページに出力されている値をパスワードに変更したりできますか?
私はPHPプログラマではありませんが、MySQLクエリをPHPで実行する場合、ほとんどの人はmysql_query()
PHPで複数のステートメントを実行することは可能です ただし、特定の手順を実行する必要があります 。
このコードを書いた人がmysql_query
を使用している可能性があります。これは、追加のSQLステートメントを挿入できないことを意味します。
SQLインジェクションはまだ可能ですが、はるかに限定されたレベルです。たとえば、次の値を渡すことにより、SQLをwhere句に挿入できます。
test' OR '1'='1
これはクエリを生成します:
SELECT * FROM usertable WHERE uname='test' OR '1'='1'
別のテーブルをクエリして結果を返すUNION句を追加することもできます。
test' UNION SELECT * from creditCardTable where uname = 'admin
これはクエリを生成します:
SELECT * FROM usertable WHERE uname='test'
UNION
SELECT * from creditCardTable where uname = 'admin'
お役に立てれば。
すべてのアプリケーションがスタックされたクエリを実行するという保証は絶対にありません。実際、古いext/mysql
拡張機能(これはまだPHPで一般的に使用されています)ではサポートされていません。
したがって、独自のクエリを追加するだけの「素朴な」攻撃は、ここでは機能しない可能性があります。おそらく、元のクエリ自体を使用する必要があります。ただし、WHERE
句を操作して別のユーザーをフェッチしたり、UNION
句を介して任意のデータを選択したり、INTO OUTFILE
句。