目录
简介
条件竞争,发生在多个线程或进程在读写一个共享数据时,结果依赖于他们执行的相对时间的情形。
举例
前期准备
在phpStudy的WWW目录下,写两个文件。
![](https://i-blog.csdnimg.cn/blog_migrate/6207d7e9b3bc31e50a2b5e89958b5948.png)
condition_race.php内容:
<?php
$cnt=file_get_contents("count.txt");
//count.txt的初始内容为0
$cnt+=1;
echo "This site was visited $cnt times.";
file_put_contents("count.txt",$cnt);
?>
分析: 代码读取了一个共享数据,count.txt里面的值。如果有大量的访问产生,导致几乎同一时刻有多个file_get_contents函数对文件进行读取。例如,有两个线程A与B都在运行fiile_get_contents函数,A、B都是读出来了10,$cnt都是10,A将$cnt+1后存入文件,文件内容为11,B同样,结果,文件中的内容为11,但其实应该为12。
count.txt内容:
0
打开phpStudy
BP-Intruder攻击
浏览器设置好代理,进行拦截。
![](https://i-blog.csdnimg.cn/blog_migrate/b37203c07e332777d3bd0196b03ccb44.png)
右键,发送到Intruder模块。设置无payloads,进行1000次请求访问。
![](https://i-blog.csdnimg.cn/blog_migrate/bf9f98a4763a9c0405663ed80e5ebbdb.png)
Options配置线程数为80。
![](https://i-blog.csdnimg.cn/blog_migrate/5c76ab52417fb89df9ed9e3f240895f4.png)
回到Payloads界面,点击Start attack,等待完成,刷新页面。
![](https://i-blog.csdnimg.cn/blog_migrate/78f5078a82041e45e1ac00155062861d.png)
当然,你也可以不刷新页面,向书中一样,拉动Results,找到序号1000的Response,查看结果。刷新页面会多一次,当然无所谓,应该是比1000少几百的。
Python脚本攻击
发起200次页面请求,最后结果为32。
"""
--coding:utf-8--
@File: condition_race.py
@Author:frank yu
@DateTime: 2020.12.18 15:50
@Contact: frankyu112058@gmail.com
@Description:
"""
from multiprocessing import Process
import requests
url = "http://127.0.0.1/condition_race.php"
def request(times):
while times:
print(requests.get(url).content)
times -= 1
def main():
nloop = 100
for i in range(nloop):
p = Process(target=request, args=(2,))
p.start()
if __name__ == '__main__':
main()
![](https://i-blog.csdnimg.cn/blog_migrate/0136318c20b89e276b494a831e20bfd4.png)
参考
《CTF特训营》
更多内容查看:网络安全-自学笔记
喜欢本文的请动动小手点个赞,收藏一下,有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。如果您感觉有所收获,自愿打赏,可选择支付宝18833895206(小于),您的支持是我不断更新的动力。