目录
基础环境
小皮面板8.1
所需知识
XSS漏洞概述
跨站攻击脚本(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets)的缩写混淆,故将跨站脚本攻击缩写为XSS
恶意攻击者会往web页面里插入恶意script代码,当用户浏览该页时,嵌入其中web里面的script代码会被执行,从而达到恶意攻击用户的目的
攻击流程:
漏洞出现的原因:
程序对输入和输出的控制不够严格,导致脚本输入后,在输出到前段时被浏览器当作有效代码解析执行从而产生危害
XSS类型
1.反射型:
反射型XSS又称非持久性XSS,这种攻击往往具有一次性
攻击者通过邮件等形式将包含XSS代码的链接发送给正常用户,当用户点击时,服务器接受该用户的请求并进行处理,然后把带有XSS的代码发送给用户。用户浏览器解析执行代码,触发XSS漏洞
2.存储型:
存储型XSS又称持久型XSS,攻击脚本存储在目标服务器的数据库中,具有更强的隐蔽性
攻击者在论坛、博客、留言板中,发帖的过程中嵌入XSS攻击代码,帖子被目标服务器存储在数据库中。当用户进行正常访问时,触发XSS代码
3.DOM型:
DOM型XSS全称Document Object Model,使用DOM动态访问更新文档的内容结构及样式
服务器响应不会处理攻击者脚本,而是用户浏览器处理这个响应时,DOM对象就会处理XSS代码,触发XSS漏洞
一般不与服务器产生数据交互,属于低危漏洞
通关过程
通用思路
通过各种可以提交内容的地方,例如导航栏,或者文本框等地方,进行注入,只要有弹窗即为成功。
1.第一关
我们先看看源码
源码中可以看出这是个GET类型,那么我们就看导航栏就可以,导航栏中有一段“?name=test”,很明显,我们可以在这里进行注入
?name=<script>alert(123)</script>
可以看到成功了
2.第二关
这里我们接着看源码,暂时没发现什么问题,所以我们先提交上一关的Payload
<script>alert(123)</script>
提交后,并没有弹窗弹出,我们接着看源码
可以看到,这里我们输入的特殊符号被转义掉了,但是在value中返回的没有被转义,因此我们只需要闭合掉value前面"<和即可
"> <script>alert(123)</script>
3.第三关
还是跟上一关一样,我们先输入下面这串代码,看看有什么问题
<script>alert(123)</script>
可以看到这里相较于上一关,它在value中的值也转义了那我们就看看后端的源码,
可以看到这里用htmlspecialchars()函数进行转义,这个函数默认是只编码双引号的,而且单引号无论如何都不转义。因此我们这里需要用单引号闭合而且还要通过其他方式来注入,这里我们利用onfocus事件绕过,这里引用下百度搜索到的
因此这里我们的Payload
'οnclick='alert(1)
输入该Payload,提交后,点击输入框即可。
4.第四关
依旧是输入我们基础的JS弹窗代码,但是你会发现,它会删除<>,因此这里我们依旧可以使用上一关的Payload,只需要将单引号改为双引号闭合即可
" οnclick="alert(1)
5.第五关
这里可以看到,我们在输入后,script变为了scr_ipt,
这下我们看后端源码,可以看到它是将<script替换成<scr_ipt,把on改成o_n
那么此时我们就可以用另外一种方法,
那么我们可以利用这个特性,来构造我们的Payload,当然不要忘记闭合
"><a href="javascript:alert(1)">
6.第六关
如果利用前面关卡的思路来不断尝试的话,发现它过滤了好多关键词,我们来看看看后端源码
果不其然,它全过滤掉了,但是你会发现它没有过滤大小写,那么这里我们就可以利用大小写来绕过
//其余的Payload也可以,这里就不多展示了
"> <sCRipt>alert(123)</sCRipt>
7.第七关
这一关也是一样,你会发现它筛掉了关键词,而且大小也不管用了,script也被替换为空了,我们看看源码
果然是,但是这里的筛查只筛查一遍,那么如果我们把script写为sscriptcript,那么经过它的筛查,那不就成为script了吗?
"> <sscriptcript>alert(123)</sscriptcript>
8.第八关
还是老样子,可以看到它这里把值传到了两个地方,一个在value另外一个在href,那么我们可以想象到,这里就是需要我们注入正确的Pyload,然后通过href连接来进行注入,href是支持Unicode解码的,所以这里我们需要转换,转化工具百度上搜索即可
javascript:alert()
//编码后
javascript:alert()
9.第九关
老样子
看来这里它会把不符合要求的东西替换成”您的连接不合法?有没有“
那么我们看看源码
这个代码会检验你输入的内容中有没有”http://“,如果有就正常提交,如果没有,那么就跟上面返回的内容一样了。那么我们只需要加入http://并且注释掉即可
javascript:alert()/*http://*/
10.第十关
这一关很奇怪,你会发现没有输入框,而且前端代码里看不出什么东西,那么我们只能看源码了
可以看到,他在这里做了防止<>的东西,而且把输入框隐藏了,那么我们需要把这个Type改回来,改成text,我们只需要在构造好的payload后面加入type="text"即可,当然,这是从url注入,
?t_sort=" οnfοcus=javascript:alert() type="text
11.第十一关
有了上一关的经验,我们直接看源码
可以看到,这里面与上一关不同,这一关有了t_ref字段,而这个字段是referer头,那么很明显了,这里用到的是referer注入,我们先通过BP来抓包了
这里我们直接添加或修改referer字段即可,这里它把<>过滤掉了,所以我们用这个
Referer: " οnfοcus=javascript:alert() type="text
12.第十二关
换汤不换药,还是一样的把戏,只不过换字段了,这里用的是User-Agent字段,步骤与上一关基本一致
User-Agent:"οnfοcus=javascript:alert() type="text
13.第十三关
还是一样,这一次是Cookie值,老样子
Cookie: user="οnfοcus=javascript:alert() type="text
14.第十四关
这一关的Payloda是一张图片马,正常情况下打开14关的时候会跳转到一个地方,然后需要在哪里上传含有JS代码的图片马,从而达到弹窗的效果,这里因为网站已经停止服务了,如果想做类似这关的题目,可以去试试upload-labs。
15.第十五关
先看源码
可以看到最后一句话很可疑,ng-include,这肯定是通过的关键
想了解的去看看下面大佬总结的
ng-include指令
总的来说,他就是引用外部html连接,默认情况下,包含的文件需要包含在同一个域名下,为了让弹窗,我们选用最简单的第一关,这里我们需要选择标签,而且标签必须是可以点击的,
?src='/level1.php?name=<img src=1 οnerrοr=alert()>'
16.第十六关
十六关最大的不同就是它屏蔽了空格键,那么我们可以用其他符号来代替空格,比如换行符%0a,再者,因为它与15关一样,没有可以交互的东西,所以我们这里创造一个可以交互的东西。
?keyword=<img%0asrc=1%0aonerror=alert(1)>
后续关卡都用到了插件,并且与逆向相关,本人暂时还未学习,等学完后会接着更新