web-dev-qa-db-ja.com

SQLインジェクションの変更/テーブル値の挿入

この場合、MySQLデータベースのフィールドを更新するか、SQLインジェクションを使用して新しい行を挿入することは可能ですか?

  1. PHP=コードの唯一の保護はmysql_real_escape_string()です。
  2. クエリは二重引用符で構成されます:_"select id from db where id = $id"_単一文字列リテラル引用符ではありません。
  3. データベースはmysql(mysql_query php呼び出しを使用)なので、スタックされたクエリは可能ではないと思います(間違っている場合は修正してください)。
  4. Mysqliではなくmysqlを使用します。

私は運の悪い_1; update users set first_name = foo_のようなものを使ってみました、そして運のない16進数と8進数形式でコンマ_'_を渡そうとしました:chr(0x27)char(0x27)chr(047)ASCIIテーブル

これらの条件下で実際に更新または挿入することは可能ですか?

5
Crizly

クエリのスタッキング、つまり_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 は依然として関連性があり、これらの攻撃などをカバーしています。

2
rook

select intoSELECT id FROM table1 WHERE id = 1 INTO table2を使用することは可能かもしれませんが、攻撃者がid値を直接制御しないため、攻撃者が意味のある攻撃を行うには、このデータを制御する別の方法が必要になります影響。

2
wireghoul