DVWA攻略-06-Weak IDS / CSP

@ [toc]

#12弱会话ID 参考链接:作者:JOJO_2046 [DVWA黑客攻防演练(七)弱会话ID](https://www.cnblogs.com/jojo-feed/p/10174011.html)

弱会话IDS

当用户登陆服务器时,服务器就会创建一个会话会话,然后分配一个会话id给用户,以表示标识用户的身份。用户拿到会话id后就会加密保存到Cookies上,之后用户再次访问服务器时,只要用户拿着cookies便可以直接进入而不需要登陆了。

12.1,低

php <?php $ html =“”; if($ _SERVER ['REQUEST_METHOD'] ==“ POST”){if(!isset($ _SESSION ['last_session_id'])){$ _SESSION ['last_session_id'] = 0; } $ _SESSION ['last_session_id'] ++; $ cookie_value = $ _SESSION ['last_session_id']; setcookie (“ dvwaSession” ,$ cookie_value ); } ?>

由源码可得,用户点击一下generate便可生成一个session id了。
在这里插入图片描述
如下,是在控制台看见的session和cookie,比较容易伪造。
在这里插入图片描述

12.2、medium

<?php

$html = "";

if ($_SERVER['REQUEST_METHOD'] == "POST") {
	$cookie_value = time();
	setcookie("dvwaSession", $cookie_value);
}
?>

由源码可得,这里的cookies是生成的时间戳。也比较容易猜解。
在这里插入图片描述

12.3、high

<?php

$html = "";

if ($_SERVER['REQUEST_METHOD'] == "POST") {
	if (!isset ($_SESSION['last_session_id_high'])) {
		$_SESSION['last_session_id_high'] = 0;
	}
	$_SESSION['last_session_id_high']++;
	$cookie_value = md5($_SESSION['last_session_id_high']);
	setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], false, false);
}

?>

由源码可得,这里的cookie是由md5加密后的。
在这里插入图片描述
md5解密平台:https://www.cmd5.com/

因此我们需要将它解密,解密后,如下:
在这里插入图片描述

12.4、impossible

<?php

$html = "";

if ($_SERVER['REQUEST_METHOD'] == "POST") {
	$cookie_value = sha1(mt_rand() . time() . "Impossible");
	setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], true, true);
}
?>

sha1() 函数计算字符串的 SHA-1 散列。
sha1() 函数使用美国 Secure Hash 算法 1。

SHA-1是一种数据加密算法,该算法的思维是接纳一段明文,然后以一种不可逆的方式将它转换成一段(一般更小)密文, 也能够简略的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。

在这里插入图片描述

mt_rand() 使用 Mersenne Twister 算法返回随机整数。
语法:mt_rand(min,max)
说明:如果没有提供可选参数 min 和 max,mt_rand() 返回 0 到 RAND_MAX 之间的伪随机数。例如想要 5 到 15(包括 5 和 15)之间的随机数,用 mt_rand(5, 15)。

很多老的 libc 的随机数发生器具有一些不确定和未知的特性而且很慢。PHP 的 rand() 函数默认使用 libc 随机数发生器。mt_rand() 函数是非正式用来替换它的。该函数用了 Mersenne Twister 中已知的特性作为随机数发生器,它可以产生随机数值的平均速度比 libc 提供的 rand() 快四倍。

time() 函数,返回当前时间戳。
返回自 Unix 纪元(January 1 1970 00:00:00 GMT)起的当前时间的秒数。

13.CSP Bypass

参考链接:
【XSS技巧拓展】————7、CSP浅析与简单的bypass

Content Security Policy (CSP)内容安全策略,是一个附加的安全层,有助于检测并缓解某些类型的攻击,包括跨站脚本(XSS)和数据注入攻击。

简单来说,csp就是为了减少xss,csrf等攻击的,是通过控制可信来源的方式,类似于同源策略。
如果标签或服务器返回的标签当中含有Content Security Policy标签,浏览器会更根据标签里面的内容判断加载和执行的i资源

CSP以白名单的机制对网站加载或执行的资源起作用。在网页中,这样的策略通过 HTTP 头信息或者 meta 元素定义。CSP虽然提供了强大的安全保护,但是他也造成了如下问题:Eval及相关函数被禁用、内嵌的JavaScript代码将不会执行、只能通过白名单来加载远程脚本。这些问题阻碍CSP的普及,如果要使用CSP技术保护自己的网站,开发者就不得不花费大量时间分离内嵌的JavaScript代码和做一些调整…

13.1、low

在这里插入图片描述

F12,打开network,如下,我们可以发现这里罗列除了允许JavaScript的网站,
在这里插入图片描述

Content-Security-Policy: script-src 'self' https://pastebin.com  example.com code.jquery.com https://ssl.google-analytics.com http://192.168.10.208:8081/;

此时,我们可以上pastebin 网站上自己写一个JavaScript代码 。【这里我在里面添加了一个本地的域名,然后再本地搭建了一个xss平台,所以我输入的链接也是以一个xss的链接】

然后在上面输入框中输入我的xss链接。

在这里插入图片描述
点击include按钮,然后在我的xss平台上查看信息,如下,表示插入成功。
在这里插入图片描述

接下来,我们来查看一下它的源码。

<?php

$headerCSP = "Content-Security-Policy: script-src 'self' https://pastebin.com  example.com code.jquery.com https://ssl.google-analytics.com http://192.168.10.208:8081/;"; // 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>
';

13.2、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>
';

头部** $ headerCSP**发生了变化,如下:

$headerCSP = "Content-Security-Policy: script-src 'self' 'unsafe-inline' 'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=';"; 

http头信息中的script-src的合法来源发生了变化,说明如下

  • unsafe-inline,允许使用内联资源,如内联< script>元素,javascript:URL,内联事件处理程序(如onclick)和内联< style>元素。必须包括单引号。
  • nonce-source,仅允许特定的内联脚本块,nonce=“TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA”

现在可以直接输入以下代码.

<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert('CSP')</script>

在这里插入图片描述
在这里插入图片描述

13.3、high

(从这里开始,我放上大佬的解释吧,帮助各位看官更好的理解。)

以下为high.php文件

<?php
$headerCSP = "Content-Security-Policy: script-src 'self';";

header($headerCSP);

?>
<?php
if (isset ($_POST['include'])) {
$page[ 'body' ] .= "
	" . $_POST['include'] . "
";
}
$page[ 'body' ] .= '
<form name="csp" method="POST">
	<p>The page makes a call to ' . DVWA_WEB_PAGE_TO_ROOT . '/vulnerabilities/csp/source/jsonp.php to load some code. Modify that page to run your own code.</p>
	<p>1+2+3+4+5=<span id="answer"></span></p>
	<input type="button" id="solve" value="Solve the sum" />
</form>

<script src="source/high.js"></script>
';

?>

以下为high.js文件。

    document.body.appendChild(s);
}

function solveSum(obj) {
	if ("answer" in obj) {
		document.getElementById("answer").innerHTML = obj['answer'];
	}
}

var solve_button = document.getElementById ("solve");

if (solve_button) {
	solve_button.addEventListener("click", function() {
		clickButton();
	});
}

在这里插入图片描述

这个级别已经没有输入框了, 不过题目已经给了足够多的提示. 首先先看一下 CSP 头, 发现只有 script-src 'self';, 看来只允许本界面加载的 javascript 执行. 然后研究了一下这个点击显示答案的逻辑(逻辑在 source/high.js里), 大致如下: 点击按钮 -> js 生成一个 script 标签(src 指向 source/jsonp.php?callback=solveNum ), 并把它加入到 DOM 中 -> js 中定义了一个 solveNum 的函数 -> 因此 script 标签会把远程加载的 solveSum({"answer":"15"}) 当作 js 代码执行, 而这个形式正好就是调用了 solveSum 函数, 然后这个函数就会在界面适当的位置写入答案.
本来嘛, 应该是没办法修改在服务器的 jsonp.php文件的(除非结合别的漏洞, 拿 shell 后修改). 然而, 我后来在查看服务端源码的时候发现了这个:
在这里插入图片描述
竟然还偷偷接收 include 参数(不清楚是不是作者复用了之前 Medium 的代码). 总之, 这肯定能作为一个注入点, 我开始打算用简单粗暴的 <script>alert('hacked')</script>来搞定的, 谁知道, 这种是属于 ‘unsafe-inline’ 形式的, 所以被限制执行了. 嗯… 既然如此的话, 那我就利用 src 吧。
在这里插入图片描述

这个甚至你不看源码,你做几个测试也会发现,那个回调参数可以被阻止以生成任何你想要的结果,比如Alert,因此可以构造 Payload:<script src =“ source / jsonp。 php?callback = alert('hacked');“> </ script>,并把这个当做include参数传给界面就注入成功!

13.4,不可能

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200716173432859.png)
如下,可见链接已经写死,无法修改了。

** CSP内容安全策略学习资料:https://content-security-policy.com/ **

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值