[安洵杯 2019]easy_web 1

打开题目

 抓个包看一下

 这里有一个base64编码传输的图片,get提交有2个传参,img可能是文件对象,cmd可能是执行命令的

img参数是经过处理的

 前面是2次base64加密,后面那一串并不是很敏感,不知道是16进制,还是做太少了

 得到了555.png文件名

那是不是可以反过来,把数据进行编码再传过去,传一下index.php试一下

 

 把index.php传过去,得到了index.php的base64编码

 解码一下

 源码:

<?php
error_reporting(E_ALL || ~ E_NOTICE);
header('content-type:text/html;charset=utf-8');
$cmd = $_GET['cmd'];
if (!isset($_GET['img']) || !isset($_GET['cmd'])) 
    header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
//解码得出真实文件名
$file = hex2bin(base64_decode(base64_decode($_GET['img'])));
//将文件名中的一些特殊符号替换为空
$file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
//不能直接读flag文件
if (preg_match("/flag/i", $file)) {
    echo '<img src ="./ctf3.jpeg">';
    die("xixi~ no flag");
} else {
    //将文件base64编码后传到前端
    $txt = base64_encode(file_get_contents($file));
    echo "<img src='data:image/gif;base64," . $txt . "'></img>";
    echo "<br>";
}
echo $cmd;
echo "<br>";
//禁用的函数或特殊符号列表
if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {
    echo("forbid ~");
    echo "<br>";
} else {
    //md5强碰撞
    if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
        //反引号,可以执行该命令
        echo `$cmd`;
    } else {
        echo ("md5 is funny ~");
    }
}

?>

对代码进行审计,file参数是用来读源码,后面主要是cmd,a,b的传参

代码对cmd进行了过滤,过滤了我所知道查看文件的命令,但使用\就可以进行绕过

 

 

 

md5碰撞可以用fastcoll来获取值,用fastcoll.exe -p *txt -o *.txt *.txt 生成文件,第一个参数文件内容可以随便写也可以是空的,然后读取文件的md5值

 

测试结果:

 

直接读取flag

 

posted @ 2023-10-01 17:05  jtmqd  阅读(21)  评论(0)    收藏  举报