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
也就是说