PHP代码审计之命令执行篇

admin 2023年5月1日03:35:08评论52 views字数 4663阅读15分32秒阅读模式



这是【炼石计划@PHP代码审计】知识星球第二阶段的原创基础系列文章,拿出部分课程分享给零基础的朋友学习。本系列原创基础文章涵盖了PHP代码审计中常见的十余种WEB漏洞,是匹夫老师精心的创作,欢迎关注我的公众号跟着一起学习。


【炼石计划@PHP代码审计】是一个系统化从入门到提升学习PHP代码审计的成长型知识星球。这里不仅注重夯实基础,更加专注实战进阶。强烈推荐加入我们,一起来实战提升PHP代码审计。

PHP代码审计之命令执行篇


进入正文


PHP代码审计之命令执行

1.命令执行原理

通过调用PHP中命令执行函数,且函数中的参数可控就会造成命令执行。以Web中一句话木马为例,常见的PHP一句话木马<?php system($_REQUEST['value']); ?>,这里通过system()函数将前端传入的值当做系统命令执行,其中value参数由前端传入。

1.1 命令执行示例代码

cmd.php

下面示例代码将前端传入的value参数值带到system()命令执行函数中去执行,值得注意的是system()函数自带回显,不用使用echo或者var_dump()进行输出。

<?php
$sys = $_REQUEST['value'];
$cmd = system($sys);
?>

value传入calc.exe即可调用system()函数弹出计算器。

PHP代码审计之命令执行篇

2.命令执行相关函数

exec()shell_exec()system()popen()passthru()proc_open()pcntl_exec()、 反引号``实际上是使用shell_exec()函数。

exec()

该函数无回显需使用echo进行输出,且只返回执行后的最后一行结果

示例代码:

<?php
$sys = $_REQUEST['value'];
$cmd = exec($sys);
echo $cmd;
?>

我们执行ipconfig只返回了结果中最后一行结果

PHP代码审计之命令执行篇

执行whoami结果将不受影响,因为返回结果只有一行

PHP代码审计之命令执行篇

shell_exec()

该函数无回显需使用echo或者var_dump进行输出,但返回结果所有内容

示例代码:

<?php

$sys = $_REQUEST['value'];
$cmd = shell_exec($sys);
var_dump( $cmd);
?>

我们传入系统命令ipconfig则会输出所有结果

PHP代码审计之命令执行篇

``反引号

反引号其实调用的是shell_exec()函数,当反引号中的变量可控时就会造成命令执行,且无回显。

示例代码:

<?php
$sys = $_REQUEST['value'];
$cmd = `$sys`;
echo $cmd;
?>

我们传入系统命令ipconfig则会输出所有结果

PHP代码审计之命令执行篇

system()

该函数会将输入的参数当做命令执行,有回显且返回所有内容。在实战中也是最常见的造成命令执行漏洞的函数之一。

这里注意:如果目标是LInux则执行Bash命令,如果是Windows则执行cmd命令。

passthru()

该函数与上述system()函数类似,也可将输入的参数当做命令执行,且函数执行后有回显。

示例代码:

<?php
$sys = $_REQUEST['value'];
$cmd = passthru($sys);
?>

我们传入系统命令dir则会输出所有结果

PHP代码审计之命令执行篇

popen()

该函数通常用于打开进程文件指针,但如果传入的参数可控也可造成命令执行,且该函数无回显,通过echo不回直接返回执行的结果,而是返回的是文件指针。

PHP代码审计之命令执行篇

示例代码:

<?php

$sys = $_REQUEST['value'];
$cmd = popen($sys,'r');
var_dump($cmd); ;
?>

这里调用我们的popen()函数执行calc.exe打开了计算器。

PHP代码审计之命令执行篇

proc_open()

执行一个命令,并且打开用来输入/输出的文件指针。 类似 popen()函数,但是 proc_open() 所需参数更多,且处理数据能力更强。

3.系统命令执行

在很多IoT设备如路由器中会存在如下类似的代码,本来设计的功能点是测试网络通信情况,但由于传入的参数没有进行严格的过滤就传入到命令执行函数中,最终导致命令执行。

ping.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
 <meta charset="utf-8" />
 <title>系统命令执行demo</title>
 <meta name="keywords" content="" />
 <meta name="description" content="" />
</head>
<body>
<div id="main">
 <div class="title">Ping功能测试</div>
 <form  action="ping.php" method="post" onsubmit="return enter()">
   <label><input class="text" type="text"  placeholder="请输入IP地址" name="ip" /></label>
   <label><input class="submit" type="submit" name="submit" value="测试" /></label>
 </form>
</div>

</body>
</html>

ping.php

<?php
header("content-type:text/html;charset=gbk");

if(isset($_POST['submit'])){
   $target = $_REQUEST['ip'];
   //php_uname()判断当前操作系统是否为Windows NT
   if(stristr(php_uname('s'),'Windows NT')){    
       
       $cmd = shell_exec('ping '.$target);
       echo '<pre>'.$cmd.'<pre>';
       
  }else{
       
       $cmd = shell_exec('ping -c 3 '.$target);
       echo '<pre>'.$cmd.'<pre>';
  }

}

我们使用|来分割前面的ping命令,将我们的ipconfig命令单独分割出来造成命令执行。

PHP代码审计之命令执行篇

由于|会直接执行后面的命令,所以直接输出了ipconfig的内容。

PHP代码审计之命令执行篇

4.命令执行漏洞利用姿势

常见管道符

由于Linux和Windows中命令执行的方式不同,Linux中执行的是bash命令,而Windows执行的是cmd命令。常见的管道符如下:

Windows:

| 直接执行后面的语句

PHP代码审计之命令执行篇

|| 如果前面执行的语句出错,那么才执行后面的语句

PHP代码审计之命令执行篇

& 前面和后面的语句都会被执行

PHP代码审计之命令执行篇

&& 前面语句出错后面的语句也不执行,只有前面的语句成功执行才执行后面的语句

PHP代码审计之命令执行篇

Linux:

Linux中除了上面的管道符外还有一个;

; 前面的语句执行完成后,继续执行后面的语句。

PHP代码审计之命令执行篇

这些管道符大家可以可以在cmd命令行或者bash命令行进行测试,一般情况下如果在命令行中可以成功执行的话,在真实的业务系统也是可以执行的。

5.命令执行代码审计总结

在PHP中还有很多函数可以造成命令执行,但在代码审计中常见的命令执行危险函数已经给大家列出,大家在PHP代码审计中只要多留意这些函数且该函数的参数是可以被我们所控制,这是命令执行漏洞存在的关键。下部分会讲PHP中的代码执行函数,其实命令执行和代码执行都是一样的,命令执行可以通过调用代码执行的函数实现代码执行,代码执行也可以通过调用命令执行的函数来实现命令执行。



【心动瞬间】

2023 年的【炼石计划@PHP代码审计】主题是【挖 0day,交 CNVD】,目标是今年将带每个人冲刺三张 CNVD 证书(两中一高,你只需认认真真的学习,我则用心手把手的教你。

首先冲刺第一张,其次冲刺第二张,最后冲刺第三张,最后恭喜你获得三张专属于自己的 CNVD 证书!

是不是看我说的还挺简单的,要我说,确实不难,毕竟世上无难事,只怕有心人!

另外这事又遇到了【炼石计划@PHP代码审计】,那就又简单了些。

【炼石计划@PHP代码审计】这里是一个专注 PHP 代码审计,系统化从基础入门到实战提升学习 PHP 代码审计的地方。这里不仅注重夯实基础,更加专注实战进阶。从基础概念知识开始学习,配合项目级系统实战演练,共六大学习阶段,一百二十余篇原创教程,带你提升真正的 PHP 代码审计技术!利用碎片化时间学习也会让你有不菲的收获,总之这里一定是你不错的选择。加上 2023 年主题是【挖 0day,交 CNVD】,目标是带大家挖掘两中一高 CNVD 证书,激情碰撞下来,收获最多的一定是你!


毫不夸张说,认真学习下来,相当于 96 元买了三张 CNVD 证书和一身 PHP 代码审计的技术,随随便便挖个漏洞都是这个数的好几倍!

如果说一年认真学习下来,你还没拿到证书,这事我负责!


来,下面跟随我一起瞅瞅学习计划,看看我们是如何完成这个目标的!

【第一阶段】

入门学习 PHP 语言基础与 WEB 安全漏洞(约 10 篇)

我们首先关注 PHP 语言,掌握 PHP 基础语法。其次关注 WEB 漏洞入门学习,并掌握 WEB 常见漏洞概念。


【第二阶段】

学习 PHP 代码审计中的 WEB 常见漏洞(约 12 篇)

学习 PHP 下常见的 WEB 安全相关漏洞代码,并且补充学习常见的 WEB 安全漏洞。

这部分主要关注常见的 WEB 漏洞函数,关键在于了解和记住,进而在下一阶段活学活用。


【第三阶段】

实战代码审计24套基于PHP开发的系统(约 50 篇)

提升 PHP 代码审计能力,一定要从实战出发。我们选取 24 套开源 CMS 系统进行代码审计手把手讲解。从挖掘 CNVD 角度出发,发现和理解常见的 WEB 漏洞,为提交 CNVD 证书打下实战基础。

下面是目前分享的系统,剩余还在调试选型中。代码审计漏洞讲解越往后分享的系统越新鲜热乎。


【第四阶段】

PHP相关系统历史漏洞复现(约 50 篇)

该阶段与前面阶段进行穿插分享。主要关注历史和最新的 PHP 相关系统漏洞复现,并且着重从代码审计层面进行分享。让大家逐渐有独立分析的能力,而不是只会使用 POC。

并且在有着历史漏洞分析的基础上,进而可以对其他版本的系统进行代码审计,发现和挖掘漏洞!

PHP代码审计之命令执行篇

到这,我们基本就可以上手针对相关系统进行漏洞挖掘了,着手提交 CNVD 证书了,提交重复撞洞不可怕,这都是对自己的磨炼,有问题我们可以一起探讨!

下面是进阶学习阶段。


【第五阶段】

PHP 反序列化漏洞讲解与利用链分析(约 12 篇)

反序列化可以说是代码审计中非常重要的一部分。但很多朋友学着那是一个痛苦,云里雾里的。

在这里我们将系统学习 PHP 反序列化漏洞。先从PHP反序列化基础知识讲起。在从简入深学习POP链。让你真正掌握PHP反序列化。


【第六阶段】

系统学习ThinkPHP框架与代码审计分析(约 12 篇)

近几年 ThinkPHP 框架漏洞可以说是 PHP 系统漏洞的主力军。

是非常值得我们需要学习的,在这个阶段,我们从 ThinkPHP 框架基础学起,配合历史漏洞代码深入分析。让大家可以对 ThinkPHP 框架有个深入的了解。

从框架角度出发,分析漏洞,总结经验,在框架面前,可以更加得心应手!


好啦,上面就是我们的学习计划,实际上分享会更加精彩!

心动不如行动,赶紧加入,犹豫就会败北!

早加入早内卷,早拿 CNVD 证书!


PHP代码审计之命令执行篇


【不割韭菜,只做干货,如果加入后觉得价格比不上内容的,直接开团我就行

包括之前的java星球,都是干货,保证能让你学到东西,肯学想学的无脑进吧!我自己也在学】




原文始发于微信公众号(哈拉少安全小队):PHP代码审计之命令执行篇

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年5月1日03:35:08
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   PHP代码审计之命令执行篇http://cn-sec.com/archives/1700755.html

发表评论

匿名网友 填写信息