xss Challenges

challenge2 属性中的xss


输入的查询在input标签的value属性里,因此解析不到script就不用调用js

1.闭合标签

"><script>alert(document.domain)</script>

2.闭合引入事件

" onmouseover=alert(document.domain)>

还可以引入单击等事件触发xss

challenge3 选择列表里的xss


常规操作后发现没有弹出窗口,闭合b标签也不行。查看源代码发现”<>”被实体化编码了。

F12发现可以更改第二个select表单数据,并且选中提交之后会在第二行回显出来,于是在select中构造了一下。

回显成功。(也可以在burp里)

challenge4 隐藏提交参数中的xss


在两个回显位修改成js代码都行不通,于是找另外的办法。

html表单隐藏参数

隐藏域是用来收集或发送信息的不可见元素,对于网页的访问者来说,隐藏域是看不见的。当表单被提交时,隐藏域就会将信息发送到服务器上。

代码格式:

<input type="hidden" name="..." value="...">

在本题中我们可以搜到hidden参数

html中的svg

svg意为可缩放矢量图形,是使用XML格式定义的图像。

可以通过<embed> <object> <iframe>标签嵌入到HTML文档,也可以使用<svg>标签插入(<svg/ onload=""

触发xss

提交后发现表单数据p3中有个隐藏参数,于是尝试在p3中构造payload。

不能直接更改…于是抓包

先闭合,再alert,也可以用上面讲到的<svg>标签。payload:"><svg/ onload=alert(document.domain)>%0a

并且能在这个位置看到我们添加的矢量图形

Challenge5 限制长度的xss


直接更改maxlength就可以了

Challenge6 Html事件中的xss


Html事件介绍

在现代浏览器中都内置有大量的事件处理器。这些处理器会监视特定的条件或用户行为,例如鼠标单击(onclick)或浏览器窗口中完成加载某个图像(onload)。通过使用客户端的Js,可以将某些特定的事件处理器作为属性添加给特定的标签,并可以在事件发生时执行一个或多个js命令或函数。

常用的Html对象事件:

构造payload

在这关里输入的尖括号被转义了,因此可以先闭合input后用事件绕过。

鼠标放到输入框触发:"onmouseover="alert(document.domain)"

鼠标点击触发:"onclick="alert(document.domain)"

事件会在页面或图像加载完成后立即发生:"onload="alert(document.domain)"

Challenge7 空格分隔属性的xss


用老办法输入一串特殊数字,查找输入元素的位置。

找到后,试探常用payload,发现尖括号仍然被过滤了。

用事件来代替,发现原来输入空格后会自动补全一个双引号,也会用双引号将等于号后面的值阔起来。

因此构造payload的时候不用双引号就行了。

Challenge8 Javascript伪协议触发xss


Javascript伪协议介绍

将Javascript代码添加到客户端的方法是把它放置在伪协议说明符javascript:后的url中。这个特殊的协议类型声明了URL的主体是任意的js代码,它由js解释器运行。如果javascript:URL中的js代码包含多个语句,则必须使用分号将这些语句分隔开。如

javascript:var now = new Date();"<h1>The time is:</h1>"+now;

javascript:URL还可以只包含执行动作,但不返回值的js语句。

javascript:alert("hello")

a标签下的href属性

随意输入一串字符后,在相应中查找发现输入是在a标签的href中出现。

href属性的作用很简单就跳过了。

构造payload

由于过滤了双引号,又因为href属性的原因,我们可以利用js伪协议构造。

有一篇javascript伪协议与url编码bypass的文章利用location来变形我们的XSS Payload(虽然这道题用不到)

于是我们构造payload为javascript:alert(document.domain)

Challenge9


用的UTF-7 xss,UTF-7已经被多个浏览器移除,所以跳过。

Challenge10 过滤特殊字符串


按照原来的思路,在响应中找到我们输入的特殊无害字符串,发现它在value中。

于是闭合input,构造payload。发现我们输入的domain被替换为空了。

双写绕过

构造payload为"> <script>alert(dodomainmain);</script>

编码绕过

类比于sql注入中的编码绕过,对关键字进行编码之后自动解码使得payload能够执行。

构造payload为:

"> <script>eval(atob('YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ=='));</script>

eval函数用来执行字符串,字符串就会当作程序来执行。使用atob函数将加密的base64转换为原文字符串。

Challenge11 绕过替换script和on事件的xss


这道题过滤的地方比较多:

1.script被替换成了xscript

2.on事件被替换成了onxxx

3.style被替换成了stxxx

因此想利用编码绕过过滤,但经过测试后发现,在标签中编码不会被解析。因为浏览器再解析xml时,先把标签解析成DOM树,而在标签名解析的时候不会解释html编码。只会对属性里的值进行解码。

基于以上的考虑,我们可以在标签值中用编码构造事件。因此可以用href属性和javascript伪协议绕过。

构造payload为"> <a href="javascr&#105;pt:alert(document.domain)">xss</a>

解析正确

Challenge12 IE浏览器特性绕过


这一题过滤了<>和"",用编码绕过也不行,因为用html编码构造的双引号会被认为成“字符串型”的引号,而不是“符号”。所以还是不能闭合。看网上的wp说IE浏览器可以用两个反引号代替双引号,但别的浏览器不行,就跳过了。

Challenge13 利用css特性绕过过滤


emmm困了 下次再写8

这几天被suricata这个东西整得有点暴躁。所以今天才来填坑。

这道题把<>""都过滤了。所以不能闭合。

css有一个特性为background设置背景颜色。

background:url("javasript:alert(document.domain)");

设置background:url,利用javasript伪协议执行js代码。但只有低版本的IE浏览器支持这种写法,其他的浏览器不太支持了,所以实战意义不大。

Challenge15 进制绕过


这道题同样过滤了<>""

本题用document.write将输入的内容进行输出,所以考虑通过16进制转换<>的ascii码来绕过。

<>的16进制为\x3c、\x3e,经过尝试后发现本题过滤了一个\,所以构造payload如下:

\\x3cscript\\x3ealert(document.domain)\\x3c/script\\x3e

或者用八进制:

\\74script\\76alert(document.domain)\\74/script\\76

Challenge16 unicode码绕过


同样用上一道题的16进制进行绕过失败

但用八进制绕过成功。这里应该只是过滤掉了十六进制的绕过。

也可以使用unicode码绕过。用python将字符的ascii码转换为js能识别的unicode形式,构造payload为:

\\u003cscript\\u003ealert(document.domain)\\u003c/script\\u003e
Author: Neorah
Link: https://neorah.me/pentest/xss%20Challenges/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.