为什么sqlmap在我的代码中找不到SQL注入?

信息安全 php sql注入
2021-08-29 19:17:39

我在我的开发 PC 上安装了XAMPP,并启动了 Apache HTTP 服务器和 MySQL。

自带测试页面“CD合集”,后端PHP代码如下:

mysql_query("DELETE FROM cds WHERE id=".round($_REQUEST['id']));

我不是 PHP 专家,我猜这个round电话是为了防止 SQL 注入。所以我将它从 PHP 代码中删除,留下以下内容:

mysql_query("DELETE FROM cds WHERE id=".$_REQUEST['id']);

我验证了我可以修改URL中的查询参数对数据库做任何我喜欢的事情,所以肯定存在SQL注入漏洞。

现在我试图用它sqlmap来查找SQL注入漏洞。我这样运行它:

python sqlmap.py -u "http://127.0.0.1/xampp/cds.php?action=del&id=14"

但它返回以下内容:

[16:01:47] [WARNING] GET 参数 'id' 不可注入 [16:01:47] [CRITICAL] 所有参数均不可注入,尝试增加 --level/--risk 值以执行更多测试。在不提供 --te chnique 开关的情况下重新运行。如果目标页面的文本内容百分比较低(约 15.27% 的页面内容是文本),请尝试使用 --text-only 开关

知道我可能做错了什么吗?

4个回答

您的服务器很可能不会显示任何错误/警告。Sqlmap 尝试注入类似 sql inj. 的有效负载并观察 webapp“状态”。由于 sqlmap 无法访问您的易受攻击的代码或数据库内容,它只能通过观察 webapp 行为来猜测潜在的漏洞——在这种情况下是“视觉”行为(没有警告/错误——没有潜在的 sql-inj。)。

但是,sqlmap 给了你很好的提示:尝试增加级别/风险值:

    python sqlmap.py -u "http://..." --level=3 --risk=3

更改后,您将增加有效负载的数量(发送到您的 web 应用程序),您会发现盲目的 sql.inj!。这意味着在级别 3(和 --risk=3)上,sqlmap 不仅仅检查“可见”效果。它使用一些耗时的操作 [BENCHMARK()] 来延迟服务器响应,如果 sql. 注射。发生。

您是否必须登录 Web 应用程序才能访问该页面?如果是这样,则 sqlmap 没有您的身份验证 cookie,因此您可能需要使用--cookie=....

我对sqlmap没有太多经验,但是我注意到网上的一个网页声称sqlmap 0.9不可靠,最新的开发版本更可靠这是你可以尝试的另一件事。

总是很明显:您是否尝试过它在您引用的输出中提出的建议?

1)请使用我们存储库中的最新版本(从您给定的输出来看,很明显您使用的是较旧的 v0.9 - 到那时很多事情都发生了变化):
$ svn checkout https://svn.sqlmap.org/sqlmap/trunk/sqlmap sqlmap-dev

2) 错误消息对于 sqlmap 的检测不是必需的(就像在其他“工具”上一样)。Sqlmap 找到了如何注入一些东西来使用它的方法,它并不是“只”寻找错误消息(这不能证明任何事情)

3)当你确定它应该是可利用的(例如--level=3 --risk=3)时增加级别/风险,但在大多数非OR情况下,默认级别/风险应该足够了

亲切的问候,
米罗斯拉夫·斯坦帕

来吧堆栈交换!真的吗?这太容易回答了!再看看:

id=".round($_REQUEST['id']));

看到了吗?您的 SQL 注入正在被排除在外!PHP 正在将“0 OR 1 = 1;--”四舍五入为 1。删除 round 函数并整夜破解自己。