catalog_type.asp范例执行外部程序的漏洞发布时间:1999-07-29 更新时间:1999-07-29 严重程度:高 威胁程度:普通用户访问权限 错误类型:输入验证错误 利用方式:服务器模式 受影响系统 Windows NT 4.0(Option Pack)详细描述 这个漏洞其实应该算是一个非常大的系统漏洞,但是讲实话,知道这个漏洞的人其实蛮少的,原因是在这个漏洞公布出来的前几天,另一个更大的「MDAC/RDS」漏洞出现,「MDAC/RDS」很快就吸引住所有骇客及网管安全人员的目光,所以使得知道「catalog_type.asp范例执行外部程序漏洞」的人,可说是少之又少,我自己是真没在国内看到有别人提过这个漏洞的相关消息(抱歉,也许是我孤陋寡闻),不过……这个漏洞其实是后来发现「MDAC/RDS」漏洞的一个基础……. 漏洞发生的起源在于Microsoft Windows NT 4.0 Option Pack里面,安装过IIS 4.0的读者都知道,我们一般在NT 4.0将旧版IIS服务器升级到4.0版时,都是安装微软的Option Pack套件,而在安装Option Pack套件时,内定安装的功能里面,会安装一些ASP的范例程序,来提供网站开发人员一个学习ASP程序设计时的参考,如图1所示。 (图1) 在这些众多的ASP范例程序中,微软有示范一个使用「ODBC-Open Database Connectivity:开放式数据库连接界面」API开发的数据库范例,名字叫「AdvWorks」,内定它是安装在磁盘 「C:\Inetpub\ASPSamp\AdvWorks」 目录下,而在IIS服务器内是对应到「AdvWorks」这个「虚拟目录」,如图2所示。 (图2) 所以你要检测你服务器是否有安装这个ASP数据库范例最快的方法,就是键入如下网址: 「http://server/AdvWorks/」 如果有看到如图3的网页出现,就代表你服务器有安装它。 (图3) 这个范例最主要是示范如何用ASP程序,来建构一套产品目录的网页数据库查询系统,里面有非常多的程序设计技巧,提供你撰写ASP连结数据库的参考,当然,你可以看到我在图3下方标示的地方,它还有提供你浏览ASP原始码的功能,这又造成另一个系统漏洞存在(后面会再提到)。如果你仔细分析这个「AdvWorks」数据库系统,你会发现大部分的数据查询工作都是由这支「catalog_type.asp」程序来负责,如图4所示。 (图4) 「catalog_type.asp」程序内定安装的位置会在「C:\Inetpub\ASPSamp\AdvWorks\equipment」这个目录里面,因此你可以用如下的网址来存取到它: http://server/ASPSamp/AdvWorks/equipment/catalog_type.asp 或 http://server/AdvWorks/equipment/catalog_type.asp 我将这支程序部份的程序代码节录如图5,你可以看到它由使用者传来的「ProductType」查询字符串对应到SQL查询语法的关系,以图4下方的「catalog_type.asp?ProductType=crampon」字符串为例,它对应到SQL语法时,会变成如下指令: SELECT * FROM Products WHERE ProductType = ' crampon' (图5) 好了,接下来是我们这篇文章的重点。在这个漏洞公布的前后,有另一篇有关Windows NT数据库系统的安全研究报告出来,标题为「NT ODBC Remote Compromise」(http://www.wiretrip.net/rfp/p/doc.asp?id=3&iface=2),是由Matthew Astley 和「雨林小狗」(Rain Forest Puppy)一起撰写完成。这篇研究报告最主要是说到有关NT系统里面,微软「JET database engine」可以允许你插入「Visual Basic for Application」语法的问题,它里面指出你可以将「Visual Basic for Application」语法插入到一般的SQL数据库查询语法里面,包括这样的「|shell("指令")|」语法: Select * from Table where Filed=' |shell("指令")| ' 你学过「Visual Basic for Application」的话,就知道「|shell("指令")|」是用来执行外部程序档案的,这下可好,透过一般数据库的查询功能,竟然可以加入执行服务器程序的动作,这岂不是太危险了? 所以在这篇「NT ODBC Remote Compromise」的研究报告出炉后没多久,另一篇「MDAC/RDS」的安全漏洞就被发现,造成1999年到现在,许多服务器都因这个SQL查询语法+「|shell("指令")|」的问题而被入侵,真是祸害不轻。(有关「MDAC/RDS」的安全漏洞请参考本书另一篇「MDAC/RDS漏洞」里面的说明) 现在拉回到「catalog_type.asp」范例程序里面,究竟它跟「NT ODBC Remote Compromise」这篇研究报告提到的问题有何关连。请先看图6,你可以知道微软「AdvWorks」范例使用的数据库档案是扩展名「.mdb」的Microsoft Access数据库,这下好了,Microsoft Access数据库使用的引擎核心正好是微软「JET database engine」,那不就代表「AdvWorks」范例存有「NT ODBC Remote Compromise」文章中提到的SQL查询字符串+「|shell("指令")|」的问题,而在前头我又跟你讲了有关「catalog_type.asp」程序查询字符串与SQL语法的对应关系,所以…….你还不懂吗……..嘿!嘿!嘿!………….. (图6) 既然「catalog_type.asp」程序的查询字符串可以用「?ProductType=查询字符串」方式来传入,而它又会自己把查询字符串变成SQL语法的内容,所以我们用这样的查询字符串试试: 「|shell("cmd+/c+dir+c:\ > c:\hahaha.txt")|」 如图7,输入这样的网址: 「http://192.168.0.1/AdvWorks/equipment/catalog_type.asp?ProductType=|shell("cmd+/c+dir+c:\ > c:\hahaha.txt")|」 看看它是否真的会在IIS服务器上执行。 (图7) 这行「cmd+/c+dir+c:\ > c:\hahaha.txt」指令的意义就是将「C:\」根目录的档案信息写到「c:\hahaha.txt」档案内,所以如果真被IIS执行的话,你会看到如图8的画面,真的在服务器内多了一个「hahaha.txt」档案。 (图8) 我们打开「hahaha.txt」档案的内容看看,如图9,里面果然是执行「cmd+/c+dir+c:\」后所显示的档案信息,证明查询字符串「|shell("cmd+/c+dir+c:\ > c:\hahaha.txt")|」确实是被加入到SQL语法内而被执行。 (图9) 这下可好,透过「catalog_type.asp」范例可以让你任意执行外部的程序,你说这难道不严重吗?不是「catalog_type.asp范例执行外部程序的漏洞」吗? 入侵分析 骇客会如何利用「catalog_type.asp」范例程序的漏洞来换掉你网站网页呢?其实方法很简单,只要骇客自己将它做的网页内容覆盖掉原本网站的网页,就可以了。这方面置换网页的工作,一个最简单的方法是可以利用「cmd.exe」里面的「echo」指令,当你使用 「echo "字符串" > 1.txt」 指令时,它会把echo后面的「字符串」内容写入到1.txt这个档案内,如图10所示。 (图10) 所以骇客可能利用类似如下的查询字符串 「|shell("cmd+/c+echo+Hacked by catalog_type.asp! > c:\Inetpub\wwwroot\default.htm")|」 代表利用「echo」指令将「Hacked by catalog_type.asp!」内容写入到「C:\InetPub\wwwroot\default.htm」这个档案内(IIS服务器预设的首页档案),在浏览器键入如下网址: 「http://192.168.0.1/AdvWorks/equipment/catalog_type.asp?ProductType=|shell("cmd+/c+echo+Hacked by catalog_type.asp! > c:\Inetpub\wwwroot\default.htm")|」 如图11所示。 (图11) 如果档案写入成功,OK,到此骇客已经成功入侵你的IIS服务器,网站首页已经被骇客骇掉变成了:「Hacked by catalog_type.asp!」的字眼,如图12所示。 (图12) 上面就是我分析骇客可能利用「catalog_type.asp范例执行外部程序漏洞」的入侵过程,是不是很可怕,全部步骤透过IE浏览器就可以完成…….所以你能说设计ASP程序时可以不慎重?范例程序的漏洞都不严重吗? code.asp泄漏ASP原始码的漏洞 除了「catalog_type.asp」程序之外,我发现在「AdvWorks」数据库范例内还有一个范例程序有问题,它就是「code.asp」程序,也是前面图3我标示浏览ASP原始码漏洞时没有提到的地方。 如图13,这是「code.asp」程序的部份原始码内容,从程序一开头NOTICE的标示,这个浏览程序本来设计应该是只让使用者浏览「AdvWorks」或「ASPSamp」目录下范例档案的内容才对。 (图13) 可是让我们看一下它的目录检查程序代码是如何判断的,如下: If InStr(1, strPath, "/AdvWorks/", 1) Or InStr(1, strPath, "/ASPSamp/", 1) 它只判断目录开头的字符串是不是「/AdvWorks/」或「/ASPSamp/」,对于切换上层目录的「..」字符串,它却没有检查,所以你可以用类似「/AdvWorks/../../../winnt/win.ini」的方法,来浏览到其它目录下的档案内容,如图14,输入类似网址: 「http://192.168.0.1/AdvWorks/code.asp?source=/AdvWorks/../../../winnt/win.ini」 就可以看到不该看到的「win.ini」档案的内容。 (图14) 有关没有判断「..」字符串的问题,在微软许多的漏洞里面都发现类似的错误,这个「..」字符串真可说是安全问题上的一大麻烦。 测试代码 见描述 解决方案 如果你的服务器发现有此漏洞,你可以参照下面的说明将它防堵。 一、这个漏洞防堵的方法没有第二句话,将「AdvWorks」范例从你服务器内删除就对了(删除「\Inetpub\ASPSamp\AdvWorks」目录下整个内容)。其实除了「AdvWorks」之外,应该所有安装在服务器内的ASP范例你都应该删除,包括这些目录下的所有东西: \InetPub\ASPSamp \InetPub\iissamples \InetPub\scripts\Samples \InetPub\wwwroot\Samples 二、将所有ASP范例从IIS服务器内的「虚拟目录」移除。 以移除「AdvWorks」虚拟目录为例,启动Internet服务管理员,如图15,在「ADVWORKS」字符串上按下鼠标右键,然后选「删除」菜单,然后在询问窗口中按下「是(Y)」确定删除就可以了。 (图15) 三、这个漏洞其实跟另一个「MDAC/RDS」漏洞的基础原理是一样,因此强烈建议各位网管去参考本书另一节有关「MDAC/RDS」漏洞的说明。 不管你是执行那种方法防堵此漏洞,记住在你执行这些步骤之后,千万记得再次参照前面的说明,检测漏洞一次,务必确保此漏洞是真正彻底被防堵。 相关信息 NT ODBC Remote Compromise http://www.wiretrip.net/rfp/p/doc.asp?id=3&iface=2(撰写by鲍友仲) 摘自:http://vip.6to23.com/ggxia/jiao7/jiaoc832.htm |