文章总结: 该文档是JavaWeb代码审计实战教程,系统覆盖业务安全、身份认证、输入输出验证等八大核心领域。文章详细阐述SQL注入、XSS、越权等常见漏洞审计方法,通过关键词搜索与数据流回溯定位风险,结合代码示例展示成因与防范。内容结构清晰且实战性强,为安全审计人员提供了系统化操作指南,适合作为技能提升或企业安全建设参考。 综合评分: 86 文章分类: 代码审计,WEB安全,漏洞分析,实战经验
JavaWeb代码审计保姆级教程纯案例篇
原创
huan666 huan666
huan666
2026年3月4日 19:01 北京
1、业务安全类
1.1、短信邮箱轰炸
红框处为实际发短信的工具类
查看工具类send方法
未对用户的访问IP进行有效的限制,可造成短信轰炸,任意短信发送
1.2、验证码安全
审计验证码校验功能中,是否在判断过程中,对存在Session中的验证码进行了更新,未更新的验证码,是否限制了错误校验次数。
审计验证码使用后,是否进行了更新。
审计短信验证码是否向前端返回了具体的值。
以下是代码示例,问题为验证码的识别度过高,且使用了伪随机数,容易被机器猜测、识别。
1.3、业务流程绕过
梳理业务流程,分析其前端流程如何控制,发起了哪些请求,传递了哪些参数;
分析其后端业务处理功能,是否存在流程分离的情况;
若最终的业务处理过程中,未关联前几步的身份校验结果,则存在安全风险。
1.4、参数合法性校验
该漏洞通常发生在交易功能中,如购物车、订单、支付等功能处,对金额、数量、利率等数值未进行合理性检查,导致漏洞产生。
针对性审计该功能所传入的参数,审计在业务处理过程中,是否对重要的参数进行了合理性的判断,如金额是否大于0,数量是否大于0而小于等于库存,利率是否在规定的范围内等等。
以下代码审计示例,就是一个由于正则表达式误用而导致任意金额的问题。
2、身份认证和访问控制
2.1、水平/垂直越权
该漏洞挖掘,需要对业务功能的逻辑处理流程进行梳理,分析流程中是否判断了请求与请求发起者之间的绑定关系。
首先,找到一个功能点,检查请求参数中是否包含了可以验证用户身份的信息,如短信验证码。然后,分析该功能的处理逻辑中是否对用户标识(userID等)进行了判断,检查该用户标识是否用户可控。
当该功能未判断请求与请求发起者之间的绑定关系,或用于判断绑定关系的各参数用户可控,则该功能存在水平越权漏洞。
2.2、暴力破解
针对性审计登录功能,是否记录了登录错误次数,并对持续登录失败的账号进行锁定。
如下是一个可以暴力破解的登录功能示例代码,可以看出没有加入防重放攻击的机制。
3、输入输出验证
3.1、sql注入
针对代码中编写的SQL语句,那么可根据拼接SQL参数的方式直接定位漏洞代码,然后根据数据流的过程,逐步向上回溯,定位到用户可控参数。如下图所示,在代码中搜索“select”或“from”或者“where”等字符,搜索出所有的与数据库操作相关的代码,查看是否存在拼接参数的情况。
效果如下图所示
然后查找相应类的相应方法调用,如下图所示
RequestMapping将请求映射为/show/show.aspx,传入的id参数未经转义或任何过滤处理,可确定此处存在SQL注入。
3.2、跨站脚本攻击
查看是否配置了全局的拦截器、过滤器。检查jsp页面,查看是否存在将请求参数直接返回页面的请求,查看是否存在未做任何处理就将数据向前端页面输出的情况。检查java文件,搜索“out.print”,判断是否存在未对参数进行处理就直接向客户端输出的情况。
3.3、Xpath注入
查找XPath解析模块或解析函数,判断是否存在参数拼接,根据数据流的过程,逐步向上回溯,定位到用户可控参数。
3.4、XML注入
审计XML解析和存储相关的方法,搜索“DocumentBuilder”等关键词,分析是否存在参数拼接的XML字符串,或未做限制的批量解析方法。对参数进行回溯,判断其是否用户可控。
3.5、XML外部实体注入
针对代码中解析XML的功能,那么可根据XML解析函数直接定位漏洞代码,然后根据数据流的过程,逐步向上回溯,定位到用户可控参数。如下图所示,在代码中搜索“xml”或“DocumentBuilder”等字符,搜索出所有的与XML解析操作相关的代码,查看是否存在未设置禁止XML外部实体解析的情况,以及XML数据来源用户是否可控的情况。
3.6、命令注入
针对代码中编写的命令执行语句,那么可通过搜索“Runtime.getRuntime().exec”直接定位漏洞代码,然后根据数据流的过程,逐步向上回溯,定位到用户可控参数。如下图所示,在代码中搜索“Runtime.getRuntime().exec”字符串,搜索出所有的与命令执行操作相关的代码,查看是否存在命令参数用户可控的情况。
3.7、CRLF注入
全文搜索“setHeader”等HttpServletResponse对象的方法,查看是否存在将未处理的请求参数直接输出到响应数据包的响应头中的行为。
3.8、文件包含
搜索jsp文件中的“include”,查看是否存在用户可控的文件路径。
3.9、拒绝服务
通过传入的length、width和height等参数来创建图片。代码中没有对传入的参数进行大小限制,当参数length、width和height非常大时,会对服务器造成压力。
4、文件和资源管理
4.1、文件上传
计文件上传功能,若对上传的文件无任何限制,则存在漏洞。
4.2、路径遍历
搜索“new File”关键字,对文件路径、文件名进行溯源,判断其是否是前端请求传入。
4.3、服务器端请求伪造
搜索“URLConnection”、“URL”等关键字,然后根据数据流的过程,逐步向上回溯,定位到用户可控参数。
4.4、不安全的重定向
全文搜索用于重定向的方法,如“sendRedirect”,重点审计参数是变量的重定向操作,逆向溯源该变量是否是前端可控的。
4.5、任意文件下载
以下代码通过从请求中获取的imageName拼接路径从而下载对应文件。代码中没有对该参数进行严格的验证和过滤,就拼接成完整的图片路径,没有检测文件类型、是否包含../../目录跳转的字符,如果imageName中包含../或者为其他类型文件,只要文件存在即可进行任意文件下载。
5、反序列化
在审计时,查找相关反序列化函数,从而找到问题点。
反序列化函数:
ObjectInputStream.readObjectObjectInputStream.readUnsharedXMLDecoder.readObjectYaml.loadXStream.fromXMLObjectMapper.readValueJSON.parseObject
示例1
代码从请求中获取json字符串,并反序列化为User对象。
示例2
代码从请求中输入流,并反序列化为对象,输入流未经验证直接进行反序列化。
6、会话管理
6.1、Cookie安全
6.2、Session安全
示例1:
下面示例中的Session ID长度较短,容易被猜测
示例2:
下面示例中设置setMaxInactiveInterval为负值,使会话保持无限期的活动状态
7、第三方组件
检查引入pom.xml文件中组件的版本信息
查看对应版本是否存在漏洞:https://mvnrepository.com/
8、密码管理
8.1、密码硬编码
在审计时,通过搜索password、passwd、pw、admin、key等关键字查找漏洞可能发生的位置,再进一步对代码进行审计。
8.2、弱加密
以下加密方式采用DES加密算法(加密强度不够,能够暴力破解),此算法对于保护数据的机密性较差,会降低系统的安全性。
以下代码为使用base64编码的方式对从配置文件中获取的密码进行解码。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:huan666 huan666 huan666《JavaWeb代码审计保姆级教程纯案例篇》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论