PHP审计(一)
2018-12-03 09:26:58来源:博客园 阅读 ()
一、php中常见的危险函数和审计要点
危险函数(功能过于强大)
参数是否外部可控,有没有正确的过滤。
PHP获取外界传入参数是通过下面几个全局函数的形式,所以审计参数传入经常要和下面几个变量打交道
PHP中危险函数有五大特性:
变量 | 说明 |
$_GET | 数组,存放着所有通过URL参数传递的数据 |
$_POST | 数组,当HTTP POST请求的Content-Type是application/x-www-form-urlencoded或multipart/form-data的部分解析成关联数组 |
$_FILES | 数据,存放着HTTP POST上传的文件信息 |
$_COOKIE | 数组,存放着HTTP头里面cookie段内容 |
$_REQUEST | 数组,默认情况下包含了$_GET, $_POST, $_COOKIE的数据 |
$_SERVER | 数组,包含了HTTP头,服务器环境等信息 |
$_SESSION | 数组,存放当前会话可用的session变量 |
参数是否可控
执行任意代码函数
1)把传入的字符串直接当成php代码直接执行,如:
A | B | C | D | |
1 | 函数 | 函数说明 | 例子 | 运行结果 |
2 | assert | 判断一个断言是否为false | assert('print(123)') | 输出123 |
3 | eval | 把一个字符串当做php代码执行 | eval('echo 123') | 输出123 |
4 | create_function | 用给的一个字符串创建匿名函数 | create_function('$a','print($a);')(123) | 输出123 |
2)通过引入文件的形式执行php代码,如:(利用:查看这些引入文件参数是否外部可控)
A | B | C | D | |
1 | 函数 | 函数说明 | 例子 | 结果 |
2 | include | 包含并运行指定文件 | include '1.php' | 包含文件1.php,并执行里面的代码 |
3 | include_once | 包含并运行指定文件 | include_once '1.php' | 包含文件1.php,并执行里面的打码 |
4 | require | 包含并运行指定文件 | require '1.php' | 包含文件1.php,并执行里面的代码 |
5 | require_once | 包含并运行指定文件 | require_once '1.php' | 包含文件1.php,并执行里面的代码 |
3)数据处理函数
函数 | 函数说明 | 例子 | 结果 | |
1 | preg_replace | 使用正则替换内容,php7之前的正则表达式参数可以开启\e的模式,执行任意代码 | preg_replce("/(.)/e",'print(\1),'123'); |
php5下输出123 |
2 | array_map | 为数组的每个元素应用回调函数 | $b=array_map('assert',['print(123)']); | php5下输出123 |
3 | array_filter | 用回调函数过滤数组中的单元 | array_filter(['print(123)'],'assert'); | php5下输出123 |
4 | array_walk | 使用用户自定义函数对数组中的每个元素做回调处理 |
$a=['print(123)'];array_walk($a,'assert') |
php5下输出123 |
5 | call_user_func | 把第一个参数作为回调函数调用 | call_user_func('assert','print(123)'); | 输出123 |
4)能够读取网络资源的函数(配置 allow_url_include=1 才可以使用)
函数 | 函数说明 | 例子 | 结果 | |
1 | curl系列 | 发起网络请求 | ||
2 | file_get_contents | 原本功能是读取文件,但是支持封装协议,所以可以读取网络上的资源 | file_get_contents('https://url.com') | 请求url.com |
3 | file | 原本功能是读取文件,但是支持封装协议,所以可以读取网络上的资源 | file('https://url.com') | 请求url.com |
4 | fopen | 原本功能是读取文件,但是支持封装协议,所以可以读取网络上的资源 | fopen('https://url.com') | 请求url.com |
5 |
copy |
原本功能是复制文件,但是支持封装协议,所以可以读取网络上的资源 | copy('https://url.com') | 请求url.com,并保存txt文档 |
5)能够执行系统命令或者调用外部程序的函数
函数 | 函数说明 | 例子 | 结果 |
exec | 执行一个外部程序 | exec('touch 1.txt') | 在当前目录下生成1.txt |
shell_exec |
通过shell执行命令,并且将完整的输出以字符串的方式返回 | shell_exec('touch 1.txt') | 在当前目录下生成1.txt |
system | 执行外部程序,并显示输出 | system('touch 1.txt') | 在当前目录下生成1.txt |
passthru | 执行外部程序,并显示输出 | passthru('touch 1.txt') | 在当前目录下生成1.txt |
popen | 打开进程文件指针 | popen('touch 1.txt','r') | 在当前目录下生成1.txt |
proc_open | 执行一个命令,并打开用来输入/输出的文件指针 | proc_open('touch 1.txt',[],$a) | 在当前目录下生成1.txt |
`` | 反引号包含的内容会当成系统命令执行 | `touch 1.txt` | 在当前目录下生成1.txt |
6)能够修改运行时候的上下文环境
函数 | 函数说明 | 例子 | 结果 |
extract | 从数组中将变量导入到当前的符号表,审计时候需要判别传输数组是否外部可控 | $a='1';extract(['a'=>'2']);echo $a | 输出2 |
parse_str |
将字符串解析成多个变量 | $a='1';parse_str('a=2');echo $a | 输出2 |
ini_set | 修改运行时php配置 | ini_set('memory_limit','2048M') | 设置运行时最大占用额内存为2048M |
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- PHP写UltraEdit插件脚本实现方法 2020-03-29
- php 带逗号千位符数字的处理方法 2020-03-28
- PHP三元运算符的结合性介绍 2020-03-28
- PHP静态延迟绑定和普通静态效率的对比 2020-03-28
- 基于php流程控制语句和循环控制语句 2020-03-28
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash