Oracle Advanced Support系统SQL注入漏洞挖掘经验分享

Oracle Advanced Support系统SQL注入漏洞分析

一年多前我在客户的一个外部环境中执行渗透测试,任何外部环境渗透测试的重要步骤之一就是挖掘出可访问的WEB服务。nmap和EveWitness的结合会令这步骤变得更快,因为我们可以进行端口扫描 并且把这些结果以屏幕截图的形式导入到 EyeWitness中。当梳理完 EyeWitness提供的屏幕截图页面后,我发现了一个Oracle 高级支持服务。

虽然我之前从没听过Oracle Advanced Support,但是当我很快的google完之后,我了解到它似乎是一个允许oracle的技术支持在外部登入,并且在oracle系统环境下进行任何技术支持需要的操作的服务。有了这个信息之后, 我们可以将现有的web应用测试与它结合起来。

我们可以对这个应用开始进行一些简单的侦查,包括:

  • 寻找已经被爆出的漏洞
  • 用burp爬取应用
  • 枚举常见的路径
  • 查看可获取的页面的源码

幸运的是,我在主页的源码中发现了 一个包含资产目录清单的链接。

对于像这样一个未知的应用,目录列表是很有用的,它给我们了一些希望去发现一些很有趣 但不应该被访问到的东西 。果不其然的在搜寻每个目录之后,我偶然发现了以下的javascript文件:

让它变得更适合阅读一些

在Web渗透测试中,其中一个我喜欢的并且常常忽视的事情是查找应用中的javascript文件, 并且看看他们是否支持任何POST 或者是GET请求。

我们已经发现了一个叫做sql-service.js的javascript文件,这让我立刻在脑海中提高起警觉来。这个文件包含4个匿名函数其中三个t.getJSON方法的GET请求和一个t.post方法的POST请求。这些函数包含如下一些变量:

在这篇文章的剩余部分,我将提及匿名函数中的变量。

每个函数的根节点都位于/rest/data路径下。

接下来是将他们拆分之后的请求:

有了这些之后,开始拿出我最喜欢的代理工具:burp,看看会发生什么!

直捣黄龙

我首先尝试的是来自于getSqlData函数路径是/rest/data/sql的GET请求。我们也通过观察javascript发现这个请求需要附加一个参数,让我们在结尾加上”test”.

当我们把”test”加到请求url的末尾,服务器返回了404。同时服务器也返回了这样一个信息:Named SQL not found。如果我们尝试”test”之外的其他字符串,得到了同样的返回信息。我们把这个请求发到Burp 的 intruder模块,打算试图过一个目录列表字典来枚举潜在的参数名,看看是否能得到除了404之外的返回。但是有一个更简单的方法来找到合适的参数名。如果我们再次查看javascript,你会发现函数的名称给我们一些有价值的信息。我们在以下函数中发现了两个GET请求:getNamedSqlList 和 getSqlNameList.。我们刚才的请求返回的错误信息是 Named SQL not found error。让我们尝试针对getNamedSqlList函数的GET请求。

这的确给了我们不少的信息,让我们仔细分析一下,我们获得了一组json对象,看一下数组中的第一个对象:

我们发现了以下的属性:name, sql, dataSourceJNDI, privileges, and paramList,其中 sql属性是我最感兴趣的因为它包含了具有字符串值的SQL语句。我们把name的值放进先前尝试的GET请求中。

Hey!我们得到一些返回!但是我们少了一个参数,让我们加进来!

虽然没有从服务器获得任何返回,但是也没有返回任何错误!难道是例子中的SQL语句被执行了,只是没有回显?我们可以继续尝试其他的从先前请求中获得的names,但是我们看一下原始的javascript。我们发现有一个叫做createNamedSQL的函数,它是一个POST的请求。我们知道来至于getNamedSqlList 的请求的返回值包含了sql语句的值。也许是这个post请求会允许我们在服务器上 执行sql查询。我们试一下!

SQL Execution

这就是createNamedSQL中在包体里面包含一个空json对象的POST请求:

我们得到一个关于SQL_NAME列的错误,当我们在包体中包含空的json对象时这不是很意外。现在我们在包体里加入一个随机的属性名和数值。

再一次不意外的获得了一个关于未知“test”字段的bad request,但是如果你注意的话,这个错误的信息给我们返回了一些有用的属性。感谢 Oracle先生的服务!这些属性也同样出现了从getNamedSqlList发出请求获得的返回中。我使用getNamedSqlList请求的返回中其中的一个值赋给dataSourceJNDI属性。

这看起来是一个很好的测试请求,我们来见证一下 他是否有效。

我们仍然从服务器获得了一个错误返回,但是只返回了content-type。SQL语句可能已经被创建了。通过把名称字段设为“test”, 让我们尝试第一个具有参数的GET请求。

看这里!我们获得了一些SQL执行。

看一下“我们”是谁。

看起来我们是SYSMAN 用户。通过这个oracal 文档(https://docs.oracle.com/cd/B16351_01/doc/server.102/b14196/users_secure001.htm) 知道,我们就是administrator.

试一下 我们能否抓取出用户的哈希.

我们可以获得数据库中的用户密码的哈希值。我编辑和删除了主要的部分。知道了我们是一个具有administrator权限的用户,当然后续我们还可以做很多事情。然而,针对此博客的目的,我停止下来了。

结论

关于这个匿名sql执行我联系了oracle,他们很快的回复并且修复了这个问题。对我而言真正的问题是为什么web服务压根儿就允许sql语句被执行呢?

这个博客最大的收获是一定要看应用中的javascript文件。在多个web应用和外网的渗透测试中,我已经发现了隐藏在javascript文件中sql 注入,命令执行,和 xml实体注入攻击。

作为针对熟练渗透测试者的练习任务,看完这篇博客并且统计多少个你能确定的漏洞。提示:超过三处。

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2017-10-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏贾老师の博客

【译】进程的内存剖析

1665
来自专栏Golang语言社区

社区leaf学习笔记|04. MongoDB测试

大家好,本篇文章给大家带来的是leaf原作者仅支持的mongoDB的相关测试;测试之前我们简单了解下MongoDB

1633
来自专栏黑白安全

DLL注入新姿势:反射式DLL注入研究

在分析koadic渗透利器时,发现它有一个注入模块,其DLL注入实现方式和一般的注入方式不一样。搜索了一下发现是由HarmanySecurity的Stephen...

3163
来自专栏技术总结

iOS进阶之消息转发机制

2896
来自专栏Seebug漏洞平台

CVE-2017-5123 漏洞利用全攻略

原文:https://salls.github.io/Linux-Kernel-CVE-2017-5123/ 译者:hello1900@知道创宇404实验室...

3627
来自专栏何俊林

一种在Java层实现的守护进程方式

守护进程是一个黑色地带的产物,无论是通过native的方式在linux中fork进程达到,还是在java层通过两个service守护的方式,都是不太友好的做法,...

2466
来自专栏Golang语言社区

从websocket看go的应用

Go是互联网时代的通用编程语言。这样它就和命令行时代的C语言、图示界面时代的C++、以及互联网早期的Java语言等有不同的侧重。它强调保持自身的精巧和独立,从而...

3747
来自专栏大内老A

ASP.NET的路由系统:路由映射

总的来说,我们可以通过RouteTable的静态属性Routes得到一个基于应用的全局路由表,通过上面的介绍我们知道这是一个类型的RouteCollection...

2219
来自专栏技术墨客

Nodejs学习笔记(1)——安装nodejs

    关于大名鼎鼎的Nodejs是什么就不用再介绍了,他的牛逼之处数都数不完——让javascript称霸全宇宙、将一个只用于前端的编程语言同时可以制霸前后端...

902
来自专栏Golang语言社区

从websocket看go的应用

Go是互联网时代的通用编程语言。这样它就和命令行时代的C语言、图示界面时代的C++、以及互联网早期的Java语言等有不同的侧重。它强调保持自身的精巧和独立,从而...

3086

扫码关注云+社区

领取腾讯云代金券