初学万能密码代码审计

332 阅读2分钟

今天我们来分析一个密码重置漏洞的靶场
文章很水本人白盒实在太菜
第一次的代码审计 谢谢各位大佬指点
我们搭建这个靶场 用到的工具phpstudy
下载靶场 然后放在phpstudy域名站点管理里面

端口随意 只要不是80就行了
然后访问这个网址 www.a.com:3456

我们访问这个靶场的后台
因为这个是存在密码重置漏洞的 我们直接使用 ‘ or 1# 登录来抓包

我这边使用的是或火狐插件 live HTTP headers 来抓包的 网上有xpi 可以直接安装
抓到包之后 我们把这个参数复制下来:
user_name=11111&user_pass=1111
www.a.com:3456/checkUser.p…
因为我这块抓了两次包 所以前面图片上的网址不是真正的网址 www.a.com:3456/checkUser.p… 这个才是
我们点击这里:

点击split URL 然后会出现这个用户名或者密码错误
我们使用万能密码: ‘or 1#

把万能密码放到用户名这块然后点击 split URL登录
直接登录成功
为什么导致这样子呢?
我们直接看源码

我这边用的是这个Pycharm 你们也可以使用别的编译器
我们找到这个文件 checkUser.php 这个文件
然后我们可以看到 if(isset(\_POST\[“user\_name”\]) && isset(_POST[“user_pass”]))
Isset函数是检测变量是否设置 若变量不存在则返回False
我们可以看到password=md5(password = md5(password); 这个是加密的
我们可以试试将万能密码放到密码那里

明显是不可行的
我们可以看到这边执行了sql语句 并赋值给了sql 我们可以使用vardump来打印出来 [![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/57479ad0401f4e68b9850ab3df9c7342~tplv-k3u1fbpfcp-zoom-1.image)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-f8d1f243320bd98e846a5230da549a073e766fe3.png) 我们在前台执行看看: [![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/052fc8b16d2d4bbfad52762e3c9f0150~tplv-k3u1fbpfcp-zoom-1.image)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-d91683dab73119e1c438604646ec71ea876c3946.png) 这是登录成功的sql语句: string(98) “select * from users where user\_name=’xxxx’ or 1#’ and user\_pass=’6512bd43d9caa6e02c990b0a82652dca’” 这是登录失败后的sql语句就是把万能密码加在密码那里: [![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/49d9f692a2c347d3a39855b1aaaa323a~tplv-k3u1fbpfcp-zoom-1.image)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-5af5c4cc326a4ee3c6552ec30aaa1ce4f152e175.png) 我们可以使用sql命令行来执行一下: [![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5dea0b0fcc4a4645b2121b58215eb6cb~tplv-k3u1fbpfcp-zoom-1.image)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-2ff246ee3de32fd85e3e29afd887ca6f85657a32.png) 这个是直接可以执行成功的 我们继续往下看: [![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6202d1b8493046638002c1868c9f3a6a~tplv-k3u1fbpfcp-zoom-1.image)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-ab9740f567280521190b97b3d2fee7b1fb8cc1ac.png) 这里new 了一个mysql对象 我们直接查看类 [![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/297d225855ee4a7db158982f620a5215~tplv-k3u1fbpfcp-zoom-1.image)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-d2627c1b0801ea57a374a2b096bb9cde1e2e637c.png) 在lib目录下的mysql.class.php 这里是一个类 [![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d21bec564f9047a38dfd49ca97c06268~tplv-k3u1fbpfcp-zoom-1.image)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-b69d720de7f2debb0616a7090537b905194b4bac.png) 直接看查询数据的地方 这里是查询单行 res = this>link>query(this->link->query(sql);
row=row = res->feach_assoc();
这里是查询数据库 它定义了一个函数 public 是修饰符
Fetch_assoc 这个是查询单行 就是查询一行

我们继续用vardump来看一下

它返回的是3条数据
前面它使用了feach_assoc(); 每次查询一条数据
你们可以去实验一下 使用万能密码登录用户的时候,他是第一条数据 不是后面的数据,这次简单的代码理解就到这里
因为实在不会白盒只能水文章了呜呜呜呜呜