この場合、MySQLデータベースのフィールドを更新するか、SQLインジェクションを使用して新しい行を挿入することは可能ですか?
"select id from db where id = $id"
_単一文字列リテラル引用符ではありません。私は運の悪い_1; update users set first_name = foo
_のようなものを使ってみました、そして運のない16進数と8進数形式でコンマ_'
_を渡そうとしました:chr(0x27)
char(0x27)
chr(047)
ASCIIテーブル 。
これらの条件下で実際に更新または挿入することは可能ですか?
クエリのスタッキング、つまり_select * from tbl; update ... --
_は、ほとんどのデータベース管理システムで禁止されています。 PHP/MySQLでクエリのスタックを有効にするには、アプリケーションでmysql_mutli_query()
関数を使用してクエリを実行する必要があります。この機能は一般的ではありません。
クエリスタックなしのSQLインジェクションでは、攻撃者はアクセス可能なクエリ演算子とSQL関数によって制限されます。ツール SQLMap を使用すると、攻撃者は使いやすいシェルでSQLインジェクションによって公開された機能にアクセスできます。 SQLインジェクションの脆弱性の例は多分 ブラインドSQLインジェクション であり、SQLMapで悪用される可能性があります。
MySQLでは、攻撃者はunion selectを追加して他のテーブルにアクセスできます。
_select id from db where id = 1 union select password from users
_
または副選択:
_select id from db where id = (select password from users)
_
さらに、攻撃者はload_file()
関数を使用してファイルを読み取る可能性があります。
_select from db where id = load_file('/etc/passwd')
_
Selectステートメントのみが_into outfile
_クエリ演算子を使用できます。
_select from db where id = 1 union select password from users into outfile '/var/www/backup.txt'
_
_into outfile
_演算子は単一引用符の使用を必要とし、mysql_real_escape_string()
が使用されている場合、SQLインジェクションエクスプロイトでは使用できません。
論文 Hackproofing MySQL は依然として関連性があり、これらの攻撃などをカバーしています。
select intoSELECT id FROM table1 WHERE id = 1 INTO table2
を使用することは可能かもしれませんが、攻撃者がid値を直接制御しないため、攻撃者が意味のある攻撃を行うには、このデータを制御する別の方法が必要になります影響。