这里采用火狐浏览器本地环境搭建,项目地址:https://github.com/do0dl3/xss-labs
lab1
查看源代码
和url对照
是直接将传入的name在插入在标签之间,而且返回了字符串长度,所以这里尝试反射性xss,?name=<script>alert('xss')</script>,其实若分析对应php代码,发现,他将name使用get方式传入字符串放入<h2></h2>中,未进行防护过滤,所以存在反射性xss。
lab2
感觉像lab1类似,只不多了搜索框,填入<script>alert('xss')</script>,并无弹窗,查看源代码:
可以看到这里其实将我们传入的字符串进行了重新的过滤编码<与>都进行了编码成html实体,一般通过htmlspecialchars()实现,所以流程为先将我们传入的字符串进行编码,再放入<h2></h2>,然而value并未进行过滤编码,那么可以对value前面的">进行前闭合,后面加上//进行注释处理,又可执行xss:"><script>alert('xss')</script>//
lab3
简单的看起来与lab2差不多,先输入<script>alert('xss')</script>,查看情况,没有弹窗,这里查看源代码:
这次两边都进行了过滤,这时可以考虑特殊情况触发执行,这篇文章里有较为详细的说明:https://blog.csdn.net/qq_36374896/article/details/82755793
这里使用onfocus进行构造keyword='οnfοcus=alert('xss') '
在点击输入行,即可触发。
lab4
这里还是老办法,使用<script>alert('xss')</script>
输入框的代码已经有了错误,看源代码:
和lab3差不多,只不过是把那些< >在输入框中删除了,继续使用lab3的payload,keyword="οnfοcus=alert('xss') " (这里双引号与源代码一致)。
lab5
老规矩,先试试<script>alert('xxx')</script>,无弹窗,看看源代码
上面先对我们写的<>作了编码,然后下面对第一个script做了替换,尝试使用异常响应"οnfοcus=alert('xss')"
依然不行,对onfucus也进行了过滤,这里考虑使用标签来执行,即不考虑直接弹出,而且添加标签再触发:?keyword="> <a href=javascript:alert('xss') > xss</a> //
前面使keyword闭合,后面添加javascript标签,并注释后面。完成。
lab6
<script>alert('xss')</script>填入
和lab5差不多,试试lab5的payload:?keyword="> <a href=javascript:alert('xss') > xss</a> //
发现并不能产生点击条件,看代码:
对href和也进行了替换,那么这里尝试大小混写:
?keyword="> <a hREF="javascript:alert('xss')">xss</a>//
完成。
其实观察源代码会发现,这里还对data做了过滤,索性就详细的说一下其他的xss触发。图片img标签如果src正常就会显示图片,如果错误的话,就会执行,onerror事件,所以有时候可以这样构造:
?name=<img src=111 οnerrοr=alert('xss')>
data是进行编码然后执行的一种方式,如:
?name=<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgieHNzIik8L3NjcmlwdD4=">test</a>
当然也支持其他编码。
lab7
还是<script>alert('xss')</script>填入
这次直接删除了,试试大小写绕过:
并不行,那么试试双写绕过,sql注入也常用
"oonnfocus=javascrscriptipt:alert('xss') '
成功。
源代码是把所有转化成了小写做处理,利用双写绕过。
lab8
我们先试试大小写:?keyword=javaSCRIPt:alert(‘xss’)
绕不过,且没有删除敏感字,自然不能使用双写,这里使用js编码
javascript:alert('xss')
keyword=javascript:alert('xss')
成功。
观察源码还会发现,他对“闭合也做了过滤。
lab9
界面和lab8的差不多,不如直接试试lab8的payload:
显示不合法,可能对http作了检测,那么此时就在后跟上正确的连接试一下
keyword=javascript:alert('xss')//http:baidu.com
lab10
看页面好像就一个显示位置,那么看看源代码:
有四个位置可以进行展示,只不过hidden了,那我们试试开发者工具能不能把haiden变为text:
t_sort=" type="text"可以
payload:name=/script>&t_sort=" type="text" οnclick="alert('xss')
成功。
lab11
尝试将隐藏标签
?t_link="tpye"=text&t_history="type"=text&t_sort="type"=text&t_ref="type"=text
可与发现可以更改,只不过,对我们的引号进行了过滤,无法闭合。
看来直接改有些困难,用burp抓包试一下。
在请求里没有发现referer,那么我们先随便加一个:
发现可以改变值,那么不如在这填入恶意代码。
" type="text" οnclick="alert('xsss')
在看源代码referer头的值出现在了t_ref标签的value属性值。
源代里看到,是把referer值传到里面。
lab12
看看源代码:
看看t_ua,有点像数据包uer agent的格式(甚至缩写都是提示),那么我们就像lab11一样
好像构造成功了,来试试:
完成,思路和lab差不多。
lab13
这肯定猜cookie啊,直接试:
注意这里不能直接覆盖cookie,可能对cookie做了检测,最后成功过关。
lab14
暂时没法做,大致思路是利用上传图片,更改图片信息触发xss。
lab15
这个刚开始看不出所以然,不如直接看页面代码:
根据初始的url和页面代码可以看到,这次我们需要控制的大概就是src,他会在最后一行起作用,最简单的思路大概就是关闭标签的操作,scr="><script>alert('xss')</script>
看来进行了字符的替换,我么注意到有ng-include,这个是包含外部的html文件的,有这样的特点:
1.ng-include,如果单纯指定地址,必须要加引号。
2.ng-include,加载外部html,script标签中的内容不执行。
3.ng-include,加载外部html中含有style标签样式可以识别。
那我们就考虑把lab1的变换给出,且要绕过script关键字,就用onerror进行触发:
?src='level1.php?name=<img src=1 οnerrοr=alert(1)>'
成了。
lab16
16了,进行简单的应该不是太行,我们还是要进行简餐测试下:<script>alert('xss')</script>
这里值得注意,把空格都编码了,这就有些难受了,且无法闭合。
空格的问题可以用回车代替:%0a
然后其他的用onerror。
payload:?keyword=<img%0Asrc=1%0Aοnerrοr=alert('xss')>?keyword=<img%0Asrc=1%0Aοnerrοr=alert('xss')>
lab17
这里因为flash插件不支持的原因就没往下做(因为懒得下flash)。
看网上其他师傅的说法是<embed></embed里触发条件,比较简单。
lab18
和lab17的方法一模一样。
lab19
这次是flash xss,知识盲区,看网上师傅 的思路。
flash有可以调用js的函数,这些函数如果使用不当也是会造成xss的。常见的可触发xss的危险函数有:
getURL、navigateToURL、ExternalInterface.call、htmlText、loadMovie等等。
这次需要一个代码分析的工具进行反编译:jpexs-decompiler。
另存为swf,进行反编译:
里面有getURL
对于这个来说,他可对于我们传入参数进行解析,但还要内容是不是link:
对于这个来说Link就是在<a></a>里包含的内容,这里附上大佬的payload:
arg01=version&arg02=<a
href="javascript:alert('xss')">xss</a>>
lab20
放大佬的payload:?arg01=id&arg02=xss"))}catch(e){alert(/xss/)}//%26width=123%26height=123
这里着重说下:通过url编码之后的%26的话,服务器端就会将其后的所有字符当做是arg02参数的值,然后将其添加到<embed>标签的src属性值中去。