4

DBからデータをフェッチするために、phpファイルの1つに以下のコードを記述しました。

$products = $this->db->get_rows('SELECT * from products WHERE shop_id='.$_SESSION['shop_id'].'AND tags,title,text LIKE \'%'.$_POST['search'].'%\'');

問題ありますか?LIKE演算子を注入できるということですか?

編集済み

この方法で注入する例を提供してください

4

4 に答える 4

10

すべてのオペレーターは、バインドせずに注入できます。

$_POST['search'] = "1%'; DROP TABLE myTable LIKE '%";

なるだろう

.... AND tags,title,text LIKE '%1%'; DROP TABLE myTable LIKE '%%'

パラメータをバインドする方法を読んでください。

于 2013-03-22T21:13:05.240 に答える
2

もちろん、これは注入することができます、あなたはあなたの入力を消毒する必要があります。現在、生の投稿データを取得してSQLステートメントに挿入しています。

POSTデータは、mysql_real_escape_stringなどのようなデータサニタイズを実行する必要があります。

または、少なくとも準備されたステートメント。サーバー側のコードに任せてください。

于 2013-03-22T21:12:59.703 に答える
1

これは本当に悪いです。変数を消去またはチェックせずに SQL ステートメントにプルすることは、pwnd を取得するための良い方法です。人々がコードに挿入できるものはいくつかあります。注意すべきもう 1 つのインジェクション メソッドである 1=1 は、常に true を返します。

$products = $this->db->get_rows('SELECT * from products WHERE shop_id='.$_SESSION['shop_id'].'AND tags,title,text LIKE \'%'.$_POST['search'].'%\'');

//This example expects no result from the table initially so we would blind attack the DB to pull the admin record.
$_POST['search'] = "-1\'; union all select * from users limit 1;";

誰かがデータベースの最上位アカウント (管理者など) を呼び出します。

$user_id = $this->db->get_rows('SELECT * from users WHERE email="'.$_POST['email'].'" and password="'.$_POST['password'].'"');

//This always returns true so now I'm the admin again
$_POST['password'] = "x\' or 1=1 limit 1";

また、画面に印刷する内容にも注意する必要があります。

$user_id = $this->db->get_rows('SELECT * from users WHERE email="'.$_POST['email'].'" and password="'.$_POST['password'].'"');

「$_POST['email'] のユーザー名が存在しません」というエコー メッセージは、別のものに置き換えることができます。

$_POST['email']=";

$fp = fopen('index.php', 'w');
fwrite($fp, \"header('Location: http://badwebsite.com;');\"; 
fclose($fp);";

index.php は、感染したページが存在する、またはサイト上の感染したページが存在する別の Web サイトにアクセスする可能性があります。

ID をチェックしている場合は、次のようにします。

if(preg_match('!^[0-9]$!',$_POST['id'])){
    $id = $_POST['id'];
} else {
  //flush
}

または可能なレコードの数を数えます... 1 つだけを期待していて、DB 内のすべてのレコードを取得する場合、それはインジェクションの試みです。

 if(is_numeric($_POST['id'])){
    $id = $_POST['id'];
    $count = mysql_result(mysql_query("select count(*) from users where id='$id''),0);
 }
于 2013-03-22T23:19:27.123 に答える