命令执行的bypass技巧

颓废 2019年5月19日10:58:04评论850 views字数 847阅读2分49秒阅读模式
摘要

首先感谢p总提供的精妙思路
在一些存在命令执行漏洞的地方,通常程序员也会做一些过滤
但是这些过滤往往只是针对某些特定字符,或者关键字的,因此存在绕过的方法。
首先我们来看看在UNIX shell下的一些特殊变量

首先感谢p总提供的精妙思路
在一些存在命令执行漏洞的地方,通常程序员也会做一些过滤
但是这些过滤往往只是针对某些特定字符,或者关键字的,因此存在绕过的方法。
首先我们来看看在UNIX shell下的一些特殊变量

PS2变量,被定义为>号
PS4变量,被定义为+号
Internal Field Separator(IFS)
IFS,也被称为内部字段分隔符,是一个在shell下的特殊变量
它通常包含空格,tab,以及换行符,默认被shell视为一个分隔符
因此,我们可以使用它来代替空格
比如,我们需要输入ls /home
可以使用ls{$IFS}/home 或者 ls$IFS/home

命令执行的bypass技巧

成功的执行了命令

因此,用IFS变量可以绕过对于空格等的过滤
使用<管道符也可以绕过对空格的过滤,如cat<123.txt
感谢@pupiles的文章,提到了如果$IFS后直接跟数字字母,导致被当做变量名
需要用到$IFS$9,如 cat$IFS$91
$9只是当前系统shell进程的第九个参数的持有者,它始终为空字符串
如果有php环境,那么%09也是可以使用的

接下来,我们再看看针对常见字符串过滤的绕过方法

一种常见的方法是
使用wget 16进制ip
再执行文件
但是这种方法受到目录可写权限的限制,有时候会不太好用
另一种方法则是使用base64 -d
使用管道符号 echo xxx|base64 -d|bash

命令执行的bypass技巧

而我们还可以用$variable:start 的方法提取环境变量中从start位开始到结尾的字符
或者$variable:start:end 来提取从start位到end位的字符
为防止歧义,必须写成${variable:start:end}的形式
对于有python等脚本语言的环境
也可以使用python -c ''的方法来执行解码绕过

此外expr表达式也可用于字符串的提取

比如expr表达式
$(expr substr $PATH start end)
当然$()其实等效于

因此`expr substr $PATH start end` 也可以正常使用

作者 Blog of Mathias

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
颓废
  • 本文由 发表于 2019年5月19日10:58:04
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   命令执行的bypass技巧http://cn-sec.com/archives/68668.html

发表评论

匿名网友 填写信息