命令执行-过滤了字母或者过滤了数字+字母的绕过方法

  总结下命令执行绕过字母数字的一些小技巧。

0x01 原理

  管理员为了防止任意用户输入的恶意代码导致的命令执行,在用户输入处加了一层waf拦截,waf可能是通过正则匹配过滤了字母,也可能是通过正则匹配过滤了字母和数字。

0x02 过滤了字母的绕过方式 <?php /* # -*- coding: utf-8 -*- # @Author: Lazzaro # @Date: 2020-09-05 20:49:30 # @Last Modified by: h1xa # @Last Modified time: 2020-09-07 20:03:51 # @email: h1xa@ctfer.com # @link: https://ctfer.com */ // 你们在炫技吗? if(isset($_GET['c'])){ $c=$_GET['c']; if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)){ system($c); } }else{ highlight_file(__FILE__); }

代码审计
  过滤了字母 分号 反引号 百分号 和 %09 %26 <>
但是可以观察到其实没有过滤空格。

0x02.1 使用 /bin/base64 xxx 进行绕过

  Linux的bin目录一般保存了所有的二进制命令, 正常我们输入的cat xxx啥的 其实也可以通过/bin/cat 打开文件,而哪种命令打开文件还能带有数字呢? 可以尝试使用 base64 去打开文件,将文件以base64编码输出

命令执行-过滤了字母或者过滤了数字+字母的绕过方法


命令执行-过滤了字母或者过滤了数字+字母的绕过方法

base32

命令执行-过滤了字母或者过滤了数字+字母的绕过方法

base64

命令执行-过滤了字母或者过滤了数字+字母的绕过方法


虽然这样输入依然有字母,但是我们可以通过通配符?去绕过,而且因为有了数字,匹配的会更加准确
如果直接使用通配符是不行的,因为这在Linux无法通过????去找到命令

命令执行-过滤了字母或者过滤了数字+字母的绕过方法


这里因为我用kali测试的

命令执行-过滤了字母或者过滤了数字+字母的绕过方法


测试过程中发现居然还有别的目录被匹配到了,笑了

命令执行-过滤了字母或者过滤了数字+字母的绕过方法


改成32进行测试,发现也不行

命令执行-过滤了字母或者过滤了数字+字母的绕过方法


服了
测试成功的一次是

命令执行-过滤了字母或者过滤了数字+字母的绕过方法


如果全用通配符的话 会匹配到别的东西

命令执行-过滤了字母或者过滤了数字+字母的绕过方法


如果只改回一个为字母,则能正常匹配,至少能正常匹配了,kali直接使用/bin/base32 去匹配的话可能有问题。
应该是如果要执行命令的话一定要绝对路径,因为指针指向的可能是绝对路径的地址,所以这里要想使用通配符的话必须通过/usr/bin/base64去执行命令。
这里因为测试的时候发现/bin/x11/base32 可用所以直接

命令执行-过滤了字母或者过滤了数字+字母的绕过方法


但是这是kali。
题目的正常解法可以直接 /bin/base64 flag.php => /???/????64 ????????
可能是因为题目服务器配置比较干净吧
了解原理就行了。

0x02.2 使用 /usr/bin/bzip2 去压缩文件夹

可以发现我的Kali东西比较多。。。

命令执行-过滤了字母或者过滤了数字+字母的绕过方法


发现又是x11

命令执行-过滤了字母或者过滤了数字+字母的绕过方法


不折腾了
常规操作,如果是比较干净的linux系统直接 /???/???/???2 ????????
最后????????是 flag.php
压缩后 直接 访问 对应的url即可比如 访问 https:/xx/flag.php.bz2 可用直接下载

0x02.3 使用.去执行sh文件

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zydxfx.html