当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2013-018277

漏洞标题:E创网络SQL注入导致近千zf站点可能沦陷

相关厂商:E创网络

漏洞作者: 在路上

提交时间:2013-02-02 16:26

修复时间:2013-03-19 16:27

公开时间:2013-03-19 16:27

漏洞类型:SQL注射漏洞

危害等级:低

自评Rank:3

漏洞状态:已交由第三方合作机构(cncert国家互联网应急中心)处理

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-02-02: 细节已通知厂商并且等待厂商处理中
2013-02-07: 厂商已经确认,细节仅向厂商公开
2013-02-17: 细节向核心白帽子及相关领域专家公开
2013-02-27: 细节向普通白帽子公开
2013-03-09: 细节向实习白帽子公开
2013-03-19: 细节向公众公开

简要描述:

感觉好迷茫,要学习的东西好多,又没有头绪,因此来乌云找组织,来学习,希望管理赏赐邀请码,感激不尽
小菜一个,没有什么好的文章,因此写如下丑文,望见谅...

详细说明:

正好最近对代码审计比较感兴趣,因此写个看代码找漏洞的过程.
代码审计我也是初学,还未入门,我只是希望找到如下漏洞:
1.命令执行 比如php的system等函数
2.代码执行 比如 eval这些函数
3.文件操作 目标是获得webshell
上传、文件修改、文件读(下载)、文件列举。跟文件有关的都应该看吧
4.权限判断 越权操作 往往是危害比较大
水平和垂直权限提升,cookie欺骗绕过验证。
5.sql注入 根据sql命令关键字 进行搜索
这样可以确定所有进入到sql中的变量(直接输入或者多阶注入)
6.xss 这种基本上不再考虑范围内了,我不会用...
7.逻辑漏洞 这种比较难于发现
8.其它问题
暴力破解
破坏性的攻击 导致当机 有些时候也是非常危险的
配置问题
错误信息未屏蔽
由于只能看懂点asp代码,因此找一个asp的一套程序:(E创网络出品的代码)
官网:http://www.echsys.com/
源码地址:http://www.echsys.com/EC0703.V6014.rar
学习几天,发现目前的源码审计都是搜索危险函数,好像还没有见过那种动态执行的源码审计工具,如果就是搜索函数
那就是在文件中搜索字符串了,这个我会notepad++这个工具不错呀,但是搞了一会发现,不如人意,notepad++
好像只能搜索一个字符串,不能批量搜索,这有点麻烦,而且有点盲目,坐在电脑前想了半天,觉得还是自己写个
搜索字符串的吧,可以根据指定的字符串(正则)列表,在一个文件夹里面搜索所有符合的。
因此首先要有个列表,但是怎么搞出来列表呢? 那要根据漏洞产生的原因来搞吧...
1.能够产生漏洞的就是用户输入吧(一切输入的都是有害的).
2.关键函数对应的关键操作(一切进入函数的输入都是有害的,多阶输入)
基于以上两点我想了半天整理出来一个列表:
request#input
server.createobject#object
multipart/form-data#file upload
execute#code execute
eval#code execute
select #sql
insert #sql
update #sql
delete #sql
暂时就想到这些,以后再补充吧,这里很好理解了,我使用#做分隔符,前面是要匹配的变量,后面是说明
有了列表就需要一个工具,根据列表去匹配了。好像有人写过,但是我感觉还是要自己写好点,以后该起来
容易。也锻炼一下写代码,为了以后找一个好点的工作...
使用c#简单写了一个粗糙的界面:
基本功能:
1.从文件中读取待匹配列表
2.可以选择一个文件夹,遍历所有文件,然后进行匹配,挑选出,所有满足的结果
3.可以指定匹配的文件后缀,比如asp cms我就不用去匹配php后缀了吧,而且很多图片文件也不需要匹配
4.可以只查找一个关键字,(有两种模式,一种是匹配,一种是不匹配)主要原因,当我们只要一个文件做权限
检查的时候,如果一个文件夹下有一个文件未包含该文件,那就是未授权访问了,这点其实是很好。至少我这么
想的。
基本上就想到这些,开始了...经过数天,修修改改,终于可以用了,离好看还有十万八千里...
测试一下,选择下载的源代码,和上面的字符串列表:

1.jpg


获得如下结果。然后我就开始看…。发现有问题,代码执行那个里面都是js的eval悲剧了(只能忽略)一个文件上传,但是没有服务器处理文件悲剧了。在看看输入input吧。

2.jpg


选择notepad++打开,(因为我没有写出来它的那个选择高亮功能哎)

3.jpg


发现里面包含好多的include,仔细一看是验证吧,判断用户是否登录。Chkuser.asp源码如下:

4.jpg


获得cookie中的用户名和密码:而且用户名使用checkstr进行了处理,将单引号进行了转义.虽然password没有被处理,但是并没有进入到查询语句,因此不能注入绕过了.
那就是说它这个权限判断还行,至少我还没有绕过呢,呵呵。
有权限绕过的都是后台功能,对于我来说,怎么从前台搞进后台才是关键,因此,首先应该看那些没有做权限检查的页面是否存在漏洞。即不包含include file="chkuser.asp"这个的代码。
一、cookie注入
因此重新配置:

5.jpg


查找所有.asp文件不包含checkuser.asp的文件。即查询所有前台页面。很快结果出来了:

6.jpg


开始查看,打开文件才发现好悲剧,原来我下载的是测试版,好多页面都没有内容哎,悲剧的要命,但是不能放弃,在搜索的列表中看一下

7.jpg


当访问到ChkManageLogin.asp时,使用notepad++打开,发现问题了
<!--#include file="conn.asp"-->
<!--#include file="char.inc"-->
<!--#include file="config.asp"-->
<!--#include file="md5.asp"-->
<%
'on error resume next
dim rs
UserName1=CheckStr(request.form("UserName")) //获得用户名
passwd1=md5(trim(request.form("passwd"))) //md5密码
verifycode=cstr(trim(request.form("verifycode"))) //验证码
dim ViewUrl1
ViewUrl1="admin_index.asp"
if cstr(session("verifycode"))<>verifycode then
Show_Err("验证码出错,可能是您在管理登录页面停留太久了,请返回后刷新页面。<br><br><a href='javascript:history.back()'>返回</a>")
response.end
else
set rs=server.createobject("adodb.recordset")
sql="select * from "& db_EC_Manage_Table &" where ("& db_ManageUser_Name &"='"&username1&"' and adder='"&Request.cookies(eChsys)("username")&"')" //很明显的一个cookie注入点
rs.open sql,Conn,1,3
if (passwd1<>rs(db_ManageUser_Password) or UserName1<>rs(db_ManageUser_Name)) then
Show_Err("用户名或密码出错,请返回检查<br><br><a href='javascript:history.back()'>返回重来</a>")
response.end
else
rs(db_ManageUser_LastLoginIP)=Request.ServerVariables("REMOTE_ADDR")
rs(db_ManageUser_LastLoginTime)=Now()
rs(db_ManageUser_LoginTimes)=rs(db_ManageUser_LoginTimes)+1
rs.update

从上面的代码很容易看出来,Request.cookies(eChsys)("username")未作任何过滤导致cookie注入,但是前面有一个验证码,要想注入需要通过验证码验证才可以。使用session保存验证码的,而且验证出错与否并没有更新验证码,就是说明只要我浏览网页抓到一次验证码,那么我下次继续访问只要带上cookieid就是可以保证session中的验证码是正确的,因此就可以验证通过。验证码问题解决了。
如果验证成功后直接跳转找admin_index.asp,但是改页面被加密了。真是不厚道,还得搞个解密工具,解密后如下:

8.jpg


不是吧这个更直接,cookie注入太明显了,而且都没有了验证码限制,如果sql执行失败,就会跳转到login.asp页面,如果执行成功就不跳转,根据这点就可以搞定了,可以确定sql执行是否成功。一个盲注点。由以上两个注入点中的任何一个就可以获得管理员的用户名和密码了。还有一个问题就是cookie前缀,发现访问login.asp就泄露了cookie前缀:
万事具备了,只欠东风。就是一个猜测用户和密码的工具了。都想想完全猜测真的好麻烦,继续看代码发现还有这样一个页面
E_alluser.asp,会把所有的注册会员显示出来,唉得来全部费工夫,知道了用户名,就只猜测对应的密码就可以了。由于表结构等都已知很容易写出来猜测密码的小程序如下所示:

9.jpg


二、cookie欺骗绕过身份验证
但是密码都是md5加密的,如果破解不出来密码那岂不是悲剧,因此看一下程序的验证方法。还是两级验证,两个验证文件。Chkuser.asp和ChkManage.asp两个代码基本类似,只是判断表名不同,一个是普通用户,一个是管理用户验证。
UserName=CheckStr(trim(Request.cookies(eChsys)("UserName")))
M_UserName=CheckStr(trim(Request.cookies(eChsys)("ManageUserName")))
M_PassWD=trim(Request.cookies(eChsys)("ManagePasswd"))
M_Key=trim(request.cookies(eChsys)("ManageKEY"))
set urs=server.createobject("adodb.recordset")
sql="select * from "& db_EC_Manage_Table &" where ("& db_ManageUser_Name &"='"& M_UserName &"' and adder='"& UserName &"')"
urs.open sql,Conn,1,3
if urs.bof or urs.eof then
if IsDebug="1" then
Show_Err("以cookies(username)及cookies(ManageUserName)的返回值,查找不到管理用户表中的相对应记录。<br><br><a href='javascript:history.back()'>返回</a>")
else
response.redirect "admin_index.asp?action=Manage.asp"
end if
response.end
else
if M_PassWD<>urs(db_ManageUser_Password) then
if IsDebug="1" then
Show_Err("cookies(ManagePasswd)的返回值与管理用户表中的相对应记录的Password值不符。<br><br><a href='javascript:history.back()'>返回</a>")
else
response.redirect "admin_index.asp?action=Manage.asp"
end if
response.end
else
可以看出,其实就是从cookie中获得值,用户名和密码,而且用户名进行了处理导致无法注入,根据用户名查询获得对应的密码,这个密码是md5加密的,跟提交的cookie中的密码进行比较如果相等,就通过了验证,这说明根本就不用破解md5,就可以了,太好了可以省一角钱。
三、文件操作获得shell
进了后台往往不是最终目的,一般都是为了去获得一个webshell。因此我们的目标就是查找有文件操作的地方。
其实分为几类:文件上传,文件修改,文件备份等。大家都懂这里就不多写了,很容易就可以搞到shell利用后台的db_compact.asp文件。(有点长了怕乌云放不下)
以上基本上都是理论,好像乌云需要有图,有例子才给通过,因此,弄个实例:
首先应该选个关键字,我发现这个系统好多就是使用E_开头的,因此我就以e_alluser.asp为例吧,去搜索引擎进行搜索,正好以前写过一个提权搜索结果的也排上用场了。
真是不搜不知道一搜吓一跳,

10.jpg


使用google去掉重复的 居然有730个,随便找一个小试牛刀

漏洞证明:

就这个吧: http://www.ldaic.gov.cn/e_alluser.asp
使用小工具直接获得用户名和密码:

11.jpg


同时组合成一个有效cookie:

12.jpg


进入后台获得一个shell

13.jpg


就到这里了好像有点长...

修复方案:

修复其实很容易了,这个主要问题是cookie注入,因此只要程序员在获得的cookie后调用安全函数就可以了。
打个广告:
1.希望大牛收徒的,找我
2.希望向我一样的菜鸟,一起学习的,找我
thx !

版权声明:转载请注明来源 在路上@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:17

确认时间:2013-02-07 04:50

厂商回复:

最新状态:

暂无


漏洞评价:

评论

  1. 2013-02-02 21:34 | cncert国家互联网应急中心(乌云厂商)

    周末初步看了一下,有望做个经典的漏洞挖掘案例,很久没有爆rank 20的了。

  2. 2013-03-11 14:27 | 暗夜清风 ( 实习白帽子 | Rank:44 漏洞数:10 | 大哥,你的娃娃掉了.举手之劳,不必以身相许)

    @在路上 求交往

  3. 2013-03-19 16:42 | 少校 ( 实习白帽子 | Rank:40 漏洞数:5 | 别开枪,自己人!)

    漏洞代码审核很牛逼

  4. 2013-03-19 16:47 | 小鸡鸡 ( 实习白帽子 | Rank:40 漏洞数:10 )

    求全套工具1321212165@qq.com

  5. 2013-03-19 18:01 | neal ( 普通白帽子 | Rank:219 漏洞数:23 )

    我居然看完了.

  6. 2013-03-19 21:47 | lucky ( 普通白帽子 | Rank:409 漏洞数:84 | 三人行必有我师焉########################...)

    很不错!学习一下!边学渗透,边锻炼一下自己的代码能力!

  7. 2013-03-20 08:25 | xsleaf ( 实习白帽子 | Rank:52 漏洞数:5 | 探索无尽的网海~)

    根本看不懂,一头雾水啊……我承认我是菜鸟****

  8. 2013-03-20 09:18 | 墨水心_Len ( 实习白帽子 | Rank:70 漏洞数:15 | PKAV技术宅 | 每一个有文化的东西,我们都...)

    很经典。

  9. 2013-09-18 00:07 | wefgod ( 普通白帽子 | Rank:1807 漏洞数:179 | 力不从心)

    确实不错。但是有的细节其实还是应该多提一下,比如你写工具的一些方法摘要。

  10. 2013-09-18 19:10 | 在路上 ( 普通白帽子 | Rank:193 漏洞数:13 | 在学习的路上、在成长的路上...)

    @wefgod 哦 如果在有机会 写的更详细些 呵呵

  11. 2013-09-23 16:46 | wefgod ( 普通白帽子 | Rank:1807 漏洞数:179 | 力不从心)

    @在路上 嗯嗯,多多分享啊!

  12. 2013-10-08 21:50 | 小土豆 ( 普通白帽子 | Rank:129 漏洞数:23 )

    牛掰。 学习了。

  13. 2013-10-10 10:11 | lxsec ( 实习白帽子 | Rank:97 漏洞数:16 | 专注XSS学习中......)

    @在路上 希望跟洞主多学习,能留个联系方式吗

  14. 2013-10-10 19:14 | 在路上 ( 普通白帽子 | Rank:193 漏洞数:13 | 在学习的路上、在成长的路上...)

    @lxsec 我也很菜 欢迎交流 互相学习 QQ群:253851171

  15. 2014-01-08 19:03 | j2ck3r ( 普通白帽子 | Rank:406 漏洞数:92 | 别关注我,跟你不熟。)

    @在路上 求工具

  16. 2014-06-20 16:40 | 凌枫 ( 路人 | Rank:4 漏洞数:2 | 菜鸟求罩 _(:з”∠)_)

    @在路上 求工具

  17. 2014-06-20 18:50 | 在路上 ( 普通白帽子 | Rank:193 漏洞数:13 | 在学习的路上、在成长的路上...)

    @凌枫 @j2ck3r 大神们 什么工具?直接sqlmap就可以了

  18. 2014-06-21 00:15 | j2ck3r ( 普通白帽子 | Rank:406 漏洞数:92 | 别关注我,跟你不熟。)

    @在路上 你那个更便捷,求共享

  19. 2014-06-21 14:00 | 凌枫 ( 路人 | Rank:4 漏洞数:2 | 菜鸟求罩 _(:з”∠)_)

    嗯啊,,,跪求啊。。。@在路上