近日有粉丝询问笔者关于漏洞挖掘的技巧,想了想便决定分享一篇笔者半年以来漏洞挖掘的技巧分享。以下漏洞均已上报漏洞平台并均已修复,请勿对其进行非法攻击。
此文章篇幅过长,建议收藏偷摸看
0X01 登录处漏洞挖掘
关于登录框存在的漏洞,详情请见以下链接
https://blog.csdn.net/weixin_48421613/article/details/117535912
以下部分案例为漏洞挖掘记录,此次案例分享不分享反射型XSS漏洞、短信炸弹、验证码问题、CORS跨域漏洞等(因为此类漏洞平台不收)
0x01 - 01 弱口令漏洞
漏洞描述:弱口令漏洞,即口令密码长度低于8位,且口令不满足字母、数字、特殊字符组成,常见的弱口令有:admin、123456、000000、88888888等。
漏洞危害:攻击者利用互联网上常见的弱口令可以进行口令猜解,从而进入到后台,获取后台的访问权限。需要注意的是,弱口令漏洞与硬编码漏洞有一定的区别。
漏洞等级:中危
修复方式:修改默认口令,口令长度应长于8位,最好是11位以上,且应满足大小写字母、数字、特殊字符组成。
案例:
在测试弱口令漏洞的时候,不建议对有账户锁定功能的网站进行测试,以免造成恶意的拒绝服务攻击,对网站管理员的使用造成恶劣影响。
以下案例为某次攻防演练,使用burpsuite进行弱口令爆破,成功爆破密码
MD5解密后,密码为0000
0x01 - 02 登录认证绕过漏洞
漏洞描述:登录认证绕过漏洞比较少见,所谓登录认证绕过漏洞其实就是绕过认证,在不知道用户名密码或者是没有使用常规的认证流程实现流程跳跃从而直接进入后台系统的一种漏洞。
漏洞危害:远程攻击者利用此漏洞可以绕过登录流程,直接获得后台的访问权限
漏洞等级:中危
修复方式:按情况进行修复,有些漏洞是通过返回值code进行校验,建议针对此类型漏洞进行多因素校验
案例:
某次笔者测试某网络设备,发现登录response返回包修改返回值即可绕过密码校验
我们首先看一下登录页面,在用户名密码输入任意字符即可
点击登录按钮,此时抓包request请求包如下
此时返回包内容如下
将state返回值修改为1,此处其实疑似存在jsonp跨与劫持漏洞的,但是平台不收,也就没动他
此时发送数据包,我们成功绕过登录验证,进入到后台
成功拿下证书
0x01 - 03 SQL注入漏洞
漏洞描述:所谓SQL注入,其实就是程序对用户输入的参数没有进行合理校验,导致用户输入的恶意语句被当成SQL语句执行了,一般SQL注入多存在在查询、插入处,对应的其实就是表单查询、登录功能、用户注册等。
漏洞危害:攻击者利用SQL注入漏洞可以获取数据库敏感信息,在获取网站绝对路径并且对网站有写权限执行权限的时候甚至可以直接写入webshell,SQL注入漏洞与redis未授权访问、phpmyadmin日志写入webshell有一定区别。
漏洞等级:中危
修复方式:简而言之就是使用安全的编译框架(MyBatis)/预编译、用户输入输出过滤。
案例:
笔者某次漏洞挖掘某scada系统登录页面,发现在用户名输入表单未对特殊字符进行过滤,虽然不能达到万能密码登录的效果,但是却可以实现sql注入的漏洞利用
我们在用户名处输入一个单引号,发现返回包出现错误
我们将单引号进行闭合,此时提示用户名不存在,此处疑似存在基于string型的sql注入
手工注入失败了,但是sqlmap可以一把梭
老规矩,上报
0x01 - 04 信息泄露
漏洞描述:这种信息泄露漏洞其实就是配合未授权访问+硬编码漏洞,尝试访问备份文件下载,可能会有意想不到的收获。
漏洞危害:攻击者利用备份文件未授权访问可能会获取备份文件敏感信息,包括一些特殊设备的硬编码
漏洞等级:中危
修复方式:赶紧打补丁
案例:
其实这个漏洞是备份文件未授权访问,备份文件里存放了硬编码的用户名密码,根本原因还是硬编码引起的,一些重要的设备密码明文存储在文件里,这就导致攻击者一旦获取该类文件,即可获取大量的敏感信息
漏洞危害等级视情况而定,有的时候工业控制系统要是泄露了RTU、DTU等密码,那就芜湖,直接高危到手了
0x01 - 05 不安全的HTTP方法
漏洞描述:不安全的HTTP方法其实就是服务器对外开放了除GET、POST方法之外的其他方法,例如开放了PUT、DELETE、COPY等方法,此漏洞与IIS6.0的PUT写入漏洞以及Tomcat 任意文件写入漏洞相近似。
漏洞危害:攻击者利用不安全的HTTP方法可以写入任意文件,删除任意文件,拷贝任意系统源代码而后进行本地代码审计
漏洞等级:中危
修复方式:关闭除GET、POST之外的其他方法
案例:
笔者先前写过一篇关于不安全的HTTP方法的讲解,这里面直接上案例了。
随便抓个包,我们看一下请求包内容
我们将GET请求修改成OPTIONS请求,此时可以看到,该系统开放了许多的不安全的HTTP方法
这里虽然没标PUT、DELETE方法,但是并不妨碍他有
此时访问http://ip/1.jsp
0x01 - 06 越权
漏洞描述:此处越权通过普通用户登录而后修改cookie从而将权限提升至admin权限,先决条件就是需要知道普通用户的用户名密码。
漏洞危害:攻击者在获取普通用户权限后可以利用越权漏洞获取管理员权限。
漏洞等级:中危
修复方式:请对用户权限进行严格校验
案例:
笔者在某次测试的时候,在获取了普通用户的权限之后发现用户的COOKIE很简单粗暴
当前用户权限如下
修改cookie属性为admin
此时我们发现,用户权限成功提升至管理员权限
成功拿下
0x01 - 07 命令注入
漏洞描述:这里的命令注入其实是OS系统命令注入,是程序没有对用户输入的参数做过滤,导致程序执行了恶意额命令,造成命令注入漏洞。
漏洞危害:攻击者利用此漏洞可以执行任意系统命令,获取系统的控制权限
漏洞等级:高危
修复方式:建议对用户输入输出进行过滤
案例:
这是一个几年前笔者挖掘的漏洞,某网络设备登录处存在命令注入漏洞,这种情况并不多见
我们首先看一下正常的登录请求
我们在password字段后增加点东西
0x01 - 08 会话固定
漏洞描述:会话固定,其实就是登录前与登录后的session不发生改变,而我们常说的会话固定一般用于登录后才有效,但是在某些网络设备中的会话固定却与我们常见的有明显不同,所有的设备session登录前与登录后皆一致,同时未登录的session是有效的!
漏洞危害:只需要登录一次就可以获取session,而后就可以在不知道用户名密码的情况下登录所有使用该产品的后台系统。
漏洞等级:中危
修复方式:session动起来,合理使用校验,不要将session写死。
案例:
笔者某次测试,发现无论登录多少次,在登录请求的返回包里set-cookie参数永远是那么一个,并且该set-cookie参数适用于该产品所有版本所有型号。
我们先看一下登录请求
很明显,输入的用户名以及密码都是瞎掰的,我们看一下该请求的返回包内容
此时我们修改数据包如下
主要参数其实就是set-cookie:sessid=xxxxxxx
这个参数是怎么获得的呢?其实就是找一个弱口令登录,然后观察返回包内容,这也就是一个细心活,为了验证这个漏洞,笔者在后台发现一处信息泄露(说是硬编码可能会好一些),后台用户管理模块里面的用户名密码是明文形式展示的,但是此处并非未授权,那么我们就可以通过这个set-cookie来进行批量扫描,以达到验证我们这个漏洞的目的。
#!/usr/bin/python
# -*- coding: utf-8 -*-
import argparse
import json
import requests
import urllib3
urllib3.disable_warnings()
def banner():
print('+------------------------------------------------------------------+')
print('+ [xxxx设备-xxx漏洞检测] +')
print('+ [使用方式: python xxx.py -u http://xxx.xxx.xxx.xxx] +')
print('+------------------------------------------------------------------+')
def main():
banner()
parser = argparse.ArgumentParser(description="xxxxx漏洞探测")
parser.add_argument('-u', type=str, required=False, dest='url', help="URL to test")
args = parser.parse_args()
model(args.url)
def header():
header = {
"User-Agent": "自行设置",
'Content-Type': "application/x-www-form-urlencoded",
'X - Forwarded - For': '127.0.0.1',
'Cookie': 'sessid=xxxxxxxxxx'
}
return header
# 定义登录URL
def model(url):
try:
# 设置获取型号URI
uri = "/xxxxx"
# 提交请求
response = requests.get(headers=header(), url=str(url) + uri, verify=False, timeout=10)
# 设置json格式
text = response.text
s = json.loads(text)
# 打印型号信息
board = s['board']
# 设置硬编码漏洞URL
if ('model' in board):
vul = url + '\t' + "型号" + board['model']
# 设置获取密码接口
url_admin = url + "/xxxxx"
response_admin = requests.get(url=url_admin, headers=header(), verify=False, timeout=10)
text2 = response_admin.text
s2 = json.loads(text2)
# 获取登录用户名
username = str(s2['data'][0]['username'])
password = str(s2['data'][0]['password_origin'])
print("[存在硬编码漏洞!]")
print(vul + '\t' + "[username:" + username + '\t' + "password:" + password + "]" + "\r")
else:
print("什么也没有")
except Exception as e:
print("[" + url + "]" + "[服务异常:]", format(e))
if __name__ == '__main__':
main()
让我们看一下检测效果吧
而后测试了十几个之后发现无往不利,那么就已经足以证明这个漏洞的有效性
关于登录处的案例暂时分享这些,其余的并没有放出来,实际上登录处还能测什么呢?像组件的shiro、s2、log4j、fastjson、spring等等,还是有的。关于组件漏洞、中间件漏洞这种无关程序自身的,这里不做过多介绍,插件足够多的话,只要有漏洞就可以扫出来。
0x02 登录后漏洞
网络设备功能其实并不多,抛开协议层次和通信过程产生的安全隐患,后台的漏洞实际上危害较大的就那么几种:命令注入、代码注入、远程命令执行、任意文件读取、文件上传、计划任务、任意SQL语句执行以及未授权访问漏洞(实际上XSS也不少,但是平台不收,这里就不讲了)
首先先给大家介绍一下命令注入漏洞,这个漏洞在网络设备里较为常见,如果有源代码的话那么很容易能找到,如果没有源代码那就只能看运气了
0x02 - 01 命令注入漏洞
漏洞描述:命令注入漏洞其实就是系统没有对用户输入的参数进行严格校验,导致一些危险命令被系统执行。
漏洞危害:远程攻击者利用此漏洞可以执行任意系统命令,获取系统的控制权限
漏洞等级:高危
修复方式:对用户输入的内容进行严格校验,并对系统命令进行严格校验
案例1:
网络设备最常见的功能其实就是网络诊断功能,该功能常用于路由器、网关,用来探测网络环境,但是很多网络设备都没有做好参数的控制,导致命令注入漏洞的产生
我们来看一下,最为常见的命令注入漏洞,无论是在windows系统或者是linux系统,命令注入最常见的打法都是逻辑运算符"&"、"&&"、"|"、"||"以及"`"
此处我们使用“|” 运算符,用来执行id命令
我们发现,我们执行成功了,我们来看一下此处漏洞的源代码,此处源代码直接引用参数$net、$bit、$ip,此三个参数用户传入后并没有进行任何处理便直接使用$shell变量进行拼接,而后使用exec()函数进行执行,这也就导致了命令注入漏洞的产生
那么我们由此得知,不是只有ip能进行注入,我们尝试在$net参数注入,注入结果如下,成功的验证了我们的猜想
此处使用的打法是%0a,大家可以理解为这是一种特殊空格制表符,常见的还有%0b
第三处
而后厂商对此漏洞进行了修复,但是修复的并不彻底,我们看一下修复代码
此处其实没有看出来对$ip变量的过滤,代码是否对用户输入的变量进行有效性检查,是否对ip地址进行白名单校验等非安全性问题先选择性忽略
第一处,$num、$time、$bit进行了强制类型转换,所以此处并不存在命令注入,而$ip变量虽然没有发现任何的过滤,但是就是无法进行注入,排除掉server端的过滤的话,应该是合并运算符(??)起到了作用
$nat参数只是将常规的符号进行了替换,但是并没有理会“%”,这就导致了命令注入漏洞的一个绕过
执行结果如下:
0x02 - 02 无回显命令注入漏洞
上一个案例为大家介绍了最常见的命令注入漏洞,但是除了这种有返回回显的外,还有一种是没有回显的;有人可能说可以通过dnslog进行回显,但是笔者测试过,效果并不好,那么如果遇到了无回显的命令注入漏洞,我们应该如何进行验证呢?
首先添加nat网卡,校验$import数据是否在数据库中存在,若是存在,则会报错
若是不存在,则会进入下列代码
nat_exec() 接收的参数并没有做任何的过滤,导致存在命令注入漏洞
点击添加按钮,同时拦截数据包
访问http://ip/ld.txt
0x02 - 03 特殊命令注入漏洞
当然了,有的时候有些特殊功能也是可能存在命令注入漏洞的,但是若是没有代码审计的情况下,个人几乎很难察觉此类漏洞,笔者某次代码审计就发现了几处此类漏洞,只能说很骚气
所有灵活参数都能fuzz,上述代码$file变量接收后被直接获取,并且并没有经过任何形式的过滤便直接exec()函数进行命令执行,若是对参数进行恶意构造即可执行超预期命令,达到命令注入效果
点击删除按钮,同时拦截数据包,数据包如下图所示
修改数据包如下
file=4.log%0als+>+../temp.txt%0a
访问https://ip/temp.txt ,命令注入成功,成功执行ls命令
0x02 - 04 任意文件读取漏洞
漏洞描述:任意文件读取漏洞一般存在于网络设备下载功能,通常出现在日志管理处,由于程序对系统文件路径并没有进行严格校验,导致恶意攻击者可以利用此漏洞跨路径读取其他文件,此漏洞与任意文件下载漏洞原理相似
漏洞危害:攻击者利用此漏洞可以读取任意文件,可能会泄露系统敏感信息
漏洞等级:中危
修复方式:可以将文件路径存储到数据库,而后读取数据库标号进行读取,或者通过过滤敏感字符的方式进行修复
案例:
此漏洞通常出现在网络设备后台的日志管理处、备份文件下载等,大家留意有路径的参数即可发现
修改数据包如下
0x02 - 05 任意文件删除漏洞
漏洞描述:此漏洞与任意文件读取漏洞类似,只不过一个是读取,一个是删除
漏洞危害:攻击者利用此漏洞可以删除任意系统文件,可能会造成恶劣的拒绝服务攻击
漏洞等级:中危
修复方式:对参数进行严格校验
案例:
$file变量接收后被直接获取,并且并没有经过任何形式的过滤便直接exev()函数进行删除了,这就形成了任意文件删除漏洞
嗨嗨害,由于任意文件删除漏洞不能随便删,所以我们首先在目标服务器创建一个新的文件用来测试,我希望大家以后测试的时候也不要莽撞,尽可能不要胡乱测试,不要乱用扫描器。我们的目的是发现漏洞帮助客户修复漏洞,而不是为了破坏或者是自己的特殊目的
此时首先访问https://ip/temp.txt ,此文件为删除前后对比文件使用,文件内容为执行ls命令的结果
我们看一下功能
点击删除按钮,同时拦截数据包,数据包如下图所示
此时再次访问 https://ip/temp.txt ,文件已经被删除
0x02 - 06 备份文件漏洞-任意文件上传
漏洞描述:其实网络设备文件上传漏洞不是很多,基本都取消了头像功能,但是有一些备份文件上传、升级固件的地方还是存在此类问题,区别于常规文件上传,备份文件上传只需要在特定文件夹插入恶意脚本即可执行,不用绕过
漏洞危害:攻击者可以利用此漏洞直接获取webshell
漏洞等级:高危
修复方式:对备份文件进行公钥加密,私钥解密
案例:
首先下载一个备份好的模板
将恶意文件插入到备份文件内
上传还原后,访问脚本地址,发现成功解析
PS:此漏洞为Fariy 挖掘
0x02 - 07 备份文件漏洞-计划任务执行
漏洞描述:这个漏洞思路清晰,与文件上传不同的是,该设备可以直接解析.sh文件,但是如何运行是一个让人苦恼的事儿,但是幸运的是,笔者发现此备份文件竟然存在计划任务文件,那么直接走起
漏洞危害:攻击者利用此漏洞可以直接插入恶意脚本而后通过计划任务执行恶意指令,达到远程命令执行的效果
漏洞等级:高危
修复方式:对备份文件进行加密,公钥加密,私钥解密
案例:
由于客户隐私,此处不展示漏洞页面,只展示一部分
这个是笔者发现备份文件存在的计划任务文件,我们直接加一条即可
按照分时日月周,直接每分钟ping 一次dnslog,笔者测试过,这里直接弹shell是没问题的
0x02 - 08 备份文件漏洞-任意SQL语句执行
漏洞描述:备份文件下载之后,笔者发现文件内部其实是充满sql语句的东西,疑似是通过数据库还原
漏洞危害:攻击者利用此漏洞可以执行任意SQL语句
漏洞等级:高危
修复方式:加密加密加密,重要的事情说三遍
案例:
这里案例没有办法给大家看,过于敏感,只看一下效果吧
上传后效果如下
0x02 - 09 任意文件下载+硬编码漏洞
漏洞描述:实际上这个漏洞就是任意文件下载,而后对下载的文件进行审计发现的漏洞
漏洞危害:可能会连接到不应该出现的东西,比如phpmyadmin、FTP、Telnet等
漏洞等级:高危
修复方式:对下载的文件路径进行限制,配置文件加密混淆
案例:
这里就直接上案例了,老洞了
通过任意文件下载下载jar包
对jar包解包,而后进行审计,发现存在FTP服务器密码
直接连接TFP服务器即可
最后装个B