• PHP命令执行漏洞初探


    PHP命令执行漏洞初探

    Mirror王宇阳 by

    PHP 命令执行

    PHP提供如下函数用于执行外部应用程序;例如:system()、shell_exec()、exec()、passthru()

    system()

    <?php
        $host = $argv[1];
    	system("ping ".$host);
    ?>
    

    在服务端运行php.exe index.php 192.168.2.1

    执行php.exe index.php "|net user"(这里的“|”符号的作用时屏蔽源代码的ping字符)

    passthru() — 执行外部程序并且显示原始输出
    proc_open() — 执行一个命令,并且打开用来输入/输出的文件指针。
    shell_exec() — 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。
    popen() — 通过 popen() 的参数传递一条命令,并对 popen() 所打开的文件进行执行

    eval()

    PHP中的eval()函数可以把参数字符串按照PHP代码来动态执行,输入的字符串必须是合法的PHP代码字段并以分号结尾

    <?php
    	eval($_REQUEST['code']);
    	// $_REQUEST:支持GET和POST两种请求的数据
    ?>
    

    在URL中插入?code=phpinfo();利用GET方法向服务器请求,服务端的index.php处理代码中的eval()函数会将请求的字符串做为PHP代码执行

    动态调用

    <?php
    	function T1() {
    		echo "<script>alert('Hello,World!');</script>";
    		return 0 ;
    	}
    
    	function T2() {
    		echo "<script>alert('Error');</script>";
    		return 0 ;
    	}
    
    	$fun = $_REQUEST['fun'];
    	echo $fun();
    	// 当fun的value为:phpinfo时,在php的echo中构成 phpinfo()
    ?>
    

    当然了,并不会仅仅只执行一个phpinfo()、T1()……

    <?php
    	$fun = $_GET['fun'];
    	$par = $_GET['par'];
    	$fun($par);
    ?>
    

    PHP的其它危险函数

    array_map()

    <?php
    	$arr = $_GET['arr'];
    	$array = array(1,2,3,4,5);
    	$new_array = array_map($arr, $array);
    ?>
    

    array_map() 返回用户自定义函数处理后的数组

    assert()

    bool assert(mixed $assertion [,string $description])
    

    检查一个断言是否为False;把字符串$description作为PHP代码进行执行

    preg_replace()

    执行一个正则表达式的搜索和替换

    mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
    

    pattern 要搜索的正则匹配模式

    replacement 用于替换的字符串或数组

    subject 要进行搜索和替换的字符串或数组

    include

    include $file
    

    在变量$file可控的情况下,我们就可以包含任意文件,从而达到getshell的目的;

    由于不同的配置环境和不同的包含文件分为:远程文件包含和本地文件包含

    文件操作函数

    copy:拷贝文件

    file_get_contents:将整个文件读入为一个字符串

    file_put_contents:将一个字符串写入文件

    file:把整个文件读入一个数组中

    fopen:打开文件或者 URL

    move_uploaded_file:将上传的文件移动到新位置

    readfile:输出文件

    rename:重命名一个文件或目录

    rmdir:删除目录

    unlink & delete:删除文件

    特殊函数

    phpinfo():这个文件里面包含了PHP的编译选项,启动的扩展、版本、服务器配置信息、环境变量、操作系统信息、path变量等非常重要的敏感配置信息

    使用软连接读取文件内容

    symlink():一般是在linux服务器上使用的,为一个目标建立一个连接,在读取这个链接所连接的文件的内容,并返回内容

    环境变量

    getenv:获取一个环境变量的值

    putenv($a) :添加$a到服务器环境变量,但环境变量仅存活于当前请求期间。 在请求结束时环境会恢复到初始状态。

    推荐文章: PHP代码审计——常见危险及特殊函数

  • 相关阅读:
    整理了一份FAQ,新手看一下
    分享:pythonbitstring 3.1.2 发布
    分享:TokuDB v7 发布,并宣布全面开源
    在美国学CS能挣多少钱?美国IT公司标准 offer package详细数字及绿卡政策 | 美国留学申请与就业找工作咨询博客|Warald|一亩三分地论坛
    写的split带改进
    分享:一个多进程并发执行程序ps命令 ls命令
    分享:vi/vim使用进阶: 指随意动,移动如飞 (一)
    waning rm i rm rvfi
    分享:C++中头文件、源文件之间的区别与联系
    分享:神奇的动归状态转移方程——最优子序列
  • 原文地址:https://www.cnblogs.com/wangyuyang1016/p/11794817.html
Copyright © 2020-2023  润新知