文章目录
- 前言
- 环境
- 第一关、反射型xss(get)
- Step.1、输入特殊字符测试
- Step.2、输入js语句
- Step.3、在URL中输入js语句
- 第二关、反射性xss(post)
- Step.1、输入获取cookie的js语句
- 第三关、存储型xss
- Step.1、输入获取cookie的js语句
- Step.2、查看页面源码
- Step.3、感受危害性
- 第四关、DOM型XSS
- Step.1、输入js语句测试
- Step.2、查看页面源码
- Step.3、再次输入js代码编写的payload
- 第五关、DOM型XSS-S
- Step.1、输入js语句测试
- Step.2、查看页面源码
- Step.3、输入编写好的payload
- 第六关、XSS盲打
- Step.1、输入payload测试
- Step.2、按提示查看后台
- 第七关、XSS之过滤
- Step.1、输入payload测试
- Step.2、分析
- Step.3、绕过过滤
- 第八关、XSS之htmlspecialchars
- Step.1、输入payload测试
- Step.2、改造payload再次输入
- 第九关、XSS之href输出
- Step.1、输入payload测试
- Step.2、输入js函数格式的payload
- 第十关、XSS之js输出
- Step.1、输入payload测试
- Step.2、输入构造好的payload
前言
Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
- 反射性XSS;
- 存储型XSS;
- DOM型XSS;
XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
- 输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
- 输出转义:根据输出点的位置对输出到前端的内容进行适当转义;
靶场一共有10关,现我们就开始通关吧。
环境
靶场安装机器:Windows10(192.168.1.107)
渗透机器:Windows10(192.168.1.108)
第一关、反射型xss(get)
一个平平无奇的输入框
Step.1、输入特殊字符测试
遇到输入框,作为渗透测试人员,第一反应就是输入特殊字符看看,我这里就先输入一个双引号"
瞧瞧。
能输出,看来特殊字符做了过滤
Step.2、输入js语句
往输入框中输入<script>alert(1)</script>
看看
发现无法完全输入,查看页面源码,这输入框做了长度限制
把长度限制改成100,再次输入js语句看看
能成功弹出,说明存在XSS反射型漏洞
Step.3、在URL中输入js语句
回车,发现也能成功弹出
到此,第一关通关
第二关、反射性xss(post)
登录它吧,pikachu靶场的默认账号密码是:admin/123456,如果你想用渗透手法获取账号密码,也可是使用上一个挑战 —— 暴力破解的手法来获取,这里节省时间,就直接登录了。
登录后发现,也是一个平平无奇的输入表单
Step.1、输入获取cookie的js语句
输入:<script>alert(document.cookie)</script>
好了,弹出了cookie信息,说明这里的确存在XSS漏洞,第二关通关
。
第三关、存储型xss
平平无奇的一个留言框
Step.1、输入获取cookie的js语句
输入:<script>alert(document.cookie)</script>
能顺利弹出cookie信息
Step.2、查看页面源码
直接在留言列表里面能看到我自己输入的payload
Step.3、感受危害性
使用另一个浏览器登录靶场,点开对应页面
我都还没有进入页面就先弹出我的cookie了,这说明这句payload已经存进了数据库。设想一下,一个正常网站,每次进去都会弹出十几次的弹框,这回让人非常不方便。
打开数据库查看,这一句payload的确已经存进来了。
第三关通关
。
第四关、DOM型XSS
同样也是一个平平无奇的表单。
Step.1、输入js语句测试
输入:<script>alert(document.cookie)</script>
发现没反应。
Step.2、查看页面源码
发现被包裹在a标签里面了,难怪不起作用,这稍微构造以下payload吧
Step.3、再次输入js代码编写的payload
输入:'></a><script>alert(document.cookie)</script><a href='
输入发现没有弹窗,说明这个payload不行
再尝试构造另外一个payload:#' onclick="alert(document.cookie)">
点击,发现有弹窗了
第四关通关。
第五关、DOM型XSS-S
如图,很哀伤的一个表单
Step.1、输入js语句测试
输入:<script>alert(document.cookie)</script>
没啥反应,这时候得查看页面源码
Step.2、查看页面源码
这里有个onclick事件,点开它看看
好了,看到我们输入的内容到这里来了,这直接按照第四关得步骤来吧
Step.3、输入编写好的payload
payload:#' onclick="alert(document.cookie)">
第五关通关。
第六关、XSS盲打
有点意思的一个页面
Step.1、输入payload测试
随便输入点payload吧
提交后什么都没有发生,查看一下页面源码
同样什么都没有。发现我输入得东西被post表单提交了,想不到,只能看个提示了。
原来这里要登录后台查看
Step.2、按提示查看后台
账号密码是:admin/123456,点击登录
神奇得事情发生了,一登陆,我刚才输入的2个payload都弹出了。
好家伙,原来这就叫盲打,第六关通关。
第七关、XSS之过滤
一股哲学气息扑面而来。
Step.1、输入payload测试
现在看到这种,第一反应就是扔个payload进去瞧瞧了
<script>alert(document.cookie)</script>
好的,没反应,再来看看页面源码
也没看出啥,但是能发现是使用get表单的方式提交,来,抬头看看url
就在这里了。
Step.2、分析
结合URL和返回结果,只输出了一个 “>”字符,其他的内容被过滤了,但我们完全不清楚它的过滤规则是什么,没办法,就尝试一下把URL中的payload中的部分字母变成大写吧。
Step.3、绕过过滤
把URL中的payload部分字母变成大写
显示出来了!这不立即改写一下payload
改写后的payload:'</p><script>alert(document.cookie)</script><p>'
输入后再次提交
这……看来得想想办法。
换个标签试一试吧,就尝试一下用a标签
输入的payload:<a herf="#" onclick="alert(document.cookie)">
好了,点击后面变色的内容能够直接弹出了,看来过滤规则是针对script标签的,第七关通关。
第八关、XSS之htmlspecialchars
这表单挺臭美的
Step.1、输入payload测试
老规矩,输一个payload进去试一试
查看页面源码
看到这情况,尝试改造payload,把a标签给闭合掉
Step.2、改造payload再次输入
输入的payload:#' onclick='alert(document.cookie)'>
点击查看
好了,成功弹出,第八关通关。
第九关、XSS之href输出
这次反而挺平平无奇
Step.1、输入payload测试
输入payload,发现没反应再查看页面源码
发现这里<
和>
被编码了,这样子哪怕是把a标签给闭合也不可能实现,那就只好使用函数了,因为JavaScript里面的a标签中的href属性是可以直接使用函数的。
Step.2、输入js函数格式的payload
输入payload:javascript:alert(document.cookie)
点击
好了成功输出。第九关通关。
第十关、XSS之js输出
回到原初,又是平平无奇
Step.1、输入payload测试
输入payload: <script>alert(document.cookie)</script>
发现下面多了一串乱七八糟的东西
查看页面源码
发现我输入的payload到了script标签上来了,顺便还把script标签给闭合了,所以才会出现这一串乱七八糟的东西。
Step.2、输入构造好的payload
接下来就简单了,直接重新构造payload
新的payload:';alert("cookie值是:"+document.cookie); //
这里cookie值是空获取不到,但弹窗了,第十关通关。