0x00— 最简单,没什么说的
0x01— <textarea> 标签中的攻击
0x02— <input> 标签中 value 属性的攻击
0x03— /[()]/g 的正则匹配避免
0x04—html 实体攻击 1
0x05— 注释应用 1
0x06— 正则应用 1
0x07— 非闭合标签
0x08— 标签应用
0x09—script 属性应用
0x0A—url 漏洞攻击(谷歌浏览器不一定能用)
0x0B— 外部调用攻击
0x0C— 正则匹配攻击
0x0D— 注释应用 2
0x0E— 特殊字符大小写转义攻击
0x0F—html 实体攻击 2
0x10— 最简单 2
0x11— 转义符应用
0x12— 转义符绕过加单行注释避免
解析和答案
0x00
没有
0x01
将<textarea>标签闭合即可
0x02
将<input>中的value属性和input标签闭合
答案
"><script>alert(1)</script>
或使用 input 标签的 onmouseover 属性" onmouseover="alert(1)">
或使用 input 标签中的 onclick 属性" onclick="alert(1)">
0x03
/[()]/g 的正则意思就是匹配 ( 或 ) 所有这些符号下面的函数就是将这些符号替换为空字符串
==但是==:在命令行中你可以使用
1 | alert`1` |
来代替 ()
0x04
上一个题目你用了反引号,这次给你限制了
我们可以直接用 unicode 编码,直接跳过正则匹配
其中 () 的 unicode 编码在 html 实体中 10 进制为 ()
==并且==:不能在标签中使用,例如<script>alert("1")</script>
标签中不会进行渲染,所以必须用在属性当中
例如 onmouseover
svg 标签中也可使用<svg><script>alert("1")</script></svg>
0x05
直接把你所写的内容全部注释了
我们都知道 html 的多行注释是 <!-- -->
ps:但是同样有个冷门的方法就是
<!----!>同样可以使用注释,那么我们可以防止正则被匹配逃逸出来
0x06
auto|on.*=|>/ig
意思可以看成两个
ig 进行全局匹配加上匹配大小写auto|on.* 匹配所有 onmouseover 这种属性
但是突破点是在 .* 上,这个匹配不匹配换行符所以可以使用
1 | onmouseover |
绕过
0x07
/<\/?[^>]+>/gi
这个正则就是直接匹配所有 html 标签,所有类似 <>,</script>,都会被替换成空,但是浏览器编译器可以不使用严格模式下,可以不闭合标签就可直接使用<body onload=“alert(1)”
0x08
<\/style>/ig 直接匹配 </style> 标签,但是。。
在 JavaScript 解析器中有好几个不严谨的地方
<sytle >如果后面加空格同样可以渲染<sytle/>后面添加/同样可以渲染
0x09
直接看 /^https?:\/\/www\.segmentfault\.com/ 这个正则,
这个就是直接匹配https://www.segmentfault.com 和http://www.segmentfault.com
这两种情况的
但是没有限制在后面添加内容,可以直接闭合里面的标签攻击
0x0A
在上一题基础上,但是我们不能直接闭合里面的标签了,会把 " 直接转换成其他符号,那么我们就不能使用这个来闭合攻击
可以使用 url 基础中的一个非常不重要的一个方法http://122313213:12313213@213123.com 其中@前的是认证信息,及 http 认证的用户和密码,但是一个网站没有任何用户密码登录限制这个@前的所有东西不会应用上,等于直接访问: http://213123.com
PS:谷歌用不了,火狐可以,
0x0B
JavaScript 编译器无视大小写,标签可以大小写,url 可以大小写
0x0C
PS: 所有这种匹配一堆字符的,可以通过双写来替换及/script/ig
能替换 script,但是替换不了 scscriptript
0x0D
PS:我们都知道 javascript 中注释有
1 | <!-- 多行html注释 --> |
但是,其实其中你可以将 --> 当作单行注释使用
0x0E
因为 html 标签中必须要保证 <a 尖括号后面必须要有英文,不然不算一个标签。又进行了大写转义,所以只能使用特殊字符了
PS:其中
ſ这个字符是古英文s,所以可以使用大写转义成大写的S,如果代码中有大写转义,并且判断[a-zA-Z]中的必须使用这个字符
还有一种字符是ı这个字符可以转义成大写的I
0x0F
虽然转义成 html 实体了,但是输入的内容还在 input 属性内,等于没有转义
直接闭合 console.error() 语句,然后后面加上 ; 让 JavaScript 区分语句,后面加上攻击语句即可
0x10
直接写入 windows.data?,这个没有难度,赋值语句右边也可以执行,直接写攻击语句就可以
0x11
这题和下面题目都有点绕,
0x12
PS://后面有东西,一直注释到后面的标签结尾
<script>console.log("\\");alert(1);//");</script>如果你把这段代码放浏览器里,你会发现其中的//");被注释掉了,
也就是单行注释放在标签中可以把标签之前的所有内容当成注释解析