目录
最近在网上看到了很多RCE相关的知识和文章,这是一个危害比较大的漏洞,如果可以利用,就有机会直接获取到目标的权限,那么在这里我就参考几位大佬的好文章来对RCE学习一下
1、代码执行与命令执行介绍
为什么把代码执行和命令执行都称为RCE呢?看看它们的英文就可以知道:
代码执行-Remote code execution
命令执行-Remote command execution.
英文的单词首字母都是RCE,所以这两个漏洞都被称为RCE
在计算机安全中,任意代码执行(RCE)是攻击者在目标机器或目标进程中运行攻击者选择的任何命令或代码的能力。
任意代码执行漏洞是软件或硬件中允许任意代码执行的安全漏洞。设计来利用这种漏洞的程序被称为任意代码执行漏洞。
通过网络(特别是通过Internet等广域网)触发任意代码执行的能力通常被称为远程代码执行(RCE)”
简单来说就是可以通过漏洞可以在目标计算机上执行计算机上的命令
下面我会分别参考大佬的文章对代码执行和命令执行进行基础知识的介绍
2、shell符号的使用
而在执行命令当中,我们会用到很多的shell符号,符号的用法如下
cmd1 | cmd2 只执行cmd2
cmd1 || cmd2 只有当cmd1执行失败后,cmd2才被执行
cmd1 & cmd2 先执行cmd1,不管是否成功,都会执行cmd2
cmd1 && cmd2 先执行cmd1,cmd1执行成功后才执行cmd2,否则不执行cmd2
Linux中支持分号进行拼接执行 :
php当中支持反引号进行拼接执行:
可以看到使用''(单引号)时只会将将字符串内容原样输出,但是当使用``(反引号)时,会把字符串解析为代码来执行
3、代码执行常用函数
eval()
eval():将字符串当做函数进行转换(需要传入一个完整的语句),即用于执行一个字符串作为 PHP 代码。
assert()
assert():判断是否为字符串,如果是字符串就会当做代码执行
call_user_func()
call_user_func:回调函数,可以使用is_callable查看是否可以进行调用
call_user_fuc_array
call_user_fuc_array():回调函数,参数为数组,可以传递多个参数给回调函数。返回回调函数的返回值。适用于动态函数调用。
create_function()
create_function():创建匿名函数,接受两个字符串参数:参数列表和函数体。返回一个匿名函数的引用。
preg_replace()
preg_replace():当为/e(正则表达式)时代码会执行,前提是不超过php7,用于执行正则表达式的搜索和替换。接受三个参数:模式(正则表达式)、替换值和目标字符串。
可以是单个字符串或数组。返回修改后的字符串或数组。适用于基于模式匹配修改文本内容。
array_map()
array_map():,用于将回调函数应用于数组的每个元素。接受一个回调函数和一个或多个数组。返回一个新数组,数组元素是回调函数应用于原始元素的结果。适用于转换或处理数组元素。
array_filter()
array_filter():依次将array数组中的每个值传递到callback函数。如果callback函数返回true,则array数组的当前值会被包含在结果的数组中。数组的键名保留不变,适用于基于条件移除数组中的元素。
usort()
usort():使用自定义函数对数组进行排序,用于对数组进行自定义排序,接受数组和比较函数作为参数。比较函数确定元素间的排序顺序,排序后的数组不保留原始键名。适用于根据用户定义的规则排序数组元素。...$GET是php5.6引入的新特性。即将数组展开成参数的形式
用法:
1[]=phpinfo()&1[]=123&2[]=assert
大致过程:
大概过程就是,GET变量被展开成两个参数['phpinfo', '123']和assert,传入usort函数。
usort函数的第二个参数是一个回调函数assert,其调用了第一个参数中的phpinfo();
uasort()
uasort():使用用户自定义的比较和拿书对数组的值进行排序并保持索引关联
${}
${}:中间的php代码会被解析
4、命令执行常用函数
system()
system:可以执行系统命令,并且将其输出
exec()
exec:执行命令符,但是没有输出,可以配合output进行输出
shell_exec()
shell_exec:执行命令,但是无回显,需要配合output使用
passthru()
passthru:执行命令并且输出
反引号
反引号:执行shell命令,并且输出字符串
ob_start()
ob_start:打开输出控制缓冲
5、pikachu靶场中的RCE
这里使用pikachu靶场中的RCE模块来简单的练习一下RCE漏洞
可以看到靶场是这样介绍RCE的:
RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。
远程系统命令执行
一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口
比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上
一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。
而,如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器
现在很多的甲方企业都开始实施自动化运维,大量的系统操作会通过"自动化运维平台"进行操作。 在这种平台上往往会出现远程系统命令执行的漏洞,不信的话现在就可以找你们运维部的系统测试一下,会有意想不到的"收获"-_-
远程代码执行
同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。
因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。
exec "ping"
来到exec "ping"模块,可以看到如下页面,是一个输出框,并且提示我们可以输入一个ip地址:
虽然乱码了,但是还是可以看到是ping成功了,这里就可以尝试用&来再后面在加上一个命令看是否会执行:
可以看到,&两边的代码都执行了,这就说明存在命令执行漏洞
exec "eval"
来到exec "eval"模块,可以看到如下页面,让我们提交一个字符串
尝试提交一个hello,会有输出,那么我们尝试提交一下php代码:
可以看到输入phpinfo();后,成功的执行了,说明这里存在代码执行漏洞的
6、DoraBox靶场中的RCE
这里在用DoraBox靶场来做一个演示,原理和上面的pikachu靶场都差不多
任意代码执行
任意命令执行
到此,RCE相关的基础知识就学习完毕了,后面还有很多RCE的知识要学习,再见(*^▽^*)
参考链接: