druid未授权--python脚本

一、检测ip

vim  druid未授权-ip.py

import requests  
import warnings
from threading import Thread

warnings.filterwarnings('ignore')  # 忽略SSL警告
# 通过警告过滤器进行控制是否发出警告消息。

def main():
    druid = '/druid/websession.html'  
    url_list = []  # 空列表

    with open("url1.txt", "r", encoding="utf-8") as f:
        for line in f.readlines():  # 会有空行
            line = line.strip('\n') # 去掉空行
            url_1 = 'http://'+line+druid   # 输出完整url-http
            url_2 = 'https://'+line+druid  # 输出完整url-https
            url_list.append(url_1)   # 把url_1加入到url_list列表中
            url_list.append(url_2)   # 把url_2加入到url_list列表中
        #print(url_list)   # 到这一步输出是http,https,http,https这种循环
    url_list=list(set(url_list)) # 这一步把输出变成,https,https,http,http
    for url in url_list:
        t = Thread(target=thad, args=(url,))
        # Thread类方法
        # 需要一个可调用的target对象,以及参数args
        t.start()
        # 开始执行该线程,多线程
def thad(url):
        try:  # 捕捉异常可以使用try/except语句。
            re = requests.get(url, verify=False, timeout=5)
            # get:向url对应的服务器发送相应的get请求,获得对应的应答
            # 不验证,5s超时
            if 'Principal' in re.text and re.status_code == 200:  
            # 漏洞判断
                print("[+]  " + "存在漏洞  --->>> " + url) # 打印结果
                with open("success.txt", "a", encoding="utf-8") as f1:
                    f1.write(url + '\n')
                    # 把结果写进文件,会自动新建success.txt
            else:
                print("[-]  " + "不存在漏洞  --->>> " + url)

        except:
            print("[!]  " + "连接失败  --->>> " + url)

if __name__ == '__main__':
    main()

二、检测url

vim druid未授权-url.py
import threading

import requests
import warnings
from threading import Thread
warnings.filterwarnings('ignore')  # 忽略SSL警告

druid ='druid/websession.html'
def getdurl(url):  # url是getdrul的参数
    durll = []     # 定义空列表
    if 'https' in url:
        isok = 1
        # str.replace(old, new[, max]),去掉https
        url = url.replace('https://', '')
    else:
        isok = 0
        url = url.replace('http://', '')
    # 用"/"切割,返回列表
    durllist = url.split('/')
    durl = ''
    for i in range(0, len(durllist) - 1):
        if isok == 1:
            # 打印除最后一个字段的url
            durl = durl + durllist[i] + '/'
            durll.append('https://' + durl)
        else:
            durl = durl + durllist[i] + '/'
            durll.append('http://' + durl)
    # 返回url的值
    return durll

def main():
    url_list = []  # 空列表
    # window打开文件写法
    # with open(r"C:\Users\可燃冰\Desktop\url.txt", "r", encoding="utf-8") as f:
    with open("url2.txt", "r", encoding="utf-8") as f:
        for line in f.readlines():
            # 去掉空行
            line = line.strip()
            # 从左往右第一个如果不是 /,就加上
            url_list.append(line)  # 把url_1加入到url_list列表中
            if url_list[-1] != "/":
                url_list[-1] = url_list[-1] + '/'
            # line参数传入getdurl函数
                drull = getdurl(url_list[-1])

            for url in drull:
                # 开启多线程
                t = threading.Thread(target=tha, args=(url, ))
                t.start()

# 这个函数用来检测druid-url
def tha(url):
    try:
        main_url = url + druid
        # 请求url
        re = requests.get(main_url, verify=False, timeout=5)
        # 判断返回值
        if 'Principal' in re.text and re.status_code == 200:
            print("[+]  " + "存在漏洞  --->>> " + main_url)
            with open("success.txt", "a", encoding="utf-8") as f1:
                f1.write(main_url + '\n')
        else:
            print("[-]  " + "不存在漏洞  --->>> " + main_url)

    except:
        print("[!]  " + "连接失败  --->>> " + main_url)

if __name__ == '__main__':
    main()

三、使用方法

前提:Python3环境、request库 1、druid未授权-ip.py使用方法:
与druid未授权-ip.py同级目录新建url1.txt,放入目标地址。目标地址格式为ip+端口。
url.txt放入的地址数量尽量不要大于10000。

扫描完成后自动结束,会在同级目录生成success.txt文件,里面包含存在druid未授权访问漏洞的目标地址。

2、druid未授权-url.py 使用方法
与druid未授权-url.py同级目录新建url2.txt,放入目标地址。目标地址格式为url。 url.txt地址数量尽量不要大于2000

四、运行原理

druid未授权访问漏洞的特征为目标地址一定存在druid/websession.html页面,所以脚本自动拼接此特征目录,逐一进行访问,页面可访问会返回状态码200且源码会包含关键字Principal时会被确定为存在漏洞。无法访问或加载超时会显示连接失败。页面返回状态码200但无关键字会被判定为无漏洞。
在这里插入图片描述

五、修复建议

  1. 为Druid配置强口令,配置Servlet的 loginUsername 和 loginPassword这两个初始参数。

示例如下:

<!-- 配置 Druid 监控信息显示页面 -->
<servlet>  
    <servlet-name>DruidStatView</servlet-name>  
    <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>  
    <init-param>  
	<!-- 允许清空统计数据 -->  
	<param-name>resetEnable</param-name>  
	<param-value>true</param-value>  
    </init-param>  
    <init-param>  
	<!-- 用户名 -->  
	<param-name>loginUsername</param-name>  
	<param-value>druid</param-value>  
    </init-param>  
    <init-param>  
	<!-- 密码 -->  
	<param-name>loginPassword</param-name>  
	<param-value>druid</param-value>  
    </init-param>  
</servlet>  
<servlet-mapping>  
    <servlet-name>DruidStatView</servlet-name>  
    <url-pattern>/druid/*</url-pattern>  
</servlet-mapping>  
  1. StatViewSerlvet展示出来的监控信息比较敏感,是系统运行的内部情况, 建议通过配置allow和deny这两个参数实现访问控制。 示例如下:
  <servlet>
      <servlet-name>DruidStatView</servlet-name>
      <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
  	<init-param>
  		<param-name>allow</param-name>
  		<param-value>128.242.127.1/24,128.242.128.1</param-value>
  	</init-param>
  	<init-param>
  		<param-name>deny</param-name>
  		<param-value>128.242.127.4</param-value>
  	</init-param>
  </servlet>

判断规则: • deny优先于allow,如果在deny列表中,就算在allow列表中,也会被拒绝。
• 如果allow没有配置或者为空,则允许所有访问

参考链接:
https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值