MENU

PHP pathinfo() 函数导致的安全问题

January 3, 2017 • Security

定义和用法

pathinfo() 函数以数组或字符串的形式返回关于文件路径的信息。

返回的数组元素如下:

[dirname]:返回文件路径中的目录部分
[basename]:返回文件路径中文件名的部分
[extension]:返回文件路径中文件的类型的部分

语法

pathinfo(path,options) 

参数

  • path:必需。规定要检查的路径。
  • options 可选。规定要返回的数组元素。默认是 all。

可能的值:

PATHINFO_DIRNAME - 只返回 dirname
PATHINFO_BASENAME - 只返回 basename
PATHINFO_EXTENSION - 只返回 extension

提示和注释

注释:如果不是请求所有的元素,则 pathinfo() 函数返回字符串。

php开启pathinfo 路由模式:pathinfo 模式 需要 php.ini 开启下面这个参数
cgi.fix_pathinfo=1
path_info模式:http://www.xxx.com/index.php/模块/方法

实例 1

<?php
print_r(pathinfo("/testweb/test.txt"));
?>

上面的代码将输出:

Array
(
[dirname] => /testweb
[basename] => test.txt
[extension] => txt
)

实例 2

<?php
var_dump(pathinfo("/testweb/test.txt",PATHINFO_DIRNAME));
var_dump(pathinfo("/testweb/test.txt",PATHINFO_BASENAME));
var_dump(pathinfo("/testweb/test.txt",PATHINFO_EXTENSION));
?>

上面的代码将输出:

string(8)"/testweb"
string(8)"test.txt"
string(3)"txt"

应用

目录不可控没有执行权限

16123022340e3babf582337de7.png

pathinfo,一种伪静态的用法,path_info模式:http://www.xxx.com/index.php/模块/方法

1612302234c8a7c30574f3c554.png

sb.txt被当成了模块,实际上请求的还是6.php

16123022357f47bae71cfc24cb.png

一句话就执行了。

过WAF注入

本地安装apache安全狗

已知在开启pathinfo的情况下(默认开启)可以这样访问

161230224446894a0596d07bd8.png

常用注入语句被拦截

1612302246b891df2ec85854bd.png

pathinfo模式不拦截

16123022471ddc22efcae9939c.png

抛砖引玉,更多用途请自测!

参考

Tags: PHP
Archives QR Code
QR Code for this page
Tipping QR Code