一、对变量直接输出
例如:
<?php
echo$_GET['xss']; //接受的参数可以直接进行xss
?>
这里通过GET方式传过去xss参数,并且对传过去的参数没有做任何过滤,我们的输入会在页面进行显示。现在我们输入恶意代码<script>alert(1)</script>
XSS弹出弹框
浏览器(火狐,谷歌默认有防护):
二:$_SERVER变量参数
(1)$_SERVER['PHP_SELF']
测试代码:
<?php
echo $_SERVER['PHP_SELF']; //直接输出自己的文件名
?>
浏览器:
(2)$_SERVER['HTTP_USER_AGENT']
此函数作用是获取浏览器信息
<?php
echo $_SERVER['HTTP_USER_AGENT']; 输出agent
?>
可以用Bp抓包改包或者通过火狐插件Modify headers 修改User-Agent:的内容就行了
<?php
//echo $_GET['xss']; //变量的直接输出导致xss
//echo getenv('REMOTE_ADDR'); //远程iP
//echo $_SERVER['PHP_SELF']; //显示自己路径
//echo $_SERVER['HTTP_USER_AGENT'];
echo $_SERVER['HTTP_REFERER']; //输出referer
//echo urldecode($_SERVER['REQUESR_URI']); //因为URI会进行编码,所以需要重新解码
?>
三、绕过分析
1、过滤<script>,</script> ,
<?php
$xss = $_GET["xss"];
$xss = preg_replace("/<script>/", "", $xss);
$xss = preg_replace("/<\/script>/", "", $xss);
echo $_GET["xss"];
?>
直接通过双写或者大小写可以绕过
preg_replace()
函数如果检测到<script>
和</script>
就会把其替换为空格(只替换小写的)。
但这里并没有迭代替换,所以这里可以双写绕过也可以大小写绕过。
即payload<scr<script>ipt>alert('test')</s</script>cript>
或<scRipt>alert('test')</scRipt>
2、过滤大小写
<?php
$xss = $_GET["xss"];
$xss = preg_replace("/<script>/i", "", $xss);
$xss = preg_replace("/<\/script>/i", "", $xss);
echo $_GET["xss"];
?>
这里还是用了preg_replace()
函数,只不过这里替换时不区分大小写,所以这里我们不能用大小写绕过了,但我们还是可以用双写绕过的
3、匹配到script 就die。
<?php
if (preg_match('/script/i', $_GET["name"])){
die("error");
}
?>
<?php echo $_GET["name"]; ?>
,这里用了preg_match()
函数, 只要在获取的参数中含有script字符串即报错。这里我们可以使用img标签来绕过,img src调用图片失败然后执行后面的动作。payload为<img src=""onclick="alert('chenie')">,此处要点击图片会触发
4、alert 被过滤
<?php
if (preg_match('/alert/i', $_GET["name"])){
die("error");
}
?>
<?php echo $_GET["name"]; ?>
考虑编码(ascii 编码)
参数:name=<script>eval(String.fromCharCode(97,108,101,114,116,40,39,99,104,101,110,105,101,39,41))</script>
所有十进制可以查看ascii对应的结果。