最近,正好操作系统课上正在学进程的竞争关系,再加上寒假安恒杯2月赛上有道web题考到了条件竞争漏洞的利用,所以就系统的学习和总结下条件竞争漏洞。

一. 漏洞成因:

线程编程中,为了保证数据操作的一致性,操作系统引入了锁机制,用于保证临界区代码的安全。通过锁机制,能够保证在多核多线程环境中,在某一个时间点上,只能有一个线程进入临界区代码,从而保证临界区中操作数据的一致性。

临界区指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源又无法同时被多个线程访问的特性。

竞争条件”发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。

二.条件竞争实例:Web条件竞争

程序中多个线程之间就产生了资源竞争,这种情况发生了多次,于是最后的结果就和我们的预期不一样了。

三.Web中的条件竞争

Web服务器处理多用户请求时,是并发进行的,如果并发处理不当或者是相关的逻辑操作设计的不合理时,就可能导致条件竞争漏洞。

一个简单的例子:

将文件上传到服务器,然后检查上传的文件的类型,如果不符合条件就删除。

但是,如果我们采用多线程的方式访问上传的文件,总有一次我们在文件删除之前就访问到了这个文件,如果这个文件是php的一句话木马,就在服务器中执行了shell了哈

具体代码和利用脚本如下:

前端代码:

<html>

<head>

<metahttp-equiv="Content-Type" content="text/html;charset=utf-8">

<tile>条件竞争漏洞实例</tile>

</head>

<h3align="center">文件上传</h3>

<formmethod="post" action="upload.php"enctype="multipart/form-data">

    <table border=0 cellspacing=0cellpadding=0 align="center" width="100%">

    <tr>

        <td height="17">

        <input name="file"type="file" value="浏览">

        <input type="submit"name="file" value="上传">

        </td>

    </tr>

    </table>

</form>

</html>

后端php代码:

<?php

    $allowtype =array("gif","png","jpg");

    $size = 10000000;

    $path = "./";

 

    $filename = $_FILES['file']['name'];

 

    if(is_uploaded_file($_FILES['file']['tmp_name'])){

        if(!move_uploaded_file($_FILES['file']['tmp_name'],$path.$filename)){

            die("error:can notmove!");

        }  

    } else {

        die("error:not an upload file");

    }

 

    $newfile = $path.$filename;

    echo "file upload success.file pathis: ".$newfile."\n<br />";

 

    if ($_FILES['file']['error'] > 0){

        unlink($newfile);

        die("Upload file error: ");

    }

 

    $ext =array_pop(explode(".",$_FILES['file']['name']));//array_pop() 弹出并返回 array 数组的最后一个单元,并将数组 array 的长度减一,explode()函数把字符串打散为数组。

    if (!in_array($ext,$allowtype)){

        unlink($newfile);

        die("error:upload the file type isnot alloweddelete the file");

    }

?>

四.CTF实战

题目地址:

http://202.119.201.199/challenge/web/uploadfile/

先随便上传个图片文件,发现能够上传成功,显示要上传可执行文件

上传一个包含一句话木马的可执行的php文件
Web条件竞争

发现第三层防护,存在黑名单文件类型过滤,尝试绕过哈

发现使用.phtml能够绕过。

发现上传的文件被杀软查杀了,是上传成功才被查杀的,考虑利用条件竞争漏洞

利用pythonrequests库写一个多线程并发访问的脚本

import requests

url ="http://202.119.201.199/challenge/web/uploadfile/upload/2.phtml"

while True:

    r =requests.get(url)

    if 'flag' inr.text:

        printr.text
参考资料:https://www.0dayhack.com/post-666.html
          SKSEC公众号

相关文章:

  • 2021-10-08
  • 2021-11-17
  • 2021-08-16
  • 2021-09-26
  • 2019-09-18
  • 2019-03-19
  • 2021-09-26
  • 2021-12-03
猜你喜欢
  • 2021-09-30
  • 2021-09-25
  • 2021-07-30
  • 2021-02-15
  • 2021-08-14
  • 2021-09-17
  • 2022-01-01
  • 2021-09-21
相关资源
相似解决方案