一、环境的搭建
可以在githb上找靶机包,使用小皮面板搭建在自己本机
与此文章类似(放在www目录下)
二、XSS漏洞简介
1、什么是xss漏洞
当用户访问被xss注入的网页,xss代码就会被提取出来。用户浏览器就会解析这段xss代码,也就是用户被攻击了。
用户最简单的动作就是使用浏览器上网,并且浏览器中有js解释器,可以解析js,然而由于浏览器不具有人格,不会判断代码是否具有恶意行为,只要代码符合语法规则,浏览器就可以解析这段xss代码。
简单来说,xss就是通过攻击者精心构造的js代码注入到网页中,并且浏览器解释运行了这段恶意的js代码,以达到恶意攻击浏览器的效果。
xss的攻击对象是用户浏览器,属于被动攻击,因此xss攻击涉及到三个角色
- 攻击者
- 用户浏览器
- 服务器
当然不要以为xss属于客户端攻击,受害者是用户,就会以为跟自己的网站、服务器安全就没有关系,网站的管理员也是用户之一,知识相对普通用户权限更高。
实现xss攻击需要具备的两个条件:
- 需要向Web页面注入精心构造的恶意代码
- 对用户的输入没有做果过滤,恶意代码能被浏览器成功执行
2、XSS漏洞的类型
xss漏洞的位置通常在于Web应用程序的输入验证或者输出过滤不严格的地方
类型:
- 存储型XSS(Stored XSS):攻击者将恶意脚本存储在服务器上,当其他用户访问这些恶意脚本的网页时,就会触发XSS漏洞
- 反射型XSS(Reflected XSS):恶意脚本作为URL参数发送给服务器,服务器将恶意脚本插入到返回的页面中,用户访问该页面就会执行该脚本
-
DOM-based XSS:攻击不涉及服务器端,而是通过修改页面的DOM结构来实现攻击,通常通过修改客户端脚本中的DOM元素来触发漏洞。
三、开始闯关
在此之前补充三个弹窗函数
alert()
confirm()
prompt()
反射型XSS
1、level1
语句插入
从源码可以看到,后端是get接收参数,并且没有过滤,
那么我们直接在参数的后面加上script标签
?name=test<script>alert(1)</script>
结果:
2、level2
和第一关差不多,按刚才的输入以此,看下情况
可以看到,我们的输入被原米原样输出,没有弹出警告框
看下后端源代码,我们的参数会经过这个过滤函数
htmlspecialchars()会将&
(& 符号)、"
(双引号)、'
(单引号)、<
(小于)、>
(大于)等符号转换成HTML实体编码。
那么在h2标签中我们无法进行注入,但可以看到下面的input标签还有一个输出点,
在这里我们只需要绕过双引号和闭合尖括号就可以实现
效果:
test"><script>alert(0)</script>
第二种方法:鼠标点击事件onclock
也是对input标签进行操作,闭合前一个单引号,在后面加上点击事件的属性
test"onclick="alert(1)
点击一下:
3、level3
先试着用上一关的闭合单双引号试试,
这时候我们使用点击事件,来进行注入,先将单引号闭合
test'onclick='alert(1)
点击,查看效果
4、level4
我们在使用上一关的方法,直接使用利用属性,看能不能过
很明显可以直接过
看下源码,看考察的点是什么?
他在考查看我们input的闭合,会将尖括号替换为空
5、level5
我们直接在试一下上一关的方法
可以看到我们的onclick被过滤替换了
我们看源码,都替换了哪些
可以看到我们是不能再使用script标签了,带on的事件关键字也不能用了
我们不妨直接将input前面的标签闭合掉,使用a标签在href后直接使用javascript伪协议
1"><a href="javascript:alert(1)">1</a
6、level6
直接看源码可以看到,将我们上一关用的href也过滤掉了
在html的标签中,浏览器在解析过程中会忽略大小写的,而我们可以看到上面都是过滤小写,那我们不妨可以试试大小写绕过
(当然在javascript内部是严格区分大小写的)
1 " OnCLick="alert(1)
7、level7
我们可以看到这关是将关键词替换为空进行过滤,那么我们可以进行双写实现绕过
1"oonnclick="alert(1)
8、level8
此处添加友情链接,那么不就可以用我们a标签里href的javascript伪协议了吗
但可惜的是被过滤掉了
那我们直接使用编码就行
javascript:alert(1)
9、level9
查看源码可以看到过滤了我们很多关键字,并且必须需要加上http://才可以
那我们针对这些过滤使用实体编码来绕过
javascript:alert('http://;')
很明显我们添加上了我们想要的东西