2023年将会持续于B站、CSDN等各大平台更新,可加入粉丝群与博主交流:838681355,为了老板大G共同努力。
【商务合作请私信或进群联系群主】
先了解开发环境:
1. JAVA版本
2. 中间件
3. 数据库
4. 是否使用框架
常见的开发环境:
JDK + Eclipse + Tomcat + SQL(Orcla/MYSQL)
IDE: Eclipse 、 IDEA 、 Netbeans
Web Server: Tomcat 、 Resin 、 JBoss 、 WebSphere 、WebLogic等
SQL: MYSQL 、Orcla 、 Redis 、 SQLserver 、 PostgreSQL
1. JAVA-WEB中有些程序Maven项目会存在pom.xml文件,pom.xml文件定义程序需要的各类组件,可以查看组件是否存在高危漏洞来第一步收获高危漏洞。
2. 可以直接全局搜RequestMapping找到cotroller层路径,如果不是springboot框架,需要去看web.xml去定位路由
用户请求URL发送到服务器,服务器解析请求后发送到后端代码处理请求。在后端代码处,首先经过Filter(过滤器)和Interceptor(拦截器),然后根据请求的URL映射到绑定的controller,之后调用Service接口类,然后再调用serviceImpl接口实现类,最后调用DA0.controller:负责简单的逻辑处理和参数校验功能,之后调用Service
service: 接口类,主要负责业务模块逻辑处理
serviceImpl: 接口实现类,实现类实现service接口中的方法。
DA0: 如果service涉及数据库操作就会调用dao。DA0主要处理数据库操作。DA0只做中间传递角色
关键字:
Statement
createStatement
PrepareStatement
like '%${
in (${
select
update
insert
Dao
from
修复:使用参数化查询语句避免将未经过滤的输入直接拼接到SQL查询语句中。对用户输入的特殊字符进行严格过滤,如and、or、select、union。
一般出现注册处。
经典漏洞示例:
从session中取出username值,拼入SQL语句查询,注册逻辑调用UserMapper进行入库操作,并没有对用户名做过滤,同时入库时采用#号的安全写法,会通过预编译执行SQL语句。
出发漏洞流程:
注册一个存在SQL注入的语句并进行用户名登录,通过触发逻辑导致二次注入。
关键字:
org.apache.commons.fileupload
java.io.File
MultipartFile
RequestMethod
MultipartHttpServletRequest
CommonsMutipartResolver
upload
write
fileName
filePath
fileUpload
修复:
1.设置白名单条件方式上传:"String picwhite[]={".jpg",".jpeg",".png",".gif",".bmp"}
2.避免获取文件名真实后缀:"String Suffix = fileNmae.substring(fileName.lastIndexOf("."))"
3.对文件类型的判断(可以通过抓包Content-Type修改绕过):"String whitetype[]={"image/gif","image/jpeg","image/jpg","image/png"}"
关键字:
<%=
${
<c:out
<c:if
<c:forEach
ModelAndView
ModelMap
Model
.getParameter
.setAttribute
.getWriter().print()
.getWriter().writer()
getParamter
print
insert
save
update
反射型XSS:
<%=
${
.getParameter
.getWriter().print()
.getWriter().writer()
getParamter
print
存储型XSS:
.setAttribute
.getWriter().print()
.getWriter().writer()
print
insert
save
update
DOM型XSS:
<%=
${
<c:out
<c:if
<c:forEach
ModelAndView
ModelMap
Model
修复:
1. 编写全局过滤器实现拦截。
2. 采用开源就安全控制库(OWASP)企业安全应用接口(ESAPI)实现,类似还有谷歌xssProtect等
//HTML Context
String html = ESAPI.encoder().encodeForHTML("><script>alert('xss')</script>");
//HTML Attribute Context
String htmlAttr = ESAPI.encoder().encodeForHTMLAttribute("<script>alert('xss')</script>");
// Javascript Attribute Context
String jsAttr = ESAPI.encoder().encodeForJavaScript("<script>alert('xss')</script>");
3. 对所有字符采用HTML实体编码
<%
String Str="<script>alert('XSS')</script>",
Str = Str.replaceAll("\"",""");
Str = Str.replaceAll("&","&");
Str = Str.replaceAll("\\(","(");
Str = Str.replaceAll("<","<");
Str = Str.replaceAll(">",">");
Str = Str.replaceAll("\'","'");
Str = Str.replaceAll("\\)",")");
out.println(Str);
%>
一般涉及java.io.File类,审计时优先查找java.io.File引用。
关键字:
Paths
path
System.getProperty("user.dir")
修复:
1.对文件名进行过滤
2.防止出现"./"特殊符号
3.采用ID索引下载文件
4.对目录进行限制
5.合理配置权限
关键字:
redirect
sendRedirect
ModelAndView
Location
addAttribute
修复:
1. 严格控制跳转域名。
关键字:
Runtime.exec
ProcessBuilder.command
System.exec
System.load
System.loadLibrary
Process.getInputStream
Process.getOutputStream
Process.getErrorStream
修复:
1.禁止使用Runtime.exec()发出"mail"命令
2.清楚所有输入以查找恶意字符
关键字:
NodeList
DocumentHelper
DocumentBuilderFactory
Digester
SAXParserFactory
SAXBuilder
XMLReader
修复:
1. 禁用DTD或者禁用外部实体
//实例化解析类之后通常支持三个配置
obj.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);
obj.setFeature("http://xml.org/sax/features/external-general-entities",false);
obj.setFeature("http://xml.org/sax/features/external-parameter-entities",false);
2. "DocumentBuilder builder=dbf.newDocumentBuilder()"代码需要将dbf.setFeature()之后才会生效。
关键字:
HttpURLConnection.getInputStream
URLConnection.getInputStream
HttpClient.execute
OkHttpClient.newCall.execute
Request.Get.execute
Request.Post.execute
URL.openStream
ImageIO.read
支持sun.net.www.protocol中所有协议,使用方法:
URLConnection
URL
只支持HTTP、HTTPS协议:
HttpURLConnection
HttpClient
OkHttpClient.newCall.execute
修复:
1.正确处理302跳转(业务角度看不能直接禁止302,而是对跳转地址重新做检查)
2.限制协议只能为HTTP/HTTPS,防止跨协议
3.设置内网IP黑名单(正确判定内网IP、正确获取host)
4.防火墙设置Web端口白名单(防止端口扫描)
关键字:
org.springframework.expression.spel.standard
SpelExpressionParser
parseExpression
expression.getValue()
expression.setValue()
修复:
使用SimpleEvaluationContext安全类防御,支持SpEL语法的子集,抛弃JAVA类型引用、构造函数及Beam引用
ExpressionParser parser = new SpelExpressionParser();
EvaluationContext context=SimpleEvaluationContext.forReadOnlyDataBinding().withRootObject(a).build();
String name = (String) exp.getValue(context);
System.out.println(name);
关键字:
ObjectInputStream.readObject
ObjectInputStream.readUnshared
XMLDecoder.readObject
Yaml.load
XStream.fromXML
ObjectMapper.readValue
JSON.parseObject
关键字:
org.apache.velocity
修复:
1. 避免用户直接控制模板注入对其进行过滤,如果要向用户公开模板编辑则使用无逻辑模板引擎:Handlebars/Moustache等。
关键字:
int
硬编码: 系统中采用铭文形式存储密码。
危害: 通常导致严重身份验证失败,系统管理员较难检测,检测到也难以修复。该漏洞会造成密码泄露。
1. 开发人员将代码托管到github等互联网平台,可能造成源码泄露,有权限即可读取。
2. 将后端凭证硬编码刷到前端软件中,使该程序任何用户可提取密码,从二进制文件提取密码非常简单。
使用硬编码的密码连接到数据库示例:
DriverManager.getConnection (url,"scott","tiger");
可以通过 javap -c 命令来访问反汇编代码,反编译代码将包含使用的密码值
javap -c ConnMngr.class
22:ldc #36; //String jdbc:mysql://ixne.com/rxsql
24:ldc #38; //String scott
26:ldc #17; //String tiger
随机数是专门的随机试验结果。分为三类:
1. 统计学伪随机数生成器(PRNG): 伪随机数生成器从一个初始化种子值开始计算得到序列,从种子开始然后从种子计算出后续之,当种子确定后生成的随机数也确定,但其输出结果容易预测,容易复制数值流。
2. 密码学安全随机数生成器(CSPRNG): 密码学安全伪随机性是统计学伪随机数生成器的一个特例,给定随机样本的一部分和随机算法,不能有效演算处随机样本剩余部分。
3. 真随机数生成器: 其定义为随机样本不可重视。给定边界条件,真随机数并不存在,可如果产生一个真随机数样本边界条件十分复杂且难以捕捉(比如计算机当地本底辐射波动值),则可以认为用这个方法演算出真随机数。