Java代码审计连载之—添油加醋

本文讲的是Java代码审计连载之—添油加醋,在代码审计中,按业务流程审计当然是必须的,人工的流程审计的优点是能够更加全面的发现漏洞,但是缺点是查找漏洞效率低下。如果要定向的查找漏洞,逆向跟踪变量技术就显得更加突出,如查找XSS、SQL注入、命令执行……等等,逆向查找变量能够快速定位漏洞是否存在,本次已SQL注入为例。   

                                                                    

前言

本篇文章原本是个PPT,但是一直放着没有分享,想着闲着也是闲着,那就改成文章发布吧。其实本篇重点在于两个知识点,一个是代码审计的逆向思维,另一个是二次攻击漏洞,其他的我都省略了,就写几个重要的吧。对于二次攻击我也是最近才研究的,研究了点皮毛,错误之处还请广大圈友指正,谢谢。

代码审计学习之旅

总有人问我代码审计该怎么学习,该从哪学习,现在统一回复,表示我也不知道。。。


但是对于个人的学习路线来说,路程是漫长而艰辛的,建议学习如下(直接截图了):

上面我写的是“熟悉”,这只是对刚入行的同学说的,作为代码审计来说,熟练编写代码程序是必须的,要想深度化发展,精通一门语言是必经之路。

知识一-变量逆向跟踪

在代码审计中,按业务流程审计当然是必须的,人工的流程审计的优点是能够更加全面的发现漏洞,但是缺点是查找漏洞效率低下。如果要定向的查找漏洞,逆向跟踪变量技术就显得更加突出,如查找XSS、SQL注入、命令执行……等等,逆向查找变量能够快速定位漏洞是否存在,本次已SQL注入为例。

什么是逆向跟踪   顾名思义,逆向跟踪就是对变量的逆向查找,开始全局查找出可能存在漏洞的触发点,然后回溯参数到前端,查看参数来源已经参数传递过程中的处理过程。

逆向跟踪流程   怎样才能快速定位呢?下面我们一起看下流程。

1、查看全局文件web.xml

Web.xml主要是配置web项目启动时加载的信息,比如<listener/>配置你的监听器,<filter/>配置过滤器,<servlet/>配置你的servlet实现。我们主要查看全局过滤器是否过滤特殊字符已经过滤哪些字符,显然没有。

2、寻找漏洞触发点

本次以SQL注入为例,SQL注入我就不说了,相关文档一堆。当我们看到如下形势的SQL语句,就可能存在SQL注入:

因为安全的写法是这样的:

那么,参数“word”可能存在SQL注入漏洞,那我们就回溯“word”参数,看看“word”值到底是怎么传进来的,回溯到控制层,发现该“word”参数:

追踪到控制层基本可以确定漏洞存在,并且没有做相应的过滤,但是为防止“search”方法只是内部调用,继续回溯“searchword”值,查看是否从前端页面传入的:

发现该“searchword”是从前端页面传入,因此可以确定漏洞存在,SQLmap截图如下:

以上就是简单的逆向跟踪变量小技巧,什么?太low?没办法,就这水平。

知识二-二次漏洞审计

二次漏洞也叫二次攻击,这方面的资料网上很少,我自己研究了一阵子,发现二次攻击形势有很多,也没明白多少,这次就谈谈容易明白的二次命令攻击漏洞,不喜勿喷。

二次漏洞定义:

攻击者提交的恶意的代码不是直接通过一个变量提交漏洞函数而是通过变量转化或者中转,最终提交到漏洞函数。

二次漏洞特点:

1、常常存在漏洞类型的转换。

2、常常存在变量中转。

二次漏洞类型:

1、通过SQL注射漏洞转化。

2、通过编码/解码中转变量。

3、其它方式。

二次命令攻击

二次注入漏洞是一种在Web应用程序中广泛存在的安全漏洞形式。相对于一次注入漏洞而言,二次注入漏洞更难以被发现,但是它却具有与一次注入攻击漏洞相同的攻击威力。

基本流程如下:

1、构造参数

在数据库正常的插入、更新等操作中,构造特殊的命令,存储在数据库中:

此处只是方便展示漏洞原理,真实代码中的情况可能复杂的多,此处构造了“cmd”参数为“ipconfig”存储在数据库中。

2、提取变量

当系统内部某处主动调用该参数时,经过了相对应的命令执行参数,就会产生命令攻击。

经过Runtime函数,执行命令执行:

看到这里肯定有人一脸懵逼,精明的小伙伴就看出问题了,这二次攻击不是和存储型跨站一样么,没啥区别啊?

然而严格来说存储型跨站并不属于二次攻击漏洞,存储型跨站虽然也是以数据库作为中转,但是它执行的方式还是靠人为去点击才能生效,但是二次攻击是存储后主动攻击,这就是根本的区别。

结论

上面两点纯属个人理解,有什么错误的地方请多多指教。

原文发布时间为:2017年8月14日

本文作者:i春秋学院

本文来自合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。

原文链接

时间: 2024-12-21 20:52:30

Java代码审计连载之—添油加醋的相关文章

Tomcat与Java Web开发技术详解连载之二

web|详解 2.2.4 部署HTML文件 在helloapp目录下加入index.htm文件,这个文件仅仅用来显示一串带链接的字符"Welcome to HelloApp", 它链接到login.jsp文件.以下是index.htm文件的代码: <html><head><title>helloapp</title></head><body ><p><font size="7"

Tomcat与Java Web开发技术详解连载之一

web|详解 本章介绍如何在Tomcat上创建和发布Web应用.这里首先讲解Tomcat的目录结构以及Web应用的目录结构,接着介绍如何将HTML.Servlet.JSP和Tag Library部署到Web应用中,然后介绍把整个Web应用打包并发布的方法,最后介绍如何在Tomcat上配置虚拟主机. 本章侧重于讨论Web应用的结构和发布方法,所以没有对本章的Servlet和JSP的例子进行详细解释,关于Servlet和JSP的技术可以分别参考其它章节的内容. 2.1 Tomcat的目录结构 在To

Tomcat与Java Web开发技术详解连载之三

web|详解 2.2.8 创建并发布WAR文件 Tomcat既可以运行采用开放式目录结构的Web应用,也可以运行WAR文件.在本书配套光盘的sourcecode/chapter2/helloapp目录下提供了所有源文件,只要把整个helloapp目录拷贝到/webapps目录下,即可运行开放式目录结构的helloapp应用.在Web应用的开发阶段,为了便于调试,通常采用开放式的目录结构来发布Web应用,这样可以方便地更新或替换文件.如果开发完毕,进入产品发布阶段,应该将整个Web应用打包为WAR

《学不会的JAVA,消不了的忧愁》之五——献给那些酷爱计算机编程的人们

编程 各位网友,这是<学不会的JAVA,消不了的忧愁>之五了,在座的不泛JAVA高手,小生一而三,三而再地在爪哇连盟.COM自由论坛上发布奇谈怪论,不知是否碍了大家?不管怎样,灯火夜夜开,闲言说不尽,在没有接到贴子管理员的严重警告之前,这个长篇大贴将继续连载下去. 为了100%尊重网友,所有这些贴子都是本人亲手一词一句精心制作,字里行间不出现任何关于其它URL的链接,也没有任何商业味道,请大家放心阅读. 本人自学JAVA两年有余,第一年发现自己对JAVA很熟,第二年觉得JAVA变了,很多地方还

从Java视角理解系统结构(二)CPU缓存

从Java视角理解系统结构连载, 关注我的微博(链接)了解最新动态 众所周知, CPU是计算机的大脑, 它负责执行程序的指令; 内存负责存数据, 包括程序自身数据. 同样大家都知道, 内存比CPU慢很多. 其实在30年前, CPU的频率和内存总线的频率在同一个级别, 访问内存只比访问CPU寄存器慢一点儿. 由于内存的发展都到技术及成本的限制, 现在获取内存中的一条数据大概需要200多个CPU周期(CPU cycles), 而CPU寄存器一般情况下1个CPU周期就够了. CPU缓存 网页浏览器为了

从Java视角理解系统结构(一)CPU上下文切换

作者:Minzhou  本文是从Java视角理解系统结构连载文章 在高性能编程时,经常接触到多线程. 起初我们的理解是, 多个线程并行地执行总比单个线程要快, 就像多个人一起干活总比一个人干要快. 然而实际情况是, 多线程之间需要竞争IO设备, 或者竞争锁资源,导致往往执行速度还不如单个线程. 在这里有一个经常提及的概念就是: 上下文切换(Context Switch). 上下文切换的精确定义可以参考: http://www.linfo.org/context_switch.html.下面做个简

【人生苦短,我用Python】Python免费精品课连载(1)——Python入门

课程学习:零基础入门学习Python - 阿里云大学 上图中T恤上印着"人生苦短,我用Python"的大牛就是Python的创始人Guido van Rossum.其实这句话来自Bruce Ecke(C++标准委员会成员,<Thinking in Java>作者),原话是"Life is short, you need Python". 为什么这么说呢?我们先来了解一下Python的设计哲学: 优雅 明确 简单 相对于Perl语言中"总是有多种

从Java视角理解系统结构(三)伪共享

从Java视角理解系统结构连载, 关注我的微博(链接)了解最新动态 从我的前一篇博文中, 我们知道了CPU缓存及缓存行的概念, 同时用一个例子说明了编写单线程Java代码时应该注意的问题. 下面我们讨论更为复杂, 而且更符合现实情况的多核编程时将会碰到的问题. 这些问题更容易犯, 连j.u.c包作者Doug Lea大师的JDK代码里也存在这些问题. MESI协议及RFO请求 从前一篇我们知道, 典型的CPU微架构有3级缓存, 每个核都有自己私有的L1, L2缓存. 那么多线程编程时, 另外一个核

从Java视角理解伪共享(False Sharing)

作者:coderplay 从Java视角理解系统结构连载, 关注我的微博(链接)了解最新动态从我的前一篇博文中, 我们知道了CPU缓存及缓存行的概念, 同时用一个例子说明了编写单线程Java代码时应该注意的问题. 下面我们讨论更为复杂, 而且更符合现实情况的多核编程时将会碰到的问题. 这些问题更容易犯, 连j.u.c包作者Doug Lea大师的JDK代码里也存在这些问题.MESI协议及RFO请求从前一篇我们知道, 典型的CPU微架构有3级缓存, 每个核都有自己私有的L1, L2缓存. 那么多线程