Java代码审计 入门篇

978-7-115-56554-9
作者: 徐焱
译者:
编辑: 陈聪聪
分类: Java

图书目录:

详情

《Java代码审计 入门篇》由浅入深、系统地介绍了Java代码审计的流程、Java Web漏洞产生的原理以及实战讲解,并力求语言通俗易懂、举例简单明了,便于读者阅读领会。同时结合具体案例进行讲解,可以让读者身临其境,快速了解和掌握主流的Java代码安全审计技巧。 阅读《Java代码审计 入门篇》不要求读者具备代码审计的相关背景,如有相关经验,对理解本书内容会更有帮助。《Java代码审计 入门篇》也可作为高等院校信息安全专业的教材。

图书摘要

版权信息

书名:Java代码审计(入门篇)

ISBN:978-7-115-56554-9

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

主  编 徐 焱

著    陈俊杰 李柯俊 章 宇 蔡国宝

责任编辑 陈聪聪

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315


本书由浅入深、全面、系统地介绍了Java代码审计的流程、Java Web漏洞产生的原理以及实战讲解,并力求语言通俗易懂、举例简单明了,便于读者阅读领会。同时结合具体案例进行讲解,可以让读者身临其境,快速了解和掌握主流的Java代码安全审计技巧。

阅读本书不要求读者具备代码审计的相关背景,如有相关经验,对理解本书内容会更有帮助。本书也可作为高等院校信息安全专业的教材。


在编写本书的时候,我们将研发部门视为一类重要的读者群体。我们曾经和规模大小不一、业务类型各异的客户进行过交流。在交流的时候,可以明显地感觉到“偏科现象”。例如,产品经理、项目经理重业务而轻安全,开发人员可以编写丰富多彩的应用却不了解网站安全漏洞,测试人员可以抓住Bug但擒不住漏洞。

“术业有专攻”,某些研发部门对应用安全的认识有所欠缺是情有可原的。然而,研发部门未知的“代码安全技术盲区”常常和攻击者已知的“攻击利用方式”有着高度重合,这使许多Web应用曾经失陷,或者正面临着极大的安全风险。基于此,广受业界关注的SDL(Security Development Life cycle,安全开发周期)与安全左移(Shift Left)对于“筑牢Web应用的安全地基”具有重要意义。

“解铃还须系铃人”,在SDL和安全左移中,编码均是核心环节。若负责编码的开发人员能够在开发阶段通过代码审计发现安全问题,并通过安全编码解决这些问题,将为应用产生深远的良性影响。例如,对于XXE漏洞的防御,若开发人员可在不影响系统业务的前提下做“禁止引用外部实体”的设置,即可起到“一夫当关,万夫莫开”的效用,也无须另外部署WAF;再如,对于越权漏洞,许多安全产品并不具备该项检测能力,为了治本,开发人员通过代码审计与安全编码技能做漏洞修复的效果显然更好。

“谋定而后动,知止而有得”,我们发现在不少Java开发人员身上有这样的痛点:“虽初具Web应用开发的安全意识,却仍存在‘面积较大的技术盲区’,并且暂未建立起代码审计与安全开发的知识、技术框架。”对于此,希望这本系统地介绍Java代码安全审计入门技术的图书可以帮助开发人员缓解这一痛点。希望本书的核心章节可以帮助开发人员了解安全人员做Web漏洞挖掘时在想什么,并思考、绘制属于自己的Java安全知识、技能结构图,能知己知彼,百战不殆。本书可以作为Java开发人员的代码审计入门宝典与安全开发实战指南。读者可以借此书夯实Java安全基本功,在面对不断演化的技术栈时也能以不变应万变。


在我们实战经验中,Java相关组件的高危漏洞出现频次是比较高的。在2021年,我们就应急处理了多起Java类高危漏洞事件。在网络空间攻防战中,如果能抢先攻击者一步掌握漏洞信息,就能在防守中占据主导地位。代码审计是发现漏洞非常有效的一种手段,是黑盒渗透测试的一个重要补充。

作为一家从事网络安全的企业,承担社会责任是应有之义。本书撰写之时国内市场还没有Java代码安全审计相关的技术图书。它全面性地阐述了Java类代码审计的基础知识、审计流程、常用工具和相关的经典案例,是几位作者多年实战经验的总结;本书对甲方的安全建设和乙方的安全研究均大有裨益。它既可以作为Java类代码开发人员安全开发的参考图书,也可以作为Java代码审计安全研究人员的学习入门书籍。本书结构划分合理,逻辑缜密,案例丰富,讲解细致,讲练结合,从而能帮助零基础的读者快速入门,即便是基础较好的读者也能对照此书进行查缺补漏。相信本书将是我们掌握网络空间世界安全主动权的宝典之一。

“九层之台,起于累土”,一名合格的安全人需不断地汲取网络安全领域里前沿且全面的安全技术和技术知识,并且脚踏实地、稳扎稳打地提升自身综合的安全能力。愿这本载满诚意、安全新视角的图书能给予读者朋友帮助,也欢迎更多志同道合的安全人能借此书打开一扇“安全之门”,与安全狗一起守护数字世界,助力网络强国!

陈奋

国内知名网络安全专家

厦门服云信息科技有限公司(安全狗)CEO

安全狗品牌创始人

开创国内(云)主机网络安全新市场

随着信息化技术的飞速发展以及互联网的应用普及,网络安全问题已经成为了重中之重。2018年4月,全国网络安全和信息化工作会议上指出“没有网络安全就没有国家安全”!国家对信息安全行业的高度重视和一系列相关法律法规的出台,标志着信息安全已经上升到与政治安全、经济安全、领土安全等并驾齐驱的战略高度。

徐焱组织编写的这本关于Java代码审计的书,我有幸提前阅读了整体目录和大部分章节,给我最大的感受就是“用心”“实用”。代码审计对于网络安全攻防的意义不言而喻;特别是随着Java逐渐成为核心开发语言,在国内外大量主流大型应用均采用Java Web的背景下,无论是“攻”还是“防”方面,Java代码审计都是安全从业者所必须掌握的技能之一。而目前国内市场Java代码安全审计方面的相关技术图书很少见,即使对于其他开发语言,此类题材的图书也是凤毛麟角,该书的出版填补了国内对于“Java代码安全审计领域”图书的空白。

通读全书,本书不仅适合想迈入 Java 代码审计大门的安全爱好者,也可作为大专院校信息安全专业的配套书目,同时也非常适合作为从事网络安全渗透测试人员、企业信息安全防护人员、研发、运维、测试、架构等技术团队进行学习的参考图书。

最后,希望本书能够成为广大读者在Java代码审计与安全研究和应用中的良师益友,成为在事业发展道路中的一盏明灯。

北京交通大学教授,博士生导师

信息安全系主任

王伟 2020.12.24

代码审计,从根本意义上来说就是挖掘源程序中存在的代码安全问题,我们团队中还有一部分人也做着一个相似的工作—漏洞fuzzing技术。但代码审计与漏洞 fuzzing 技术又有很大的不同,当前的漏洞 fuzzing 技术依旧存在着很多困难,对于逻辑漏洞、配置漏洞等识别较为困难,另外和人工挖掘相比,漏洞 fuzzing还存在花费时间长,效率较低等问题,这也正是代码审计的优势所在。

通过这些年的学术研究和网络空间安全从业者水平调研,我能够清晰地感觉到,伴随着国内网络空间安全技术的发展,最初的一些只会使用黑客工具的“脚本小子”逐渐被能够进行代码分析、编写脚本的专业安全人员所代替。可以说,一个优秀的安全人员,必须要懂编程。但是懂编程仅仅是第一步,懂编程的人不胜其数,但将编程能力演变成代码审计能力,并且利用代码审计能力去挖掘漏洞的人却少之又少。代码审计是一门技术活,而对于Java 代码审计来说,又因为 Java 语言的多样性,导致 Java 审计技术难度更大,在市面上也很少能够看到系统性的Java代码审计的教程。

对于想要迈入 Java 代码审计的人来说,这本书是一份很好的教材,本书对 Java 代码审计中的各个漏洞点进行了详细剖析,对 Java 代码审计的关键知识点进行了总结,并且通过实战的方式告诉你,Java 代码审计应该是什么样的流程。

攻与防犹如盾与矛,盾刚则矛折,矛硬则盾破,对于攻击方来说,这本书能够让你学到Java 代码审计的原理知识、审计流程以及审计技巧,可以给你的“矛”增加硬度;对于防守方来说,这本书可以让你学到 Java Web 漏洞产生的原因、攻击方角度审视代码安全以及各类漏洞的修复方式,可以给你的“盾”增加刚性。

雏凤清于老凤声,希望年轻的读者能够通过这本年轻人写的书对于代码审计知其然,并知其所以然,擅于发散自己的思维,深刻去了解什么是“安全”,也希望本书的读者为中国网络空间安全贡献一份力!

丁勇

教育部网络空间安全教学指导委员会委员

广西高层次人才 E 层次人才

民盟中央青年委员会委员

鹏城实验室兼职教授

科技部重点研发会评专家

PPNA期刊副主编

环球时报大数据中心特聘专家

在听到这本书的时候,我想网络安全领域内又一块空白即将被填补了。对于大多数徘徊在Java安全门口的初学者来说,这无疑是幸运的。

我想起自己初学代码审计的时候,每天都要翻阅晦涩难懂的官方文档和搜索引擎中成千上万的转发文章,有时候为了一些文档里没有介绍过的技术细节只能翻阅底层源码。对于初学者来说这个过程异常艰难,在解决一个问题的时候经常会遇上更多新的问题,在被问题牵着鼻子走了很久之后,甚至忘记自己最初究竟被什么困扰。

造成这个困境的原因是,那时候网络安全领域还没有现在这样细分,少数的一些图书通常是各种漏洞与入侵方法的介绍,而很少有深入研究某个领域技术细节和原理的内容。后来随着国家对网络安全的重视,这个市场变得百花齐放,但直到今天以前,Java代码审计领域也鲜有可以带领大家入门学习的系统性教材。

很多人因为没有合适的入门代码审计的机会,一直被卡在瓶颈,《Java代码审计(入门篇)》的出版,可以帮助他们真正理解Java代码审计的方法。本书从常用工具使用和Java EE的基础知识开始讲起,逐渐深入地带领读者入门Java代码审计领域,学习如何挖掘Java应用中的安全漏洞,最后通过一个真实案例来实践和完善知识体系。

对于Java开发人员来说,阅读本书可以增长自己对安全漏洞的认知与了解,且书中也介绍了漏洞的修复方法,可以避免以后工作中发生同样的错误;对于安全测试人员来说,阅读本书可以学习Java漏洞挖掘方法,开始积累自己的“漏洞库”,在安全服务、红蓝对抗、CTF夺旗赛中获得更优秀的成果;对于普通的编程与安全爱好者,阅读本书也能丰富自己的知识面,也许能让你开始爱上代码审计。

安全社区“代码审计”创始人

phith0n 2020.12.25

我曾经策划过国内第一档黑客安全栏目—“黑客防线”,后来主编过《黑客X档案》和《黑客手册》。我当时主编的《黑客X档案》《黑客手册》,栏目方向涵盖了“新闻”“安全”“Crack”“编程”“渗透”“小说”“脚本”等,庞杂而多元。杂志的黏性吸引了读者,被黏住的读者需要被引向哪里呢?自然是图书。

图书相对杂志的多元化碎片阅读体验而言,它是系统的、专业的、精准的。杂志到图书,是进阶,是递进式学习模式。杂志像一所小学,它有启发性、广泛性,它引导读者去了解世界的广博,从而增加见识;而图书则是一所大学,它聚焦、垂直,它引领读者从广泛的认知中扎向一门专业的知识体系。如果通过杂志的其中一篇文章来了解一个知识点,是管中窥豹难见全貌;那图书则是上帝视角,它所能俯瞰的几乎包罗万象巨细靡遗。杂志是横向的,图书是纵向的,两者合纵连横,互为补充依存。

现在纸媒杂志已逐渐被网媒取代,在人人皆为媒体的个性表达时代,汲取广泛的认知从线下转为线上,零碎动态知识的获取在移动互联网时代更加短平快。但是图书在当下这个时代依然保有旺盛生命力,与它自身特点紧密相关。优质图书仍是系统化知识学习的重要渠道,因为它是由作者多年的经验和心血凝结而成,是高附加值产品,除了知识的熏陶,它对读者的择业、就业都会产生深远影响。

徐老师邀我为他的新书写序,读完该书部分章节,我觉得,写得很好很全很专业,做为一名编辑,我懂一本书它为什么好,从行文严谨度、知识点密度、引导铺垫方式这些维度,我觉得这本书的人机界面是友好的,它具有能把一名读者由浅入深循循善诱渐引入门的能力。本书很吻合当年我们杂志上的一句slogan,“黑夜给了我黑色的眼睛,我却用它寻找漏洞”。

最后,我想用当年黑客杂志上那些热血作者在渗透文章里常写的一句话作为祝愿,“不让生活磨灭我们的个性”。

部分土豆进城

“黑客防线”栏目创始人

“黑客X档案”“黑客手册”创始人

2021年1月31日夜


徐焱

徐焱,北京交通大学安全研究员,MS08067安全实验室创始人,2002年接触网络安全,已出版《Web安全攻防:渗透测试实战指南》《内网安全攻防:渗透测试实战指南》《Python安全攻防:渗透测试实战指南》《网络攻防实战研究:漏洞利用与提权》等图书。

陈俊杰

陈俊杰,网名:Chenergy,安全狗海青实验室安全研究工程师,MS08067核心成员,主要从事Java Web安全、容器安全、主机安全等方面的攻防研究,曾在FreeBuf、360安全客等媒体发表过多篇技术文章。

李柯俊

李柯俊,网名:有关部门临时工,2018年毕业于天津师范大学,先后就职于启明星辰和天融信,现任天融信阿尔法实验室Web安全研究员;MS08067核心成员;擅长方向:代码审计、渗透测试、安全开发。

章宇

章宇,网名:Yu,安全狗海青实验室安全研究工程师,MS08067核心成员,主要从事渗透测试、代码审计等方面研究,曾挖掘过多个CNVD通用型漏洞和CVE漏洞,并在FreeBuf、360安全客等媒体发表过多篇技术文章。

蔡国宝

蔡国宝,网名:panda,90sec Team 核心成员,MS08067核心成员,T00ls荣誉成员,CTF 战队 kn0ck 队员,主要从事代码审计、Web 渗透等方向的安全研究,曾提交过CVE、CNVD 漏洞,并在阿里云先知社区等媒体发表过多篇技术文章。


在撰写本书前,我们团队内部讨论了关于本书的定位——面向哪些人?最终,我们决定写一本真正意义上的入门级别的Java代码安全审计图书,即面向的人群是没有安全开发意识或经验的Java安全开发人员、没学过Java安全的网络安全从业者以及Java代码审计爱好者,所以我们相信这本书对他们一定有所帮助。

那么代码审计对攻防研究有着怎样重要的意义?

在“攻”方面,传统的通过扫描器扫描站点或利用 NDay来渗透的方式已经受到了很大的制约,现在及未来的典型渗透测试流程是:确定站点指纹→通过旁站扫描备份或开源程序得到源代码→代码审计→利用审计出来的漏洞制定修订措施,所以代码审计能力也越发重要。

在“防”方面,国内有大量网站都曾遭到过拖库,其中相当一部分漏洞是因为代码导致的。如果企业安全人员具备代码审计的能力,能够提前做好代码审计工作,在黑客发现系统漏洞之前找出安全隐患,提前部署相应安全防御措施,可落实“安全左移”,提高应用系统的安全性,从而“治未病”。

在主流的大型应用中,Java俨然成为了首选开发语言。目前国内外大型企业大多采用Java作为核心的开发语言,因此对于安全从业者来说,Java代码审计已经成为了自身应该掌握的关键技能。但目前市面上并没有关于Java代码安全审计方面的图书,这也是我们撰写本书的出发点,希望能为网络安全行业贡献自己的一份微薄之力。

本书是MS08067安全实验室推出的继《Web安全攻防:渗透测试实战指南》《内网安全攻防:渗透测试实战指南》《Python安全攻防:渗透测试实战指南》后又一本网络安全领域的力作,建议读者联合阅读。建议关注MS08067安全实验室公众号或官网,学习实验室出品的其他各类最新图书和技术文章、视频。

(1)市面上缺乏关于Java代码安全审计图书品种,本书的出版是对其的补充。

(2)从理论到实践,非常适合Java 代码审计的入门学习。

(3)对结构的划分较为合理,可帮助读者由“单点到代码全局”了解漏洞,并达到“从入门到适度提高”的学习目的。

(4)对初学者较为“友好”,可帮助安全人员或研发人员补充实用的预备知识。

(5)设置的案例较为丰富、详实,利于读者掌握较全面的系统知识。

(6)对案例的讲解较为详细,方便读者同步进行实际操作,扎实地掌握知识和技能。

在本书编写过程中,遵从的主旨是“通过较详细的漏洞点剖析以及代码审计实战演示帮助读者朋友初步了解Java代码审计,夯实Java代码审计的基本功,并迈入Java代码审计的大门”。为此,我们对内容结构做了如下组织。

(1)第1~4章介绍Java代码审计预备知识。

(2)第5章和第6章介绍典型的Java Web漏洞。

(3)第7章介绍Java EE开发框架安全审计。

(4)第8章介绍开源Java Web应用代码审计实战知识。

(5)第9章介绍“交互式应用程序安全测试”与“运行时应用自保护”的相关知识。

(6)附录帮助读者了解Java安全编码规范。

本书将理论讲解和实验操作相结合,深入浅出、循序渐进,并通过大量的图文解说,方便初学者快速掌握Java代码安全审计的具体方法和流程,并逐步建立对Java代码安全审计的系统性认知。

第1章 初识Java代码审计

本章简单介绍了Java代码安全审计的基本范畴、代码审计的意义、代码审计所需的基础以及Java代码审计的常用思路。

第2章 代码审计环境搭建

本章介绍了Java代码审计环境的搭建方法,主要包括:JDK的下载与安装、Docker的漏洞验证环境搭建、对Weblogic和Tomcat进行远程调试以及项目构建工具的使用等基本知识。

第3章 代码审计辅助工具简介

本章简单介绍了在代码审计过程中需要用到的工具或平台,包括代码编辑器、测试工具、反编译工具、Java代码静态扫描工具以及漏洞信息公开平台。

第4章 Java EE基础知识

本章介绍了Java EE基础知识,主要包括Java EE 分层模型、MVC模式与MVC框架的定义、主流Java MVC框架简介、Servlet知识点、filter知识点、反射机制、ClassLoader类加载机制、Java动态代理和Java Web安全开发框架等基础知识。

第5章 “OWASP Top 10 2017”漏洞的代码审计

本章介绍了“OWASP Top 10 2017”十大Web 应用程序安全风险列表中的典型Java代码审计案例(注入、失效的身份认证、敏感信息泄露、XML外部实体注入、失效的访问控制、安全配置错误、跨站脚本攻击、不安全的反序列化、使用含有已知漏洞组件以及不足的日志记录和监控),这些案例可帮助读者在较短时间内理解并掌握高频漏洞的代码审计关键问题。

第6章 “OWASP Top 10 2017”之外常见漏洞的代码审计

本章主要介绍CSRF 漏洞的原理和实例、SSRF 漏洞的原理和实例、URL 跳转与钓鱼漏洞讲解、文件包含漏洞讲解、文件上传讲解、文件下载讲解、文件写入讲解、文件解压讲解、Web后门讲解、逻辑漏洞讲解、CORS/SCP 介绍、拒绝服务攻击原理和实例、点击劫持漏洞原理和实例、HPP漏洞介绍等知识点,这些知识点能够帮助读者了解漏洞的形成原因,理解漏洞的利用方式以及漏洞修复方法。

第7章 Java EE开发框架安全审计

Java EE开发框架虽然极大提高了生产效率,却可能为Web应用带来致命的危害。本章主要通过详细的代码审计过程讲解SSM、Struts2、Spring Boot等框架的代码审计技巧,以及Struts2远程代码执行漏洞开发框架的错误使用案例。

第8章 Jspxcms代码审计实战

实践是检验漏洞挖掘学习效果的最好方式,通过实践审计,能够帮助审计者了解真实环境中的审计情形,方便审计者体验真实场景。本章主要通过Jspxcms源程序实例讲解了SQL注入、XSS、SSRF以及RCE漏洞的审计过程。

第9章 小话IAST与RASP

IAST是“交互式应用程序安全测试”对代码审计有所补益,RASP(运行时应用自保护)是动态防御的有效技术。本章的主要内容是对IAST与RASP进行简要介绍,并对二者共同的核心模块Java-agent进行实验探究和原理浅析。

附录 Java安全编码规范索引

Java安全编码的核心基础是一系列的编码指南和安全规范。本章的主要内容是向读者朋友分享一些Java 安全编码规范。

本书作为入门级别的Java 代码安全审计图书,对于已经有一定基础,但是Java代码安全审计能力还需要提升的人群来说,帮助不是很大,他们需要更深层次的内容。所以我们有计划编写《Java 代码审计(进阶篇)》,在进阶版中,我们会详细介绍在本书中未加入的诸如 JNDI、RMI、LDAP、Java 反序列化gadget 链构造方法、Ysoserial中的 CC 链以及其他链的分析等内容;也会拓展由于受篇幅限制,本书中对一些知识点未做展开介绍,包括:反序列化链、认证鉴权(整合JWT、Spring Security、Shiro)、Java开发框架安全漏洞(如Struts2)、Java中间件安全漏洞(如JBoss)、微服务架构Web应用代码审计等。敬请期待!

本书仅限于讨论网络安全技术,请勿作非法用途,严禁利用本书所提到的漏洞和技术进行非法攻击,否则后果自负,本人和出版商不承担任何责任!

本书的同步公众号为“MS08067安全实验室”,读者可通过搜索公众号号码Ms08067_com或扫描下方二维码添加关注,公众号可提供以下资源。

感谢人民邮电出版社策划编辑为本书的出版做出的大量工作;感谢李韩﹑王康对本书配套网站的维护。感谢陈奋﹑王伟﹑丁勇﹑phith0n﹑部分土豆进城﹑oldjun﹑兜哥﹑御剑﹑王任飞﹑lake2﹑赵弼政百忙之中抽空为本书作序并推荐。

MS08067安全实验室是一个低调潜心研究技术的团队,衷心感谢团队的所有成员,包括那些曾经和我们一起战斗过的兄弟姐妹,也欢迎更多的志同道合的小伙伴加入我们!感谢你们!

感谢我的父母﹑妻子和最爱的女儿徐晞溪,我的生命因你们而有意义!

感谢身边每一位亲人﹑朋友和同事,谢谢你们一直以来对我的关心照顾和支持。

最后,我们衷心希望广大信息安全从业者、爱好者以及安全开发人员能够在阅读本书的过程中有所收益。在此感谢读者朋友们对于本书给予的支持!

念念不忘,必有回响!

徐焱

2020年12月于北京

感谢我的父母、妻子和“东发一号”与“怀亲恩”的家人们,你们给予我温暖的关怀和源源不断的支持;感谢安全狗为我创造钻研和发展的平台;感谢我的恩师周豫苹、康恺和Steve Ling,你们给予我关爱与教诲;感谢给予我帮助的朋友、贵人,您们给予我“阳光雨露”。最后感谢徐焱老师以及柯俊、小宇、国宝三位师傅,我很幸运能在共事中向你们学习。

Carpe Diem!

 陈俊杰

 2020年12月于厦门

首先感谢我的父母和家人们,感谢他们为我提供了一个可以全心投入工作和学习中,而没有后顾之忧的一个家庭环境。同时感谢天融信阿尔法实验室,在这里工作让我接触并学习到了大量的知识和前沿的技术。最后感谢MS08067实验室给了我这样一个展示自己学习成果的机会。

 李柯俊

2020年12月于北京

感谢安全狗海青实验室的每一位同事,曾给予了我许多的帮助,感谢安全狗提供了我成长的平台和资源,这让我得到了不少锻炼。感谢我的家人和朋友的支持与帮助。感谢周豫苹老师的指引,让我有幸步入安全这条道路。感谢徐焱老师提供了这次机会,能够与大家分享交流。最后还要感谢叶花的陪伴与理解。

章宇

 2020年12月于福州

首先感谢我的家人对我的支持和鼓励,感谢我的老师们对我的指导和关怀,其次感谢带我迈入安全圈的 Lyon前辈以及在我初入安全圈给我很多帮助的xiaochu师傅,是他们给了我正确的方向,让我深深热爱上这个行业。最后感谢所有帮助过我的人(包括但不仅限于郑伟、胡湘君、一木、振宇、秀清、唐彧、王秀友、韩天鹏、周静、孙刚等人),是你们让我披荆斩棘,勇往直前。

道阻且长,行则将至,行而不辍,未来可期。

蔡国宝

 2020年12月于桂林


本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“提交勘误”,输入勘误信息,单击“提交”按钮即可。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

我们的联系邮箱是chencongcong@ptpress.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们。

如果您所在的学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。

“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。

异步社区

微信服务号


代码审计(Code Audit)是一种以发现安全漏洞、程序错误和程序违规为目标的源代码分析技能。在实践过程中,可通过人工审查或者自动化工具的方式,对程序源代码进行检查和分析,发现这些源代码缺陷引发的安全漏洞,并提供代码修订措施和建议。

在本书中,我们的代码审计语言是Java,主要审计对象是利用Java开发的网站中的安全漏洞。

本书通过理论知识联系实际案例,帮助读者掌握Java代码审计的基本方法,厘清漏洞挖掘思路。

2020年10月的CNVD安全月报显示,Web应用程序的漏洞占比34%,显而易见,Web应用程序仍然是安全防御的重中之重,因此对业务代码进行安全审计是十分重要的,如图1-1所示。

图1-1 Web应用程序漏洞影响重大

随着Java Web应用越来越广泛,安全审计已经成为安全测试人员需要直面的工作。虽然PHP在中小型互联网中仍占据一席之地,但在主流的大型应用中,Java仍是首选的开发语言,国内外大型企业大多以Java作为核心的开发语言。因此对于安全从业者来说,Java代码审计已经成为需要掌握的关键技能。

代码审计对攻防研究有着重要的意义。在“攻”方面,如果渗透测试人员、漏洞研究人员不了解代码审计,则在渗透测试的实战过程中难以“细致入微”,可能遇到的麻烦包括但不限于以下几种。

举例说明,以往的通过扫描器扫描站点或利用NDay进行渗透测试的方式已经受到了很大的制约,现在及未来比较典型的渗透测试流程是:确定站点指纹→通过旁站扫描备份或开源程序得到源代码→代码审计→利用审计出来的漏洞。因此对于渗透测试人员而言,代码审计能力也显得越发重要。

在“防”方面,国内有大量网站曾遭到拖库,其中相当一部分漏洞就是因为代码导致的。本书作者也曾经帮助多家企业开展过Java代码审计项目以及Java安全开发培训。在工作中发现,即使对于有着雄厚的研发能力、完备的安全合规要求以及明确的人员分工的IT巨头,其应用系统的源码也可能存在“阿喀琉斯之踵”般的致命弱点;而小型单位则经常有着“重业务,轻安全”或者“对Web安全漏洞了解得不全面、深入”的通病(这在注入、越权、反序列化、应用程序依赖库等漏洞类型显得较为明显)。如果企业安全人员具备代码审计的能力,就能提前做好代码审计工作,在黑客发现系统漏洞之前找出安全隐患,提前部署好相应的安全防御措施,落实“安全左移”,提高应用系统的安全性,从而“治未病”。

唯一不变的是变化本身,随着云计算技术的蓬勃发展,传统上云实践中的应用升级缓慢、架构臃肿、无法快速迭代等“痛点”日益明显。基于此,云原生技术蓬勃发展;变化中亦有不变,通过分析云原生的代表技术微服务和声明式 API的安全风险可以发现,应用安全仍是其中的防护重点。因而,若在云原生安全建设初期践行“源代码安全审计”,将安全投资更多地放到开发安全,包括安全编码、供应链(软件库、开源软件)安全、镜像(仓库)安全等,可起到减少安全投资、增加攻击难度的效果。代码安全审计在当下以至未来均可对Web应用安全的防护重要作用。

术业有专攻。安全人员与研发、测试人员看代码的视角也往往不同。基于此,我们认为从安全人员的角度帮助对Java安全经验有所欠缺的研发、测试人员快速地了解并掌握高频且重要的Java代码审计知识、搭建知识技能框架,亦或是帮助已具备相关经验的人士进行查缺补漏均具有重要意义。

Java代码审计要求代码审计人员能够“动静结合”。在“动”方面,要求代码审计人员具备调试程序的能力。若代码逻辑比较复杂,则可以通过多次调试或关键位置设置断点辅助理解。在“静”方面,要求代码审计人员具备一定的编程基础,了解基本语法与面向对象思想。若代码审计人员能够通过阅读代码理解代码逻辑,并善于查阅文档和资料,就能解决大多数问题。

本书将在第4章介绍部分Java EE的知识作为铺垫,以便帮助读者理解漏洞的形成和漏洞利用的方法。

为了在应用代码中寻找目标代码的漏洞,需要有明确的方法论做指导。方法论的选择则要视目标程序和要寻找的漏洞类型而定,以下是一些常用思路。

(1)接口排查(“正向追踪”):先找出从外部接口接收的参数,并跟踪其传递过程,观察是否有参数校验不严的变量传入高危方法中,或者在传递的过程中是否有代码逻辑漏洞(为了提高排查的全面性,代码审计人员可以向研发人员索要接口清单)。  

(2)危险方法溯源(“逆向追踪”):检查敏感方法的参数,并查看参数的传递与处理,判断变量是否可控并且已经过严格的过滤。

(3)功能点定向审计:根据经验判断该类应用通常会在哪些功能中出现漏洞,直接审计该类功能的代码。

(4)第三方组件、中间件版本比对:检查Web应用所使用的第三方组件或中间件的版本是否受到已知漏洞的影响。

(5)补丁比对:通过对补丁做比对,反推漏洞出处。

(6)“黑盒测试”+“白盒测试”:我认为“白盒测试少直觉,黑盒测试难入微”。虽然代码审计的过程须以“白盒测试”为主,但是在过程中辅以“黑盒测试”将有助于快速定位到接口或做更全面的分析判断。交互式应用安全测试技术IAST就结合了“黑盒测试”与“白盒测试”的特点。

(7)“代码静态扫描工具”+“人工研判”:对于某些漏洞,使用代码静态扫描工具代替人工漏洞挖掘可以显著提高审计工作的效率。然而,代码静态扫描工具也存在“误报率高”等缺陷,具体使用时往往需要进一步研判。

(8)开发框架安全审计:审计Web应用所使用的开发框架是否存在自身安全性问题,或者由于用户使用不当而引发的安全风险。

扫描二维码

正式学习前需要哪些预备知识

学习Java代码审计时的4个常见问题


相关图书

Effective Java中文版(原书第3版)
Effective Java中文版(原书第3版)
Java核心技术速学版(第3版)
Java核心技术速学版(第3版)
Java编程动手学
Java编程动手学
Java研发自测入门与进阶
Java研发自测入门与进阶
Java开发坑点解析:从根因分析到最佳实践
Java开发坑点解析:从根因分析到最佳实践
Java EE企业级应用开发实战(Spring Boot+Vue+Element)
Java EE企业级应用开发实战(Spring Boot+Vue+Element)

相关文章

相关课程