Buu摸鱼日记(11)

 

buu摸鱼日记(11)

这个题目,是我图样了

[GKCTF2020]CheckIN

乍一看我以为是反序列化,然后仔细看了下发现我想多了,这不是个白给的shell嘛(RCE)

<?php 
highlight_file(__FILE__);
class ClassName
{
        public $code = null;
        public $decode = null;
        function __construct()
        {
                $this->code = @$this->x()['Ginkgo'];
                $this->decode = @base64_decode( $this->code );
                @Eval($this->decode);
        }

        public function x()
        {
                return $_REQUEST;
        }
}
new ClassName();

然后我就一堆操作猛如虎,先print_r(scandir(‘/’))

出了一个flag,果断print_r(readfile(“/flag”))

然而并没有什么卵用……

陷入了对人生的思考当中,后来发现phpinfo把一堆函数给禁用了


正解

从phpinfo我们可以看到php版本7.3

7.0~7.3有一个bypass漏洞

php7-gc-bypass漏洞利用PHP garbage collector程序中的堆溢出触发进而执行命令

官方有exp(麻了这不是pwn吗)

https://github.com/mm0r1/exploits/blob/master/php7-gc-bypass/exploit.php

pwn(‘要执行的语句’)

打上去然后rce即可

[GKCTF2020]cve版签到

md,找cve找到wp了,见鬼

cve-2020-7066

题不难,就把cve记录一下好了

php有着一个漏洞就是如果被\0(urlencode = %00)截断

header里面只会保留截断前的部分

比方说

http://localhost\0.example.com
header里面只会留下localhost 没有example.com那部分,可以用来绕过一些检测

[安洵杯 2019]easy_web

去年被暴打的时候做过,但是还是没做出来(我真是屑啊)

凭借记忆用img读取index.php

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

?>

那个img对他进行了一次hex两次base64,(解开这个真是需要运气和经验)

然后是md5碰撞,为了记录把这个payload记下来,非常有用

a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2&b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

强绕过md5

然后就是rce的绕过

官方wp是sort /flag,不过

因为过滤了大多常见的文件读取的命令,最后的核心考点是拿 linux 命令去 fuzz ,但是因为过滤反斜杠 |\\|\\\\| 这里的时候正则没有写好,导致了反斜杠逃逸。因此造成了 ca\t 命令可以直接读取 flag

涨了点姿势

[ASIS 2019]Unicorn shop

这玩意儿脑洞题

主要就是utf8转换,找一个奇奇怪怪的字符,来表示超过1000的数字就行

https://blog.lyle.ac.cn/2018/10/29/unicode-normalization/

https://www.compart.com/en/unicode/ 搜索一个thousand million什么的就行了

[BJDCTF2020]Mark loves cat

还以为是xss什么的,结果根本不是…

git泄露,用githack扒下来源码

然后出来一个特绕的玩意儿

<?php

include 'flag.php';

$yds = "dog";
$is = "cat";
$handsome = 'yds';

foreach($_POST as $x => $y){
    $$x = $y;
}

foreach($_GET as $x => $y){
    $$x = $$y;
}

foreach($_GET as $x => $y){
    if($_GET['flag'] === $x && $x !== 'flag'){
        exit($handsome);
    }
}

if(!isset($_GET['flag']) && !isset($_POST['flag'])){
    exit($yds);
}

if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){
    exit($is);
}



echo "the flag is: ".$flag;

因为$flag是flag,所以说我们post $flag=flag

foreach($_POST as $x($flag) => $y(flag)){ $$x = $y; }

就会让$$flag=flag

那我们get yds

所以说$yds==$flag,然后exit就会弹出flag

头有点痛,妈的