dwva靶场 10-14

XSS漏洞


什么是xss漏洞:

XSS又叫CSS,跨站脚本攻击。它指的是恶意攻击者往web页面插入恶意的html代码。当用户浏览该页面时,嵌入到web里面的html代码会被运行,从而达到恶意攻击用户的特殊目的。(也是一种注入漏洞)

分类

·  反射型XSS:<非持久化> 攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。

·  存储型XSS:<持久化> 代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookie(虽然还有种DOM型XSS,但是也还是包括在存储型XSS内)。

·  DOM型(在网页上,组织页面的对象被组织在一个树形结构中,用来表示文档中对象的标准模型就称为DOM,可能是存储型,也可能是反射型)XSS:基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞。

与前两者的主要区别是DOM型没有与后台服务器进行交互,而是前端DOM树解析产生的。

XSS漏洞可能带来的安全问题:

(1)窃取管理员帐号或Cookie,入侵者可以冒充管理员的身份登录后台。使得入侵者具有恶意操纵后台数据的能力,包括读取、更改、添加、删除一些信息。

(2)窃取用户的个人信息或者登录帐号,对网站的用户安全产生巨大的威胁。例如冒充用户身份进行各种操作。

(3)网站挂马。先将恶意攻击代码嵌入到Web应用程序之中。当用户浏览该挂马页面时,用户的计算机会被植入木马。

(4)发送广告或者垃圾信息。攻击者可以利用XSS漏洞植入广告,或者发送垃圾信息,严重影响到用户的正常使用。

10.DOM Based Cross Site Scripting (XSS)(基于 DOM 的跨站脚本)

DOM型XSS攻击,不存在服务器端代码,所以没有与服务器端进行交互,只是在操作DO(文件对象),也就是HTML元素,攻击者可以构造js代码,闭合元素标签执行恶意的js代码

xss常用语句

  1. <script>alert(/xss/)</script>
  2. <svg οnlοad=alert(xss)>
  3. <img src=1 οnerrοr=alert(1)>
  4. <a href=javascript:alert(1)>

low

分析代码:没有任何php代码,执行命令的只有客户端的js代码

我们在url地址栏中会发现english

 进行修改后

 medium

分析源码发现过滤了script标签 所以可以在把option和select标签闭合的前提下使用img标签

?default=>/option></select><img src=1 οnerrοr=alert(xss)>

high

分析源码发现设置了白名单,只对default进行检查,可以在english后加上注释符,其余可以与上述方法一致加<script>alert(/xss/)</script>等等

impossible

新增条件服务器不进行url的解码
我们的浏览器在请求页面的时候都会自动进行一次url的编码,但是服务器不解码,得到的内容都是url编码。
这意味着,我们提交的数据都是url编码,没有实际意义

所以我们不需要做任何事情

11.Reflected Cross Site Scripting (XSS)(反射跨站脚本)

反射型XSS是非持久性、参数型的跨站脚本。

反射型XSS的代码在Web应用参数中,例如搜索框的反射型XSS。
XSS反射型漏洞

反射型XSS的触发有后端的参与,而之所以触发XSS是因为后端解析用户在前端输入的带有XSS性质的脚本或者脚本的data URI编码,后端解析用户输入处理后返回给前端,由浏览器解析这段XSS脚本,触发XSS漏洞。

基本原理就是通过给别人发送带有恶意脚本代码参数的URL,当URL地址被打开时,特定的代码参数会被HTML解析,执行,如此就可以获取用户的COOIKE,进而盗号登陆。

low

审计代码发现直接通过$_GET方式获取name的值,之后未进行任何编码和过滤

所以直接构造<script>alert(123)</script>

 medium

审计代码发现对<script>标签做了过滤,即 name 参数中若存在 “< script >”替换为空。

可以饶过他通过修改大小写

<SCript>alert(1)</script>

或者使用事件绕过

<a href = 'javascript:alert(123)'>click</a>

high

审计代码发现已经对<script>标签做了更严格的过滤(包括大小写),其余与上一关基本一致

可以通过使用别的标签也可以达到我们的目的

<img src=1 οnerrοr=alert(123)>

impossible

审计代码发现<>失去了作用

原因:htmlspecialchars函数把预定义的字符&、”、 ’、<、>转换为HTML实体,所以我们插入的语句并不会被执行。

12.Stored Cross Site Scripting (XSS) 

存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行

low

 <?php
 
if( isset( $_POST[ 'btnSign' ] ) ) {
    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );
 //移除string字符两侧的预定义字符,预定义字符包括\t 、 \n 、\x0B 、\r以及空格,可选参数charlist支持添加额外需要删除的字符
    // Sanitize message input
    $message = stripslashes( $message );
//去除掉string字符的反斜杠\
    $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
 //函数会对字符串string中的特殊符号(\x00,\n,\r,\,‘,“,\x1a)进行转义
    // Sanitize name input
    $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
 
    // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
 
    //mysql_close();
}
 
?>
 

可以发现我们输入的message和name并没有进行XSS过滤,而且数据存储在数据库中,存在比较明显的存储型XSS漏洞

在name输入时发现对长度进行了限制,可以通过bp抓包进行随意修改

medium

审计代码发现与上一关一样,都使用htmlspecialchars()函数,将<script>标签做了过滤

方法:都可以通过bp改包修改name的长度,并且使用大小写进行绕过

<scRIPt>alert(1)</SCript>
<scr<script>ipt>alert(1)</script>

high

审计代码发现也上一关一样,对<script>进行了更严格过滤,也可以通过bp改包来实现

impossible

对Name和Message都使用了htmlspecialchars()函数做了过滤,还加了token值,进一步提高了安全性,简单地说:name和message都被实体化

总结:11与12题方法基本一致,每个难度的方法类似

13.Content Security Policy (CSP) Bypass

CSP 是一种白名单制度,实现和执行全部由浏览器完成,开发者只需提供配置。CSP 大大增强了网页的安全性。攻击者即使发现了漏洞,也没法注入脚本,除非还控制了一台列入了白名单的可信主机
内容安全策略(CSP)使服务器管理员可以通过指定浏览器应认为是可执行脚本的有效源的域来减少或消除XSS可能发生的向量。然后,兼容CSP的浏览器将仅执行从这些允许列出的域接收的源文件中加载的脚本,忽略所有其他脚本(包括内联脚本和事件处理HTML属性)。
除了限制可以从中加载内容的域之外,服务器还可以指定允许使用哪些协议; 例如(理想情况下,从安全角度来看),服务器可以指定必须使用HTTPS加载所有内容。完整的数据传输安全策略不仅包括强制HTTPS进行数据传输,还包括使用安全标记标记所有cookie,并提供从HTTP页面到其HTTPS对应项的自动重定向。站点还可以使用Strict-Transport-SecurityHTTP标头来确保浏览器仅通过加密通道连接到它们。
两种方法可以启用 CSP。
一种是通过 HTTP 头信息的Content-Security-Policy的字段。
一种是通过网页的<meta>标签

low

审计代码

 <?php
 
$headerCSP = "Content-Security-Policy: script-src 'self' https://pastebin.com  example.com code.jquery.com https://ssl.google-analytics.com ;"; // allows js from self, pastebin.com, jquery and google analytics.
 
header($headerCSP);
 
# https://pastebin.com/raw/R570EE00
 
?>
<?php
if (isset ($_POST['include'])) {
$page[ 'body' ] .= "
    <script src='" . $_POST['include'] . "'></script>
";
}
$page[ 'body' ] .= '
<form name="csp" method="POST">
    <p>You can include scripts from external sources, examine the Content Security Policy and enter a URL to include here:</p>
    <input size="50" type="text" name="include" value="" id="include" />
    <input type="submit" value="Include" />
</form>
';
 

从源代码中$headerCSP可以看出来,这里定义了受信任的站点,只能允许这几个站点的脚本才可以运行。

其中 pastebin.com 是一个快速分享文本内容的网站,这个内容我们是可控的

在源代码中给了我们测试站点https://pastebin.com/raw/R570EE00

看源代码或者F12都能看到它信任的网站

提交后后查看页面源代码,发现该被引用


 

 Medium

<?php
 
$headerCSP = "Content-Security-Policy: script-src 'self' 'unsafe-inline' 'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=';";
 
header($headerCSP);
 
// Disable XSS protections so that inline alert boxes will work
header ("X-XSS-Protection: 0");
 
# <script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(1)</script>
 
?>
<?php
if (isset ($_POST['include'])) {
$page[ 'body' ] .= "
    " . $_POST['include'] . "
";
}
$page[ 'body' ] .= '
<form name="csp" method="POST">
    <p>Whatever you enter here gets dropped directly into the page, see if you can get an alert box to pop up.</p>
    <input size="50" type="text" name="include" value="" id="include" />
    <input type="submit" value="Include" />
</form>
';

http头信息中的script-src的合法来源发生了变化,说明如下 unsafe-inline,允许使用内联资源,如内联< script>元素,javascript:URL,内联事件处理程序(如onclick)和内联< style>元素。必须包括单引号。 nonce-source,仅允许特定的内联脚本块,nonce=“TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA” 现在更加简单了,可以直接输入以下代码

 在源码中发现了注释 <script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(1)</script>,尝试输入后Include

high

发现 没有输入框

查看源代码,发现script-src ‘self’只允许加载自身js

impossible

14.JavaScript Attacks(JS攻击)

JavaScript是一种基于对象和事件驱动的、并具有安全性能的脚本语言。是一种解释型语言(代码不需要进行预编译)。通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的

low

查看源码  发现token由前台生成   并且通过md5进行加密

每一个字符串都有自己的一个token,用的是md5(rot13)加密,只有对应上了才能提交成功。

1.可以直接在前端修改value然后去控制台再执行一遍js

2.通过抓包进行修改

Medium

token生成放在单独的js文件中。最终就是把"XXphrase的值XX"字符串反转作为token。

修改value,文本框输入success,提交 Well done!

High

high.js中用了js混淆,以通过调整JS,在控制台输入正确的JS文件,使应用获取到"success"。

几个函数调用顺序及生成token的步骤如下:
1、执行token_part_1(),取phrase值并进行字符串翻转处理;
2、延迟300ms后执行token_part_2(),传入参数字符串’XX’和token值拼接并调用sha256()加密;
3、点击按钮时执行token_part_3(),将token值和字符串’ZZ’拼接并调用sha256()加密,从而得到最终的token;

impossible

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值