一、检测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但无关键字会被判定为无漏洞。
五、修复建议
- 为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>
- 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