问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
某客户关系管理系统代码审计
漏洞分析
PHP CMS 代码审计实战,RCE, SQL注入,任意文件删除,任意文件上传。
开始 -- 日常打开fofa, 确认目标后,右键检查页面源代码。没有版权信息无法确认是哪个cms. 确定特征值后再fofa(**这样找到源码的记录会大大提升**) ,翻来翻去, 找到了疑似官方演示站点。 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-e4688b877bae11d24449e117f34d48c8d4b0d691.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-e4688b877bae11d24449e117f34d48c8d4b0d691.png) 进行子域名收集, 收集到三个子域名 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-b923571b51f7383fb18ff3519ff82c7d7271eefc.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-b923571b51f7383fb18ff3519ff82c7d7271eefc.png) 先翻一翻. 在开源信息页面找到了项目提供的源码地址。 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-a9f9f291d5eb4a005afa9e63289cc95fc18a2d04.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-a9f9f291d5eb4a005afa9e63289cc95fc18a2d04.png) V1重复安装覆写配置文件导致RCE ----------------- 该cms用了低版本的 `mysql_connect` 语法. 我这里的PHP用了 `5.4.45`, 搭建好后不会自动跳转到安装页面. 只能手动跳转 `/install/`。 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-43211e368f93de3e51b5b3b929bee757309c36e5.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-43211e368f93de3e51b5b3b929bee757309c36e5.png) 正常安装一遍后, 我刷新页面. 再次进入了安装选项页面,可以再安装一次. 开始分析源码。 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-ed5d7340ff8818e1790667f9449e3cf8794a2c7b.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-ed5d7340ff8818e1790667f9449e3cf8794a2c7b.png) 看源码是有安装检测的. 但这个文件我却没找到, 目录中根本没有 `source`文件夹。 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-0b2db92c79aac410916d653d857317e1c70b7639.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-0b2db92c79aac410916d653d857317e1c70b7639.png) 获取到参数时,只是简单删除前后空字符. 没有验证消毒等操作(往后也没有)。 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-e8bd8a2eff41564371b64dcfd325301d4d9b0082.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-e8bd8a2eff41564371b64dcfd325301d4d9b0082.png) 整个配置文件内容定义在 `$config_contents` 变量中( `<?php return array(); ?>` ), 参数也只是普通的字符串拼接起来, **参数可控,如果能逃逸就rce了**。 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-70aff52ecb564fffa98f8eec653bf2dc2adfbd37.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-70aff52ecb564fffa98f8eec653bf2dc2adfbd37.png) 这里选择从数据库名称`$dbname`下手, 服务器连接地址, 数据库用户名密码不好用特殊字符, 而数据库会检测是否存在如果不存在就会创建, 但是创建数据库这里也没法使用特殊字符。 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-025229bdc4fdad365e9359a874eb4fa572027a8c.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-025229bdc4fdad365e9359a874eb4fa572027a8c.png) 除非数据库名称用反引号包裹 ```sql create datab ase `datab ase name`; create datab ase `test'1`; ``` **准备一个远程 `mysql`服务器, 创建好特殊名称的数据库. 然后重新安装站点** ```sql CREATE DATAb ase `'.e val($_GET[333])//`; ``` [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-5034e0b4817c9a5ec57feaf6596d1fdf6adb79fa.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-5034e0b4817c9a5ec57feaf6596d1fdf6adb79fa.png) 安装成功. [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-4a00916c72edf6b37017311389203a4b98190265.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-4a00916c72edf6b37017311389203a4b98190265.png) 打开页面,`_mkdir()`方法未定义 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-605d5ba55f98462af064914ebfb0118162697e34.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-605d5ba55f98462af064914ebfb0118162697e34.png) 非常幸运, `_mkdir()`的调用,在 `e val`的后面. [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-064e662419bafb62d47033e8b5ff0da7654e3eec.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-064e662419bafb62d47033e8b5ff0da7654e3eec.png) 跳转到定义函数, 复制函数的定义的语法就好了. 不用复制函数内容 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-454713c347168a3ce17cf3a53208db63c8861083.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-454713c347168a3ce17cf3a53208db63c8861083.png) payload 如下 ```php function _mkdir($dir,$mode=0777){};system('whoami'); ``` [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-5ed732d0e93a2e3de621cc58e6fb2bac27474294.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-5ed732d0e93a2e3de621cc58e6fb2bac27474294.png) V2任意文件删除漏洞+安装覆写配置文件导致RCE ------------------------ ### 配置文件覆写导致RCE 初打开页面后是个报错. 丢失`Config.php`盲猜是没有安装所以没有生成该文件。 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-b07bcc00a426c80d8080a8f6a504e006317d3e94.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-b07bcc00a426c80d8080a8f6a504e006317d3e94.png) 手动跳转 `/install/`, 这次有安装检测了. 安装的话需要先删除`install`目录下的`lock`文件 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-76f0e0352e6ae48d31846b55cc6351e4362b74d9.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-76f0e0352e6ae48d31846b55cc6351e4362b74d9.png) 打开`/install/index.php`, `write_config()`是写入配置的函数. 依旧是没有进行任何过滤消毒. 和`V1`不同的是他这次不采用字符串拼接的方式了. 而是使用替换, 配置文件的目录改为`/ERP/Config/Config.php`了。 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-2aaeedbca55c37d883b58279fc75dadce4d6beeb.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-2aaeedbca55c37d883b58279fc75dadce4d6beeb.png) 看一下文件模板`/install/data/config.php`,虽然改成替换字符. 但没有验证消毒等操作. 问题还是存在的 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-bb6f3fabb95895acf4a085729b8a170699039f7e.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-bb6f3fabb95895acf4a085729b8a170699039f7e.png) 而且在 `/install/index.php` 111行中创建数据库的语句加上了 反引号, **输入特殊字符也能执行成功. 不需要提前准备数据库了** [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-973e26661aac2f4d4563f30903bd1f7e91b78836.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-973e26661aac2f4d4563f30903bd1f7e91b78836.png) 删除`/install/lock`文件, 尝试安装, 验证是否存在漏洞 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-748f536182c70a7b25c88c5abf24be71d2720189.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-748f536182c70a7b25c88c5abf24be71d2720189.png) 使用和V1同样的payload, 成功执行 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-99e0b98da4adcf3680b9ebd929a21198bdd5d581.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-99e0b98da4adcf3680b9ebd929a21198bdd5d581.png) 这时如果有办法删除`/install/lock`文件, 就可以无条件RCE了 ### 任意文件删除漏洞 全局搜索`unlink`由是这个`Upload.class.php`, 可以看到只是拼接了一个 `.` 而非`./`,所以并没有做到对路径的限制。 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-eaf595f7a956fb988a80680bbaf76874ef23c35a.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-eaf595f7a956fb988a80680bbaf76874ef23c35a.png) 跟进 `_REQUEST()`方法, 够方便的...,如果`GET`中没有数据, 那就在`POST`中拿数据。 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-a6785148e98dfbdab4c35c7ebdef1c394fbd1f33.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-a6785148e98dfbdab4c35c7ebdef1c394fbd1f33.png) 跟进`unlink_file()`方法, 还是没有对参数进行验证,简单判断文件是否存在就执行`unlink()`删除文件了 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-759e92ec0a78c4e3edda1bddd1ea16c90325e8da.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-759e92ec0a78c4e3edda1bddd1ea16c90325e8da.png) `dir_replace()`方法只是修理一下目录分割符。 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-12fdda34ea6cc45973c50ea56f1bbbe7feb91690.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-12fdda34ea6cc45973c50ea56f1bbbe7feb91690.png) 尝试访问`index.php/Upload/upload_img_remove/`, 存在未授权访问. 报错是因为没法删除 `.`, [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-0ba453b5faa10108376426d4744b00c27c8daeff.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-0ba453b5faa10108376426d4744b00c27c8daeff.png) ### 组合RCE 访问`/index.php/Upload/upload_img_remove/?imgfile=/install/lock`, 成功删除`/install/lock`文件 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-3d63c2a84c9355318dd583ffaf8a7834f59383ef.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-3d63c2a84c9355318dd583ffaf8a7834f59383ef.png) 再次访问`/install/`, 成功进入安装界面。 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-5b753023541a035507081f31f1f457dc183024b4.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-5b753023541a035507081f31f1f457dc183024b4.png) 再次安装站点,和`V1`一样的数据库名称. 但这次不需要自己创建了。 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-0e27d3d56fda7d14f28fc95126ae20a35ba897de.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-0e27d3d56fda7d14f28fc95126ae20a35ba897de.png) 成功。 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-7a7770e4c713e0f030ffde53258e844b48a3030f.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-7a7770e4c713e0f030ffde53258e844b48a3030f.png) (V1、V2)SQL注入漏洞(同一个数据库抽象类) ------------------------- 整个cms, SQL语句和参数几乎都是用字符串拼接的. 而且是拿到参数后直接拼接. 没有任何验证消毒等操作。 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-bc00acaa278e3d5893f6a8cd794af1e59850046f.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-bc00acaa278e3d5893f6a8cd794af1e59850046f.png) 跟进`Framk/Datab ase.class.php->Datab ase->findAll()`方法, 使用了`PDO`,但同样都没有过滤直接将拼接好的SQL语句去执行, [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-cb3d7e57c077afb7380ab1d87f0dd9966a963c4e.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-cb3d7e57c077afb7380ab1d87f0dd9966a963c4e.png) [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-1dbe985f201a7e4f1e18b653f3b09cbdc92fed65.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-1dbe985f201a7e4f1e18b653f3b09cbdc92fed65.png) 直接就可以用sqlmap打穿. 密码还是明文存储的。 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-aea016ffbc9e06d17f38670f9e8a46a350461823.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-aea016ffbc9e06d17f38670f9e8a46a350461823.png) (V1、V2)未授权访问任意文件上传漏洞(同一个基类)· ---------------------------- 全局搜索`move_uploaded_file`发现了, `Crm/Action/Upload.class.php->Upload->upload_img_save()`. 他分离了文件名和后缀名并没有验证. 而是重新生成文件名后拼接原本的文件后缀. 121行的 `$pictype` 也没有进行验证。 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-723bd2cd842a9f20f4157ae50a54ec58a1f14cb9.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-723bd2cd842a9f20f4157ae50a54ec58a1f14cb9.png) 根据他的路由习惯, 直接访问 `/index.php/Upload/upload_img_save/`,直接为我们写好了html [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-187cef4489f0a5112dc4c506765f8f7f0a2f2ed2.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-187cef4489f0a5112dc4c506765f8f7f0a2f2ed2.png) 上传个`phpinfo()`,试一下. 上传成功后路径有回显 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-64e4eadf999a6037a4e7ff69bbb7a2ec25f79649.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-64e4eadf999a6037a4e7ff69bbb7a2ec25f79649.png) 成功解析 [![](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-60ac7bf256787f92c6c83698af95fedb5821d8ce.png)](https://shs3.b.qianxin.com/attack_forum/2021/07/attach-60ac7bf256787f92c6c83698af95fedb5821d8ce.png)
发表于 2021-07-28 12:04:30
阅读 ( 6382 )
分类:
代码审计
1 推荐
收藏
4 条评论
soufaker
2021-08-02 14:34
其实你里面打码没打好我都看到是啥了系统了。。
请先
登录
后评论
soufaker
2021-07-28 17:26
非常不错的审计流程,学习了=-=
请先
登录
后评论
soufaker
2021-07-28 17:26
可以留下源码地址嘛,我也想去搞一波做做笔记
请先
登录
后评论
JOHNSON
2021-07-30 17:32
不合规矩吧...
请先
登录
后评论
请先
登录
后评论
JOHNSON
12 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!