引言

在当今数字化时代,JAVA已经成为主流编程语言之一。无论是企业级应用程序还是个人项目,JAVA应用程序都承载着大量的敏感数据和业务逻辑。所以,学好对JAVA安全的防护变得尤为重要。同时,JAVA语言相对于PHP以及其他语言来说有着更高的安全性,所以如果采用JAVA语言编写的web,几乎不可能存在sql注入,面对JAVA开发的应用程序,如果要对其进行安全测试的话,一般是要拿到其源码才可以的,所以,JAVA安全是很难的,也是最有价值去研究的

WebGoat8靶场搭建

这一部分笔者折腾了很久,按照一般的教程,大家都是通过把WebGoat的jdk下载下来,然后用自己的jdk命令行打开就行,但是笔者在实操的时候发现了虽然有jdk,但是jdk版本太老了,不能带动WebGoat的运行,于是我也去升级了一下我的jdk,下了一个全新版本的jdk,然后就和我的老jdk冲突了🤬,在网上试了很多方法,都没成功,最后决定下载Docker镜像,在服务器上搭建,好在是这样成功了

9085333c7ceada5758a24d1a4d97fca4

按照如下方式在你的虚拟机上安装docker镜像

docker pull webgoat/webgoat-8.0 //拉取镜像
docker run -p 8080:8080 -t webgoat/webgoat-8.0 //启动镜像

之后在自己的浏览器访问xx.xx.xx.xx:8080/WebGoat/login,其中,前面输入自己服务器的公网IP即可,出现以下页面即代表成功

image-20240704095027112

之后随便注册一个账户就可以登录进去,然后就可以愉快的刷题了🤩🤩🤩

路径穿越

应用场景:在文件上传时,我们可能会遇到上传的路径不允许执行php或者其他木马后缀,这个时候我们可以进行路径穿越,将文件上传到上层目录或者根目录下,因为根目录不可能限制很多文件运行,如果限制文件运行,则这个项目的部分功能可能无法实现,所以进行路径穿越是很有必要的

首先我们打开pathtraversal关卡,我们可以学到一些关于pathtraversal的基本知识

image-20240704095836603

第一关

打开第一关,首先我们可以看到如下页面

image-20240704100135519

我们先随机上传一个头像试试,可以看到文件被放在了如下路径

image-20240704100345392

所以本题其实就是要跨越那个borgeous目录,放到上级目录,所以很简单,经典../即可

e433b7085eb3f3211a416b240a48ab64

所以只需要加一个../就可以完成路径穿越

第二关

看第二关,同样很简单,只是禁用了../

image-20240704101002388

我们同样先测试一下是怎么过滤../

c5f382c3b0664614c3b9399208d5532a

很容易看出,这个时候输入../已经没什么用了,显然被过滤了,我们先试试能不能进行编码绕过

5bdf5166643798a6991238796e61cc39

很显然,编码绕过没有什么作用,我们试试双写绕过

image-20240704101523097

显然,双写绕过是可以的

第三关

首先观察提示,发现又进行了一些修复,对Full name字段又进行了部分限制,我们仍然通过抓包看看有没有什么有用的信息

image-20240704101816226

image-20240705104345316

发现这里把1.jpg传进去了,我们对filename字段进行路径穿越即可

af6d8bcd800db1b0653467a492fcf57b

第四关

image-20240704102708894

很明显,是让我们在路径上进行目录穿越,找到path-traversal-secret.jpg,老样子,先抓个包

通过不停的抓包放包,可以发现图片是用id字段进行拼接的,所以我们只需要将我们需要访问的图片和id进行拼接即可,但要注意要进行编码绕过,因为其过滤了相关特殊字符

image-20240704103902329

image-20240704104144759

成功解出本关

身份认证

认证问题

image-20240704162404083

当我们忘记密码时,出现这个回答问题是非常正常的,但是当管理员对问题的设置不当时,就会引发很严重的安全问题,比如通过更改键名来进行非法绕过,而这一关所考察的问题也是这个

首先我们随便输入,然后用bp抓包

image-20240704162617615

当把键值改为不存在的键值时,此时系统查找数据库发现没有这一项,进而无论输入什么都会返回正确,如下所示

ed937140ac81374d683d2fbad26144cb

但是如果管理员将键名固定,只接受键值,那么这种方法是不可行的,需要其他的方法

JWT

JWT是一种身份鉴别手段,经常用在java和python中,对于jwt的详解可以参考以下这篇文章

JWT介绍&空加密&暴破密钥&私钥泄露&密钥混淆&黑盒_jwt泄露-CSDN博客

对于jwt,比较常用的方法就是空加密和密钥爆破,我们还是用例题来进行讲解

image-20240704163128859

对于该关卡,我们需要先获得一个身份,然后提权到管理员身份即可,我们先用bp进行抓包

image-20240704163314739

我们将access_token字段拿去解密,解密出来的结果如下所示

image-20240704163428515

我们只需要将false改为true,并把算法置为none即可,我们使用相关脚本进行生成(在线网站是生成不了的),这里推荐jw_tool进行生成

# 使用None算法
python3 jwt_tool.py JWT_HERE -X a
# 自定义修改生成
python3 jwt_tool.py JWT_HERE -T
# 使用字典破解
python3 jwt_tool.py JWT_HERE -C -d dictionary.txt
# 指定密码测试
python3 jwt_tool.py JWT_HERE -C -p password_here

image-20240704164411540

image-20240704164620461

根据其提示一步一步往下操作,最终将得到的去掉最后signature部分,重新发包即可

JWT_Crack

image-20240704172225046

首先题目中给了我们一串jwt加密后的信息,根据题目信息,我们首先要把username换成WebGoat后进行加密,所以我们首先需要知道密钥

查看源码,将下列secret加入我们的字典中,然后进行爆破

image-20240704173854039

用jwt_tools爆破密钥,如下所示

image-20240704173940968

我们找到了正确的密钥,然后根据正确的密钥重新生成jwt即可

image-20240704174049541

同时,注意将exp字段改大一点,exp表示的是jwt失效时间,否则会提示invalid

第三方组件

Java安全问题80%都出在组件安全上,主要是因为JAVA会导入很多个外部包,这就导致容易因为组件爆出漏洞进而影响整个JAVA应用受到影响,比较出名的就是log4j漏洞

组件安全比较复杂,后期和其他通用漏洞一起总结