欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

一次非常规 SQL 注入(informix-sql)的利用过程

来源:本站整理 作者:佚名 时间:2020-02-12 TAG: 我要投稿

一个客户正在寻找升级他们的思科 UCM 软件,并希望保证他们的实现是安全配置的。 在评估期间,我们在 Cisco UCM 管理员门户中发现了一个经过身份验证的 SQL 注入问题。 在大多数情况下,可以使用 SQLMap 或其他工具来自动发现问题。
由于我们是在客户端的开发环境中进行测试的,所以我们被允许对 Cisco UCM 执行更积极的攻击。 我最初使用的 SQLMap 命令如下:
root@kali~# sqlmap --level=5 --risk=3 -r request.txt
请求文件包含以下内容:
GET /ccmadmin/userGroupFindList.do?searchLimVal3=&searchLimVal4
=&whereClause=1*&searchLimVal1=&searchLimVal2=&searchLimVal7=&s
earchLimVal8=&searchLimVal5=&searchLimVal6=&rowsPerPageControl
=/ccmadmin/userGroupFindList.do?lookup=true&colCnt=4&searchLimV
al0=&lookup=true&rowsPerPage=50&searchLimVal9=&pageNumber=1&rec
Cnt=37&multiple=true HTTP/1.1
Host: Cookies: JSESSIONID=; com.cisco.ccm.admin.serv
lets.RequestToken.REQUEST_TOKEN_KEY=; JSESSIONIDSSO
=Accept: text/html
Connection: close
在让 SQLMap 完成它所做的事情之后,我们发现了一个数据库: Informix SQL。 此外,注入方法为布尔型盲注。 从那里,SQLMap 通常可用于枚举底层数据库,并可能获得对密码和敏感数据的访问权。 然而,在使用 SQLMap 执行这些任务之后,遇到了一些问题:
· SQLMap 能够枚举当前表的名称,但无法枚举其他数据库名称和其他表名称
· SQLMap 能够枚举当前的 SQL 用户名,但是也报告了基础数据库的超过1000个用户,并且不能枚举其他999个用户
· SQLMap 无法枚举“ applicationuser”表中与任何用户密码相关的任何信息
以下各章节将用来说明如何查明上述每个问题的根本原因以及如何克服这些问题。
Informix 速成课程
在继续之前,我们对于学习 Informix SQL 进行了一些研究。
以下是关于“systables”表的一个简单学习:
· Informix 在表“ systables”中保存所有表信息的记录
· “systables”中的不同列表示不同的信息,例如列“tabname”表示特定表的名称,列“tabid”表示特定表的 ID 号
· 其他信息包括“ncols”列(表中的列数)和列“nrows”是表中的行数
作为一个例子,让我们假设一个表被命名为“yaytableyay”。 要检索“tabid”号,可以使用以下查询:
SELECT tabid FROM systables WHERE tabname = ‘yaytableyay’
#Returned 54
进一步说,如果我们想查找“yaytableyay”表中的行数,我们可以进行以下查询:
SELECT nrows FROM systables WHERE tabid = 54
#Returned 15
以下是关于“syscolumns”表的一个简单学习:
· Informix 保存每个表中所有列信息的记录
· “sysolumns”中的不同列表示不同的信息,例如列“colname”表示特定列的名称,列“tabid”表示该列分配给哪个表
· 其他信息可以包括“colno”列,它是系统按顺序从左到右分配的值
举个例子,如果我们想找出表“yaytableyay”中第一列的名称,可以执行下面的查询语句:
SELECT colname FROM syscolumns WHERE tabid = 54 AND colno = 1
#returned "yaycolumnnameyay"
此外,每个表都有一个名为“rowid”的隐藏列。 此值分配给表中的每一行,但不会在删除行时删除。 例如,下面的查询不能返回任何数据,原因是我们查询的是之前删除的行:
SELECT * FROM yaytableyay WHERE rowid = 1337
#Returned 0 results
还有一种可能是,某一行数据甚至从未存在过。 这仍将迫使数据库返回相同的结果也就是“0” ,就像行被删除一样。 因此,当使用“rowid”作为“ WHERE”子句时,无法区分已删除的行和从未存在的行。
枚举其他表名
解决 SQLMap 问题(或者任何 web 应用程序测试工具)的最佳方法之一是通过代理工具来解决流量问题。 在这种情况下,通过 BurpSuite 代理 SQLMap 有助于我们解决问题,现在的问题是每当 SQLMap 被指示枚举其他表名和数据库名时,服务器总是会响应以下错误之一:
· ERROR: A subquery has returned not exactly one row. (错误: 子查询返回的行不完全是一行)
· ERROR: "NVL" cannot be used in a query( 错误: “ NVL”不能在查询中使用)
· ERROR: "RTRIM" cannot be used in a query (错误: “ RTRIM”不能在查询中使用)
· ERROR: "LIMIT" cannot be used in a query (错误: “ LIMIT”不能在查询中使用)
· ERROR: "LENGTH" cannot be used in a query (错误: 查询中不能使用“ LENGTH”)
第一个错误“不只一行”是 Google 搜索到的,可以链接到 Informix 的文档。 其他错误似乎是思科 UCM 本身内置的一般性限制。 考虑到这些错误消息,似乎需要一个自定义脚本或工具来进一步利用这个问题。
为了列举每个表,我建立了一个工作流程:
· 计算出数据库中存储了多少个有效表
· 按字母枚举每个表名的字母
· 枚举每个表中有多少行和列
为了确定有效表的数量,我们使用了“tabid”值。 具体来说,我们基于以下有效载荷执行了一些“大于”和“小于”操作:
1=1 AND (SELECT ascii(substring(tabname from 1 for 1)) FROM systables WHERE tabid > 1) > 1
如果每个表名的“tabid”值大于1,上述有效载荷将迫使服务器返回每个表名的首字母的 ASCII 值。 这当然会返回多个结果,因为肯定有不止一个表迫使服务器响应另一个“Result is more than 1 column”错误。 然而,这是意料之中的,因为某个东西返回的意思是某个东西存在。 为了进一步说明这一点,以下面的有效载荷为例:

[1] [2] [3] [4]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载