白帽子黑客攻防系列课程(七)文件包含漏洞

课程前言

白帽子黑客攻防系列课程第二季现已上线。

本课程仅做学习交流之用,切勿用于任何不法用途!
白帽子黑客攻防系列课程将会深入浅出讲解计算机网络基础、渗透靶场搭建、Kali Linux、系统漏洞、渗透工具(Nmap、Sqlmap、AWVS等)等的原理及实战内容。
第二季主要讲解DVWA黑客攻防演练等,配合讲解网络基础知识及Linux基础知识等。
知其然并知其所以然,相信通过学习,各位朋友对白帽子黑客攻防会有非常深刻理解。
梦想还是要有的,万一实现了呢!

网易云课堂地址:https://study.163.com/course/courseMain.htm?courseId=1209505841&share=2&shareId=480000001946405

本篇博文为文件包含漏洞要点笔记,主要介绍黑客攻防中的文件包含攻防技术。

文件包含漏洞概述

程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这种文件调用的过程一般被称为文件包含(File Inclusion)。 通过函数包含文件时,由于没有对包含的文件名进行有效的过滤处理,被攻击者利用从而导致了包含了Web根目录以外的文件进来,就会导致文件信息的泄露甚至注入了恶意代码。

1. 本地文件包含 LFI 当被包含的文件在服务器本地时,就叫本地文件包含。

2. 远程文件包含 RFI 当被包含的文件在第三方服务器时,就叫远程文件包含。 需要开启 php.ini 中的allow_url_fopen 和 allow_url_include。

include()、include_once()、require()、require_once()

include():只有代码执行到该函数时才会包含文件进来,发生错误时只给出一个警告并继续向下执行。

include_once():和include()功能相同,区别在于当重复调用同一文件时,程序只调用一次。

require():只要程序执行就包含文件进来,发生错误时会输出错误结果并终止运行。

require_once():和require()功能相同,区别在于当重复调用同一文件时,程序只调用一次。

初级原理及实操

view source

点击file1.php看地址栏

http://192.168.199.217/dvwa/vulnerabilities/fi/?page=c:\boot.ini

http://192.168.199.217/dvwa/vulnerabilities/fi/?page=http://www.baidu.com

Windows:

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

Linux:

/root/.ssh/authorized_keys /root/.ssh/id_rsa /root/.ssh/id_ras.keystore /root/.ssh/known_hosts /etc/passwd /etc/shadow /etc/my.cnf /etc/httpd/conf/httpd.conf /root/.bash_history /root/.mysql_history /proc/self/fd/fd[0-9]*(文件标识符) /proc/mounts /porc/config.gz ...

中级原理及实操

view source

// Input validation

无法使用 "http://", "https://"

$file = str_replace( array( "http://", "https://" ), "", $file );

无法使用"../", "..\""上层路径

$file = str_replace( array( "../", "..\"" ), "", $file );

http://192.168.199.217/dvwa/vulnerabilities/fi/?page=c:\boot.ini

http://192.168.199.217/dvwa/vulnerabilities/fi/?page=HTTP://www.baidu.com

"./":代表目前所在的目录。 " . ./"代表上一层目录。 "/":代表根目录。

1、文件在当前目录(以图像文件为例,当前项目文件为中心)  "./1.jpg" 或 "1.jpg"

2、文件在上层目录

(1)在上层目录下     "../1.jpg"

(2)在上层目录下的一个Image文件夹下   "../Image/1.jpg"

(3)在上上层目录下   "../../1.jpg"

3、文件在下一层目录(Image1文件夹)    "./Image1/1.jpg"

4、根目录表示法,任何页面访问Image下的Image.jpg图片    "C:/Image/1.jpg"

高级原理及实操

view source

if( !fnmatch( "file*", $file ) && $file != "include.php" ) {    

// This isn't the page we want!    

echo "ERROR: File not found!";    

exit; }

只有文件名是有 file 开头的文件才能打开

http://192.168.199.217/dvwa/vulnerabilities/fi/?page=file://c:\boot.ini

http://192.168.199.217/dvwa/vulnerabilities/fi/?page=file4.php

神仙级原理剖析

view source

// Only allow include.php or file{1..3}.php

if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {  

  // This isn't the page we want!    

echo "ERROR: File not found!";  

  exit;

}

总结

基于白名单的包含文件验证,验证被包含的文件是否在白名单中。

尽量不要使用动态包含,可以在需要包含的页面固定写好,如:include("func.php")。

对所有输入提交可能包含的文件地址,包括服务器本地文件及远程文件,进行严格的检查,参数中不允许出现../之类的目录跳转符。

可以通过调用str_replace()函数实现相关敏感字符的过滤,一定程度上防御了远程文件包含。

你可能感兴趣的:(白帽子黑客攻防,文件包含,渗透攻防,dvwa,php,代码审计)