我正在努力理解这里在VulnHub的五酯实验室挑战。
在我将这教程翻译成英文之后,Exercise 2向我展示了以下SQLi,它完成了挑战:
http://pentesterlab/sqli/example2.php?name=root'/**/union/**/select/**/1,(select/**/name/**/from/**/users/**/limit/**/3,1),(select/**/passwd/**/from/**/users/**/limit/**/3,1),4,5/**/and/**/'1'='2/**/用于绕过过滤空间字符的WAF。
union select 1部分只显示在红色中圈出的数字1。
方括号( ... )用于语法上防止DBMS将限制部分误解为limit 3,1,select和limit 3,1,4,5,如果没有括号,这两者都是不正确的。
limit 3,1部件意味着在第三个结果之后,输出下一个结果,因此它得到一个名称和一个密码,用蓝色圈起来。
如果我的上述理解是正确的,我不明白为什么教程作者包括4,5部分,也不明白为什么他们包括'1'='2部分,评估为假?
发布于 2022-06-08 15:42:31
为什么他们包括'1'='2‘部分,计算为假
$sql .= $_GET["name"]."'";在上面的代码片段中,请注意,'被附加到$_GET["Name"]的末尾(所有这些都被附加到select命令中)。在该漏洞中,您将在名称(根)之后提供关闭的',因此您需要说明附加的'。要做到这一点,可以将and '1'='2添加到末尾,因此在追加'时,这是正确的语法。在伪代码中,这相当于“在第五列中,我希望将"true (5)和false (1=2)”的值设置为false (0)。当我测试该漏洞时,and值为true还是false并不重要。我猜这是为了防止任何带有真值的意外事件发生。
为什么教程作者包括4,5部分
TL;DR - SQL中的union操作符需要来自所有select语句的相同数量的列。users表有五列,因此联合选择需要五列。
The详细信息
从这个屏幕截图中可以看到,实验室中的users表有五列。

php脚本中的查询选择所有列:
$sql = "SELECT * FROM users where name='";
$sql .= $_GET["name"]."'";该漏洞正在使用SQL union运算符返回其他信息。联合之后的select必须有五列,因为users表有五列。当在SQL中执行union时:
进一步阅读它,php中的select正在填充第一行。联合后的选择正在填充第二行。它将填充第一列中的值“1”、第二列中的用户名、第三列中的密码以及第四列和第五列中的值“4”和“5”。
参考资料 MySql联盟
https://security.stackexchange.com/questions/262522
复制相似问题