2023/03/22-23
8. 命令执行漏洞和代码执行漏洞详解
详解命令执行漏洞_命令执行漏洞实践[04:53]_H3rmesk1t的博客-CSDN博客
命令执行漏洞和代码执行漏洞详解 一文了解命令执行漏洞和代码执行漏洞_命令执行漏洞与代码执行漏洞的异同_思源湖的鱼的博客-CSDN博客
- 代码执行实际上是调用服务器网站代码进行执行
- 命令执行是调用操作系统命令进行执行
8.1 命令执行漏洞:
1. 命令执行:RCE
Web应用的脚本代码在执行命令的时候过滤不严,从而注入一段攻击者能够控制的代码,在服务器上以web服务的后台权限远程执行恶意指令。
- 代码层过滤不严
- 系统的漏洞造成命令注入
- 调用的第三方组件存在代码执行漏洞
常见的命令执行函数
PHP:exec、shell_exec、system、passthru、popen、proc_open等
ASP.NET:System.Diagnostics.Start.Process、System.Diagnostics.Start.ProcessStartInfo等
Java:java.lang.runtime.Runtime.getRuntime、java.lang.runtime.Runtime.exec等
2.常用命令执行函数
- system —执行外部程序,并显示输出
该函数会把执行结果输出,并把输出结果的最后一行作为字符串返回,如果执行失败则返回false
<?php
highlight_file(__FILE__);
system('pwd');
system('whoami');
?>
- exec—执行一个外部程序
不输出结果,返回执行结果的最后一行,可以使用output进行输出
<?php
highlight_file(__FILE__);
exec('pwd',$b);
var_dump($b);
?>
- passthru— 执行外部程序,并显示原始输出
函数只调用命令,并把运行结果原样地直接输出,并没有返回值
<?php
highlight_file(__FILE__);
passthru('ls');
?>
- shell_exec— 通过shell环境执行命令,并且将完整的输出以字符串的方式返回
不输出结果,返回执行结果,使用反引号(``)时调用的就是此函数
<?php
highlight_file(__FILE__);
var_dump(shell_exec('ls'));
?>
- ob_start
函数将打开输出缓冲,当输出缓冲激活后,脚本将不会输出内容(除http标头外),相反需要输出的内容被存储在内部缓冲区中
内部缓冲区的内容可以用ob_get_contents()函数复制到一个字符串变量中,想要输出存储在内部缓冲区中的内容,可以使用ob_end_flush()函数。另外, 使用ob_end_clean()函数会静默丢弃掉缓冲区的内容
<?php
ob_start("system");
echo "whoami";
ob_end_flush();
?>
3. 命令连接符
windows和linux都支持的命令连接符:
cmd1 | cmd2 :只执行cmd2
cmd1 || cmd2: 只有当cmd1执行失败后,cmd2才被执行
cmd1 & cmd2 :先执行cmd1,不论成功与否,都会执行cmd2
cmd1 && cmd2:先执行cmd1,cmd1成功执行后执行cmd2,否则不执行cmd2
linux支持分号;
cmd1 ; cmd2 :按照顺序依次执行,先执行cmd1,再执行cmd2
4. 危险函数利用
- system:
<?php
highlight_file(__FILE__);
if(isset($_REQUEST['url'])){
$url = ($_REQUEST['url']);
$b = system($url, $a);
echo $a.PHP_EOL;
echo $b.PHP_EOL;
}
?>
恶意代码执行:
?url = dir
文件写入:
? url = echo 11111 > flag.php
- passthru:
执行外部程序并且显示原始输出
<?php
highlight_file(__FILE__);
if(isset($_REQUEST['url'])){
$url = ($_REQUEST['url']);
passthru($url,$a);
echo $a.PHP_EOL;
}
?>
调用系统命令,将信息写入22.txt
- exec:
执行command参数所指定的命令
需要注意的一点exec要有echo才有回显
<?php
highlight_file(__FILE__);
if(isset($_REQUEST['url'])){
$url = ($_REQUEST['url']);
echo exec($url);
}
?>
- shell_exec与exec基本相似
通过shell环境来执行命令