web

寻宝

开局给了源代码,那应该是考察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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);


function filter($string){
$filter_word = array('php','flag','index','KeY1lhv','source','key','eval','echo','\$','\(','\.','num','html','\/','\,','\'','0000000');
$filter_phrase= '/'.implode('|',$filter_word).'/';
return preg_replace($filter_phrase,'',$string);
}


if($ppp){
unset($ppp);
}
$ppp['number1'] = "1";
$ppp['number2'] = "1";
$ppp['nunber3'] = "1";
$ppp['number4'] = '1';
$ppp['number5'] = '1';

extract($_POST);

$num1 = filter($ppp['number1']);
$num2 = filter($ppp['number2']);
$num3 = filter($ppp['number3']);
$num4 = filter($ppp['number4']);
$num5 = filter($ppp['number5']);


if(isset($num1) && is_numeric($num1)){
die("非数字");
}

else{

if($num1 > 1024){
echo "第一层";
if(isset($num2) && strlen($num2) <= 4 && intval($num2 + 1) > 500000){
echo "第二层";
if(isset($num3) && '4bf21cd' === substr(md5($num3),0,7)){
echo "第三层";
if(!($num4 < 0)&&($num4 == 0)&&($num4 <= 0)&&(strlen($num4) > 6)&&(strlen($num4) < 8)&&isset($num4) ){
echo "第四层";
if(!isset($num5)||(strlen($num5)==0)) die("no");
$b=json_decode(@$num5);
if($y = $b === NULL){
if($y === true){
echo "第五层";
include 'KeY1lhv.php';
echo $KEY1;
}
}else{
die("no");
}
}else{
die("no");
}
}else{
die("no");
}
}else{
die("no");
}
}else{
die("no111");}
}
1
2
3
4
5
6
7
8
9
10
11
<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);


function filter($string){
$filter_word = array('php','flag','index','KeY1lhv','source','key','eval','echo','\$','\(','\.','num','html','\/','\,','\'','0000000');
$filter_phrase= '/'.implode('|',$filter_word).'/';
return preg_replace($filter_phrase,'',$string);
}

开头给我们过滤了一些词,也就是说我们给的payload不可以有这些单词,这里面感觉最有用的就是000000 了。

1
2
3
4
5
6
7
8
if(isset($num1) && is_numeric($num1)){
die("非数字");
}

else{

if($num1 > 1024){
echo "第一层";

这个第一层是必须要输入num1,且不能是数字,是数字的话,就直接进入elsedie了。
那么这里我们可以用is_numeric的一个缺陷来利用,is_numeric函数判断变量是否为数字,如果是数字返回1,否则返回0,但当输入的变量有数字和字母时,它会截取第一个字母之前的数字,且返回0,举个栗子,is_numeric(1234abc123),这里它会取1234,而后面的abc他就不要了。那这样的话我们第一层,这里我们只需ppp[number1]=2222a,只要比1024大就可以了。

1
2
if(isset($num2) && strlen($num2) <= 4 && intval($num2 + 1) > 500000){
echo "第二层";

第二层,必须输入输入num2且长度小于或等于4且这个数加一要大于500000
正常四位数最大9999显然不大于500000
这里我们可以用php里的科学计数法,1e3=1*10^3也就是说