php allow_url_include的应用和解释

因为这个原因,许多安全研究人员建议在php.ini配置中禁用指向allow_url_fopen。不幸的是,许多推荐这种方法的人,并没有意识到,这样会破坏很多的应用并且并不能保证100%的解决remote URL includes以及他带来的不安全性。

通常,用户要求在他们使用其他的文件系统函数的时候,php允许禁止URL包含和请求声明支持。

因为这个原因,计划在PHP6中提供allow_url_include。在这些讨论之后,这些特性在php5.2.0 中被backported。现在大多数的安全研究人员已经改变了他们的建议,只建议人们禁止allow_url_include。

不幸的是,allow_url_fopen和allow_url_include并不是导致问题的原因。一方面来说在应用中包含本地文件仍然是一件足够危险的事情,因为攻击者经常通过sessiondata, fileupload, logfiles,...等方法获取php代码………

另一方面allow_url_fopen和allow_url_include只是保护了against URL handles标记为URL.这影响了http(s) and ftp(s)但是并没有影响php或date(new in php5.2.0) urls.这些url形式,都可以非常简单的进行php代码注入。

Example 1: Use php://input to read the POST data




<?php
// Insecure Include
// The following Include statement will
// include and execute everything POSTed
// to the server

include "php://input";
?>

Example 2: Use data: to Include arbitrary code




<?php
// Insecure Include
// The following Include statement will
// include and execute the base64 encoded
// payload. Here this is just phpinfo()

include "data:;base64,PD9waHAgcGhwaW5mbygpOz8+";
?>

把这些放到我们的运算里面将会非常明显的发现既不是url_allow_fopen也不是url_allor_include 被保障。这些只是因为过滤器很少对矢量进行过滤。能够100%解决这个URL include vulnerabilities的方法是我们的Suhosin扩展.

(0)

相关推荐

  • php 中include()与require()的对比

    php的require()与include(),在性能方面并无大的不同. 仅有的一些不同在于: include()执行时文件每次都要进行读取和评估: require()执行时文件只处理一次(实际上,文件内容替换了require()语句). 即如果有包含这些指令之一的代码和可能执行多次的代码,则使用require()效率比较高. 另外,如果每次执行代码时要读取不同的文件,或有通过一组文件叠代的循环,就应该使用include(),因为可以给想要包括的文件名设置一个变量,当参数为include()时使

  • php include,include_once,require,require_once

    include_once和require_once的作用差不多,就是在包含的时候检查被包含的文件是不是已经包含过,如果包含过,那就不执行,否则再包含.我先说这个的原因是因为如果把include,require弄清楚了.那这点就没问题. 现在来说include和require的区别: require()函数包含进来的内容被当成当前文件的一个组成部分,所以当包含进来的文件有语法错误或者文件不存在的时候,那当前文件的PHP脚本都不再执行. include()函数相当于指定这个文件的路径,当被包含的文件

  • set_include_path和get_include_path使用及注意事项

    set_include_path 设置默认包含路径 在include或require文件的时候,先在默认包含路径里面找,然后在同目录下找 例: D:/xampp/htdocs/test/include 下有一文件为cls.mysqli.php D:/xampp/htdocs/test/ 下有一文件为set_include_path.php 里面的内容为 复制代码 代码如下: set_include_path('/xampp/htdocs/test/include'); //请注意php里边的'/

  • php中echo()和print()、require()和include()等易混淆函数的区别

    1.echo和print的区别 PHP中echo和print的功能基本相同(输出),但是两者之间还是有细微差别的.echo输出后没有返回值,但print有返回值,当其执行失败时返回flase.因此可以作为一个普通函数来使用,例如执行下面的代码后变量$r的值将为1. $r = print "Hello World"; 这意味着print可用在一些复杂的表达式中,而echo则不行.但是,因为echo语句不要求返回任何数值,所已在代码中echo语句的运行效率要略微快于print语句. 2.i

  • php include的妙用,实现路径加密

    1.中转程序include.inc 复制代码 代码如下: <? include_once 'include/Base.php'; $path = ''; $url = isBase::decrypt(urlDecode($_SERVER['QUERY_STRING'])); parse_str($url); //获取通过url地址GET传递过来的变量 if(!empty($_POST['path'])){ //获取POST传递过来的变量 $path = $_POST['path']; $path

  • php allow_url_include的应用和解释

    因为这个原因,许多安全研究人员建议在php.ini配置中禁用指向allow_url_fopen.不幸的是,许多推荐这种方法的人,并没有意识到,这样会破坏很多的应用并且并不能保证100%的解决remote URL includes以及他带来的不安全性. 通常,用户要求在他们使用其他的文件系统函数的时候,php允许禁止URL包含和请求声明支持. 因为这个原因,计划在PHP6中提供allow_url_include.在这些讨论之后,这些特性在php5.2.0 中被backported.现在大多数的安全

  • 编译和解释的区别是什么

    编译和解释的区别是什么? 编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快; 而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的. 这是因为计算机不能直接认识并执行我们写的语句,它只能认识机器语言(是二进制的形式) 一.低级语言与高级语言 最初的计算机程序都是用0和1的序列表示的,程序员直接使用的是机器指令,无需翻译,从纸带打孔输入即可执行得到结果.后来为了方便记

  • 解释执行和编译执行的区别?

    一:编译器 编译器是一种特殊的程序,它可以把以特定编程语言写成的程序变为机器可以运行的机器码.我们把一个程序写好,这时我们利用的环境是文本编辑器,这时我们把程序称为源程序,在此以后程序员可以运行相应的编译器,通过指定需要编译的文件的名称就可以把相应的源文件(通过一个复杂的过程)转化为机器码了. 二:机器码 机器语言(machine language)是一种指令集的体系.这种指令集,称机器码(machine code),是电脑的CPU可直接解读的. 三:目标程序 目标程序又称"目的程序"

  • qqwry.dat的数据结构图文解释第1/2页

    输入:IP地址--->输出:这个IP地址所在的国家,地名,有时甚至能精细到楼层. 网络上的IP数据库以纯真版的最为流行,LumaQQ也采用了纯真版IP数据库做为IP查询功能的基础.不过关于其格式的文档却非常之少,后来终于在网上找到了几份文档,才知道其内幕,现在将我对Qqwry.dat的数据结构的理解展现出来.让更多人明白它的内幕. 详解解构: 1.         qq.dat的数据存储格式: 1.1三大块: 文件头: 记录区: 索引区: 如图: 1.2详细解释三大块: 1.2.1第一块:文件头

  • MySQL5.7中 performance和sys schema中的监控参数解释(推荐)

    1.performance schema:介绍 在MySQL5.7中,performance schema有很大改进,包括引入大量新加入的监控项.降低占用空间和负载,以及通过新的sys schema机制显著提升易用性.在监控方面,performance schema有如下功能: ①:元数据锁: 对于了解会话之间元数据锁的依赖关系至关重要.从MySQL5.7.3开始,就可以通过metadata_locks表来了解元数据锁的相关信息: --哪些会话拥有哪些元数据锁    --哪些会话正在等待元数据锁

  • 数据库 三范式最简单最易记的解释

    书上讲了好多, 归结起来3句话: 1NF:字段不可分; 2NF:有主键,非主键字段依赖主键; 3NF:非主键字段不能相互依赖; 解释: 1NF:原子性 字段不可再分,否则就不是关系数据库; 2NF:唯一性 一个表只说明一个事物; 3NF:每列都与主键有直接关系,不存在传递依赖; 不符合第一范式的例子(关系数据库中create不出这样的表): 表:字段1, 字段2(字段2.1, 字段2.2), 字段3 ...... 存在的问题: 因为设计不出这样的表, 所以没有问题; 不符合第二范式的例子: 表:

  • MySql创建带解释的表及给表和字段加注释的实现代码

     1 创建带解释的表 CREATE TABLE groups( gid INT PRIMARY KEY AUTO_INCREMENT COMMENT '设置主键自增', gname VARCHAR(200) COMMENT '列注释' ) COMMENT='表注释'; 2 修改现有列,加上解释 alter table test_data modify column test_desc int comment 'xxxx'; 3  修改现有表,加上解释 ALTER TABLE test_data

  • JS作用域闭包、预解释和this关键字综合实例解析

    本文实例分析了JS作用域闭包.预解释和this关键字.分享给大家供大家参考,具体如下: var number = 2; var obj = {number : 5, fn1 : ( function() { this.number *= 2; number=number*2; var number=3; return function() { this.number *= 2; number*=3; alert(number); } } )() }; var fn1 = obj.fn1; ale

  • cmd批处理转义字符%的详细解释

    1.%是个ESCAPE字符,通常将之译为转义字符,但也有更形象的译名脱逸字符.逃逸字符等.也就是说%不仅仅将与其相关的特定字符串转义并替换为特定字符串,而且自身也会被"脱逸".而且类似于C语言中的转义字符"\",双%会转义并脱逸为单%,四%则脱为双%. 2.for本身是一个特殊的命令,类似于一个特化的命令解释器,因为它的功能实现需要执行多条语句,因此它必须也具有对命令行(特指do后的命令行)分析处理的功能.而command/cmd实现for时自然会借用自身原有的命令

  • 弹出消息的bat代码(msg命令详细解释)

    复制代码 代码如下: msg * "ok" msg.exe命令是将消息发送给用户. MSG {username | sessionname | sessionid | @filename | *} [/SERVER:servername] [/TIME:seconds] [/V] [/W] [message] username 标识指定的用户名. sessionname 会话名称. sessionid 会话 ID. @filename 识别这样一个文件,该文件含有将所发消息 发送到的用

随机推荐