Online Railway Reservation System 1.0 代码审计
起初是做nu1招新赛的时候审的cms
关于这个cms,网上有5个公开的漏洞,其中有4个目前仍然没有补丁
Online Railway Reservation System 1.0 - 'id' SQL Injection (Unauthenticated)
Online Railway Reservation System 1.0 - Remote Code Execution (RCE) (Unauthenticated)
Online Railway Reservation System 1.0 - Admin Account Creation (Unauthenticated)
还有一个nu1l挖的https://github.com/nu11secur1ty/CVE-nu11secur1ty/tree/main/vendors/oretnom23/2022/Online-Railway-Reservation
这里跟一下rce的(Online Railway Reservation System 1.0 - Remote Code Execution (RCE) (Unauthenticated)),源码下载https://www.sourcecodester.com/sites/default/files/download/oretnom23/orrs.zip
Remote Code Execution (RCE) (Unauthenticated)
环境搭建
一个php+mysql的cms,所以直接按照教程搭建就行,源码下载,mysql新建数据库,导入sql ,然后在initialize.php修改server,mysql账密,baseurl
环境搭好后类似这样:
分析以及利用
有个rce,详情:https://www.exploit-db.com/search?q=Online+Railway+Reservation+System+1.0+
我们跟一下
先发poc
随后可以在index这看到
跟下
首先我们get传参传进来action
这样会使其new SystemSettings() 并且调用update_settings_info()方法
进去update_settings_info
注意到这里其实会对post的请求进行一些拆解
这个地方以遍历数组的方式,把content里的键值对进行遍历,可以看到我们是这样构造的
所以$k是welcome,$v是红色部分的代码
之后file_put_contents就可以覆写文件,比如可以写个shell
虽然注意到文件后缀必须得是html,但是文章有多处php include html的迹象
index包含home.php
home.php包含welcome.html
可以理解为不合理的include以及随意编辑html使得这个漏洞得以存在
条件
虽然这个漏洞无需管理员,但是file_put_contents仍然需要对网站目录具备写权限,此外,由于写文件还必须只能是.html为后缀的,所以并不是完美的rce
Remote Code Execution (RCE) based on Include any php file (Unauthenticated)
之前因为这是一个自己挖的0day,所以加密了,现在改为公开,已经提交厂商并通过确认,目前正在申请cve和exploit-db认证
环境搭建
源码:https://www.sourcecodester.com/sites/default/files/download/oretnom23/orrs.zip
此外,触发此rce还需要一个条件,就是环境有装pecl。
pecl是PHP中用于管理扩展而使用的命令行工具,而pear是pecl依赖的类库。在7.3及以前,pecl/pear是默认安装的;在7.4及以后,需要我们在编译PHP的时候指定--with-pear
才会安装。
不过,在Docker任意版本镜像中,pcel/pear都会被默认安装,安装的路径在/usr/local/lib/php
。
所以在docker环境下大多能触发rce
这里用一个docker的demo
docker run -d --privileged=true --name OLDMysql -e MYSQL_ROOT_PASSWORD=root -p 33306:3306 mysql
//导入sql,配置initialize.php
docker run -d --privileged=true --name OLDcms -p 33307:80 -p 44443:443 --link OLDMysql:mysql -d -v D:\testtest\orrs\orrs:/var/www/html theeastjun/xdebug3:7.4-apache
分析以及利用
起因是在index.html界面找到的
$page用户可控,这里由于几乎没有对路径进行任何的安全检查,所以可以造成任意php文件读取
如果环境有pecl,可以通过下面这种方式造成rce
/?+config-create+/&page=/usr/local/lib/php/pearcmd&/<?=phpinfo()?>+/tmp/hello.php
由于我们遇到的场景比较特殊,是一个文件包含的场景,那么我们就可以包含到pear中的文件,进而利用其中的特性写入/tmp/hello.php,pear具体特性参考Docker PHP裸文件本地包含综述 | 离别歌 (leavesongs.com)
之后包含这个shell就可以
/?page=/tmp/hello
可以在tmp目录下任意写入webshell,并通过文件包含达到rce
条件
这个漏洞仍然不需要管理员权限,并且甚至可以直接写php文件,也不需要对web目录具备写的权限,(tmp目录正常情况都是可写的)
但是需要有pecl/pear依赖,尽管目前绝大多数的docker(包括php官方镜像)都有这个依赖,所以攻击面其实还是很广的