wp-LuckySeed2(session|随机数播种)

题目

<?php
error_reporting(0);
session_start();
highlight_file(__FILE__);
include "flag.php";
$login = $_GET['id'];
if(!@isset($login['cookie'])||$login['cookie'] != @md5($_SESSION['flag'])){
    die('error!');
}else{
    mt_srand(substr($login['cookie'],17,7));
    $content = "<?php \$flag="."'".$flag."'"."?>";
    $filename = (string)mt_rand().".php";
    file_put_contents($filename,$content);
    mt_srand(mt_rand());
    if ($_POST['key'] == mt_rand())
    {

        echo file_get_contents(${$_POST[mt_rand()]});
    }
}

WP

显然代码审计
返回包参考:
在这里插入图片描述
并没有什么特别的

绕过第一个筛选的关键在于$_session,对于session总是模模糊糊的,它与cookie,token的区别也总感觉不清楚。

顺便来学习一下吧:

session

首先cookiesession的出现是为了解决http协议的无状态问题,服务器每一次收到请求都认为是客户端全新的请求,不能包含历史状态,这两个东西就是来解决这个问题

除了flask等特殊结构,session储存在本地,其他情况下服务端会为这次请求开辟一块内存空间,这个对象便是 Session 对象,存储结构为 ConcurrentHashMapSession 弥补了 HTTP 无状态特性,服务器可以利用 Session 存储客户端在同一个会话期间的一些操作记录。

对于全局的session,我们知道它是以键值对的形式来得到session结果的。“键”是通过包来传出的,当客户端第一次发出请求后,服务器返回的包中会带上一个响应头set-cookie,同时在服务器端上创建一个独属于你的session,接下来每一次客户端的请求都需要带上这个cookie,通过这个cookie就能找到”值“,这样键值对就完成了。

显然,session的使用场景就出现了,一方面可以维持用户的接通状态,从一个页面登陆后,可以跳转至有对应权限的页面,拒绝未授权用户访问。另一方面,可以跟踪程序状态,比如购物车在多个商品页面跳转,维持购物车状态根据历史操作更新。最后也可以进行页面参数传递,通过专属id提取专属变量。

显然可以看到,session技术是基于cookie来的,而客户端为了安全是可以禁用cookie的,这时有可能将session_id附在url上传递。

cookie

那么cookie也很好理解了,值的设置同样也是通过set-cookie完成,但是不仅仅只能设置session,还能够设置为其他服务器认为有意义的值,你可以将cookie想象为地基,session只是上面的一个高楼而已(只是一种利用方式)

相对地,它的作用也更加基础,主要用于”会话管理“-登陆,记录游戏分数,购物车等等,”个性化“-用户偏好,主题等等,”追踪“-分析和记录用户行为。由于后两种行为涉及隐私问题,所以现在 cookie有禁用选项。

从时间上来说,cookie还分为会话cookie永久cookie,一种是 Session Cookies,一种是 Persistent Cookies,如果 Cookie 不包含到期日期,则将其视为会话 Cookie。会话 Cookie 存储在内存中,永远不会写入磁盘,当浏览器关闭时,此后 Cookie 将永久丢失。如果 Cookie 包含有效期 ,则将其视为持久性 Cookie。在到期指定的日期,Cookie 将从磁盘中删除。

但是web浏览器可能会使用会话还原技术,看起来浏览器从未关闭。

Cookie 的 SecureHttpOnly 标记
安全的 Cookie 需要经过 HTTPS 协议通过加密的方式发送到服务器。即使是安全的,也不应该将敏感信息存储在cookie 中,因为它们本质上是不安全的,并且此标志不能提供真正的保护。

HttpOnly 的作用

会话 Cookie 中缺少 HttpOnly 属性会导致攻击者可以通过程序(JS脚本、Applet等)获取到用户的 Cookie 信息,造成用户 Cookie 信息泄露,增加攻击者的跨站脚本攻击威胁。

HttpOnly 是微软对 Cookie 做的扩展,该值指定 Cookie 是否可通过客户端脚本访问。

如果在 Cookie 中没有设置 HttpOnly 属性为 true,可能导致 Cookie 被窃取。窃取的 Cookie 可以包含标识站点用户的敏感信息,如 ASP.NET 会话 ID 或 Forms 身份验证票证,攻击者可以重播窃取的 Cookie,以便伪装成用户或获取敏感信息,进行跨站脚本攻击等。

可以通过相关设置来设定能够接受cookie的设备,这也防止了爬虫等工具的利用

token

Json Web Token 的简称就是 JWT,通常可以称为 Json 令牌。它是RFC 7519 中定义的用于安全的将信息作为 Json 对象进行传输的一种形式。JWT 中存储的信息是经过数字签名的,因此可以被信任和理解。可以使用 HMAC 算法或使用 RSA/ECDSA 的公用/专用密钥对 JWT 进行签名。

其作用和session大同小异,所以容易弄混,它是通过对应的加密算法用来识别身份的令牌,以JWT为例

JWT 主要由三部分组成,每个部分用 . 进行分割,各个部分分别是Header,Payload,Signature,主要指定的东西为:使用的签名算法,有关用户的其他数据声明,签名信息(base64的header+payload +secret)既然是签名,那当然也可以认证了,一般用在登陆和修改密码的地方(识别修改密码的对象)

绕过

首先第一绕过就是既存在login中的cookie,还需要与session的flag对应的session的md5值相等,这里你可能有点晕呼呼的,要与md5匹配,难道我要花长时间碰撞吗?

其实不然,你可以观察sessid的设置,sessid的设置是通过ip,时间戳等一系列数据通过散列函数完成的。在没有手动设置的情况下,是没有flag的对应的session,也就是说,这里所谓的md5,其实是对null的md5值,也就是固定值。
在这里插入图片描述
然后是id中的cookie,用数组传就可以了。
那么第一个绕过就是

?id[cookie]=d41d8cd98f00b204e9800998ecf8427e

随机数与随机数种子

下面的函数,最关键的就是
mt_srand()mt_rand()

基本性的概念如下:
两次循环调用rand()所产生的随机数序列是一样的。是的,这就是伪随机数了,就好像是在系统中已经有了一个0~RAND_MAX的一个乱序序列,我们调用rand()的时候都是参照这个序列和随机种子的,这里没有设置随机种子,因此随机种子为1,当随机种子为x的时候,我们可以根据这个随机种子x来计算出一个随机数f(x, m),其中m为这个序列中的伪随机数。例如,当随机种子为2,函数为线性的,调用一次rand()的时候产生的随机数就为241,第二次调用产生的随机数就为218467了。

从这里我们发现,如果随机种子是固定的,那么每次调用rand()依然可以计算出来了,因此,这里的随机种子希望可以是不可预测的,我们可以取为当前时间,用time()函数来获取当前时间作为随机种子,然后与序列与当前时间进行计算得出随机数,则每次调用rand()的时候随机种子就是变化的,因此,我们产生的随机数就是不可预测的了。

那么很明显,这里需要得到mt_rand的值,当播种值确定时,这个值也是确定的。最后分别用key,mt_rand()的值传参得到结果。filename已经准备好了。

直接在你的php环境中写出来看看即可

在这里插入图片描述
解释一下这个写法,在写文件名称时,进行了一次随机产生,所以有第一次,然后再次播种,在判断key的那里进行了随机产生,所以有了第二次,最后file_get_contents()进行了随机产生,就是第三次。而要用到的就是最后两次,得到这两个数字。

post的数据为:

key=954576979&1277894509=filename

在这里插入图片描述

posted @ 2021-10-04 10:10  Sayo-NERV  阅读(50)  评论(0编辑  收藏  举报