目录
进入靶场 Challenges (pwnfunction.com)
复现DOM型xss
进入靶场 Challenges (pwnfunction.com)
1.Ma Spaghet!![](https://i-blog.csdnimg.cn/direct/2511097b788c47a986f18edf41e16723.png)
分析源码:
在script标签里边,使用get传参的方式给somebody传一个值,如果没有传值,默认传Somebody+Toucha Ma Spaghet!,然后赋值给spaghet,放在h2标签中。但是我们不能直
使用<script>标签,因为官方认为这不安全,可是却只对这一个标签进行了过滤,所有我们只需要换一个标签即可
这里我们使用
?somebody=<img src =1 onerror ="alert(1337)">
即可成功绕过
2.Jefff
分析源码:
这里首先使用get传参的方式,给jeff一个值,将值传给let jeff,变量ma然后执行Ma name +jeff传入的值,setTimeout是延时执行ma,这里的ma带了一个ineerText的属性
所有我们不能使用第一题标签的方法,转变思路看能不能直接闭合ma然后执行代码
显然我们用 "; 直接闭合了前面的ma,在分号后面插入执行代码即可
3.Ugandan Knuckles
分析源码:
还是使用get方式传参;首先是传给wey一个值,然后赋值给变量let wey,然后这里过滤了<>尖括号,最后将我们的变量wey内容传给Uganda,显示在输入框中,Uganda也带一个inner HTML的属性,所以我们不能使用script标签,那就看看其他的思路,由此我们无法闭合<input>标签,我们可以使用onclick函数加入一个点击事件,一点击就可以触发。可是问题又来了,游戏规则上说了我们不能使用与用户交互的方式,那有没有在input标签里面不和用户交互也可以触发的方式呢?onfocus
可以产生焦点,同时还有另一个autofocus可以自动对焦,两者结合即可自动触发。
4.Ricardo Milos
分析源码:
使用get方式传参;传一个值给Ricardo,这里的submit是提交,意思是将我们传入的值过两秒传给Ricardo。action是他接受的一个伪协议。伪协议事件是一种利用action
属性中的特殊协议(如javascript:
)来执行JavaScript代码的技术。所以我们可以使用JavaScript来绕过。
5.Ah That's Hawt
![](https://i-blog.csdnimg.cn/direct/813e3586cea0425faf545fb16f9d778c.png)
思路一
源码分析:
这里主要是过滤,将()\ 和反引号过滤 ;会将这些符号转化为空还有inner HTML,所以script也不能用了不妨试一下用img的报错实现,因为我们的括号被过滤,那么我们可以试下使用实体编码进行绕过
可以看到使用了html实体替换()没起作用,我们的img标签也没了。这是因为url传参时会解码特殊字符,所以我们要对实体再编码一次。
思路二
延续之前的方法,onerror进行报错正常%2528 %2529不会被解析,那+location会不会不一样呢?
6.Ligma
代码分析:
这里看到过滤了数字和字母,基本上除了编码 没有其他解法,可以使用jsfuck。
在使用url解码
即可完成
7.Mafia
法一
分析源码:
这里还是get方式传参,但是限制我们传入的参数长度最大为50个字节,而且过滤了一大堆东西,最后执行mafia,很明显上一关的方法就不行了,代码漏洞,他过滤了符号和alert函数,但是没有过滤confirm
函数,但是很明显不可能这么简单只是作者忘记过滤了。所以我们使用匿名函数
使用Function()()来执行函数也行,但是alert被过滤掉了,而且js中又区分大小写所以我们使用(ALERT(1337)/.source.toLowerCase())()来转换小写并执行即可绕过。
法二
alert使用parseint函数转换成了30进制的一个整数,toString()是返回一个函数的字符串,内容是函数的源码=> eval(8680439..toString(30))(1337)
法三
就是使用eval(location.hash.slice(1))#alert(1337)
location.hash时取出全部后面跟的值,而slice则是截取第一个值,并且hash后面的值不会认为是maifa的传参不会被过滤
8.Ok, Boomer
DOMPurify这个过滤框架由安全团队cure53开发过滤能力很强,基本不用考虑绕过,只能考虑setTimeout入手
可以看到没有成功的原因应该是javascript被过滤了,所以就得使用它框架允许的进行替换
这个框架有个白名单我们替换一下
成功绕过