xss-labs靶场分析笔记
1、level 1
这里以get方法提交name参数,并回显到页面上,页面尾部显示提交的参数长度。
这里直接把参数获取到,将name的参数值,插入到了<h2>
</h2>
标签之间,很明显存在反射型XSS
而且这里检测到成功弹框会弹框提示并跳转到下一关。直接提交<script>alert('xss')</script>
2、level 2
这里模拟的是搜索框存在反射型XSS的场景,通过get方法提交keyword参数
这里有两处会回显输入框输入的内容。第一处htmlspecialchars函数会把输入中的预定义字符转化为html实体编码,达到防御xss的目的。第二处插入到value参数值中的恶意代码并没有被编码而是直接原样返回,但是问题是这里的js代码在标签属性值中,浏览器是无法执行的。因此需要将属性的引号和标签先闭合
使用">闭合前面的标签,//注释掉后面的。"><script>alert(/xss/)</script> //
因为这里htmlspecialchars过滤了< 、>之类的字符,可以使用js事件触发xss,示例:" οnmοuseοver=alert(1)//、" οnclick=alert(1)//
3、level 3
这里对两处有回显的地方都做了html实体编码
由于html实体编码的原因,可以写一个不包含< 和 >的语句绕过,比如js事件触发XSS
onfocus 事件在对象获得焦点时发生。onfocus 通常用于 <input>, <select>和<a>
'οnfοcus=alert(/xss/) // 点击当前页面的输入框就可以完成弹框了。
4、level 4
这里对输入内容过滤了<和>两个字符,在第一处显示的地方进行了html实体编码,第二处插入了标签属性vale中
因此这里也不能使用带<和>的payload,可以使用js事件绕过
" οnmοuseοver=alert(1)// 鼠标放到输入框上触发
5、level 5
这里除了html实体编码的防御措施外,还对script和on字符进行了处理。检测到输入的内容中有这两个字符串,会在其中间插入下换线
因此这里
"> <a href=javascript:alert('xss') > xss</a> //
点击链接触发
对于一些危险字符的处理,还可以通过大小写绕过
补充:其他标签payload
<img>标签代码:<img src=111 onerror=alert('xss')>
data:text/html;base64,PHNjcmlwdD5hbGVydCgieHNzIik8L3NjcmlwdD4=
6、level 6
这里的限制更多了,src、herf、data等字符也被处理了。也就不能使用level 5的方法了,但可以使用大小写混写绕过
把payload关键字符大写即可绕过检测:" oNmouseover=alert(1)//
7、level 7
这里使用了strtolower函数将所有字符转化为小写,因此不能使用大小写绕过
但这里是过滤掉了一些危险字符,并不像前面那样在字符中间加下划线。因此可以双写绕过
"> <scrscriptipt>alert(/xss/)</scrscriptipt> //
8、level 8
这里模拟的是添加友链的场景,输入的内容会显示到输入框和嵌入到友链标签中
这里不但对输入转化为小写、对关键字符中加入下划线处理还实体编码了双引号和显示在搜索框的内容
大小写混写关键字、双写关键字等绕过方法都用不了,双引号闭合标签属性也不能。就只能对关键字进行编码了
成功绕过
9、level 9
这里与level 8相比增加了一个友链合法的检测,输入必须包含http://。
编码的payload后面必须加上http://不然会判断不合法
10、level 10
查看源码发现有一个隐藏的表单。其中含有t_link
t_history
t_sort
这样三个隐藏的<input>
标签
这里比较接近实际,在实际生产中开发人员很有可能会忽略这类隐藏的参数,从而造成XSS
查看源码发现,keyword参数被html实体编码了,不能利用。而t_sort参数则是过滤了<和>两个符号,可以绕过
使用的payloa不带<和>就行了
&t_sort=" type=“text” οnclick="alert(‘xss’)
11、level 11
这里一共有3个参数是用户可控的,keyword、t_sort和t_ref。但是前两个都使用了htmlspecialchars函数进行html实体编码,只有t_ref是可利用的。
t_ref的值是通过HTTP请求头中的referer信息获取的吗,需要在referer插入xss语句。要注意的是这里过滤了<和>符号。构造:referer:"type=“text” οnclick="alert(‘xss’)
12、level 12
与上一关很像,但这里可利用的是t_ua参数,通过请求头中的UA(user-agent)获取值。
构造语句:User-Agent:"type=“text” οnclick="alert(‘xss’)
13、level 13
这里可利用但参数是t_cook,通过cookie中的name参数获取值
构造语句:Cookie:user="type=“text” οnclick="alert(‘xss’)
14、level 14
这里通过iframe调用的网址失效了,应该是通过这里完成XSS
搜了一下,这里应该是Exif xss
什么是Exif
可交换图像文件格式,是专门为数码相机的照片设定的,可记录数码照片的属性信息和拍摄数据。
比如我们这里随便拿一张照片右键,点击属性,点详细信息,这里有很多可修改的内容,比如我们修改标题为
'"<script>alert(/xss/)</script> 这里的引号是为了闭合前面的信息
因为有些网站可以读取exif 信息,当传入一张含有恶意信息的图片的时候,就可以触发payload
随便找一个网站,这里使用https://exifdata.com/
选择文件,将我们事先构造好的图片上传上去,就会有弹窗弹出了,说明我们的恶意代码被执行了,该网站存在这样一个漏洞
如果我们将这个xss 替换为cookie 的话,而且我们将这个图片传到某个论坛上面,那么别的用户点击你这张图的时候就会读取Exif 信息,将他们的cookie 发送到我们这里,那么这就变成了一个存储型xss漏洞了,所以危害比较大的,但是这里只是一个反射型的xss
将iframe标签中的网址替换成我们用的那个 EXIF data的网址
上传图片
15、level 15
这里用到了ng-include
而且进行了html实体编码,不能直接利用
ng-include 是 angular js 中的东西,其作用相当于php的include函数。这里就是将1.gif
这个文件给包含进来。
ng-include 属性的值可以是一个表达式,返回一个文件名。默认情况下,包含的文件需要包含在用一个域名下
特别值得注意的几点如下:
1.ng-include,如果单纯指定地址,必须要加引号
2.ng-include,加载外部html,script标签中的内容不执行
3.ng-include,加载外部html中含有style标签样式可以识别
可以利用第一关,构造语句:?src='level1.php?name=<img src=1 onerror=alert(1)>'
16、level 16
这里输入的参数会直接显示在页面上。但会将script、/、空格替换为 
因此这里不能使用包含上述字符的语句。因为/被替换了,不能起到注释作用,因此这里要使用单标签(不需要闭合)。比如<img>标签
,并利用其他符号代替空格,比如换行符(url编码为%0A)
<img%0Asrc=”111”%0Aonerror=alert(1)>
17、level 17
这里对输入的两个参数都做了html实体编码,测试发现只有<和>会被转义。
这里的src属性没有引号不用闭合,可以构造语句:?arg01=a&arg02=b οnmοuseοver=alert(/xss/)
18、level 18
这里和17很像。
构造语句:?arg01=a&arg02=b οnmοuseοver=alert(/xss/)
19、level 19与level 20
这两关的src属性被双引号闭合了,不能像前两关一样利用(>被编码,无法闭合标签)
其实17到20都是关于flash xss。由于现在flash停用了,这里就不深究了