A13.WEB主机-SQL注入漏洞利用
WEB主机--SQL注入漏洞利用
ASPCMS是公开源代码的CMS,可以在网上下载其源代码。前面确定了版本在2.2.4—2.2.9之间,可以根据百度的版本信息和刚才搜集到的漏洞信息进一步验证,缩小版本范围。也可以将这个区间的版本都下载下来,结合源代码进行分析。在实际的安全测试中,这个验证的过程比较漫长,这里我们跳过了一些无效的验证步骤。
此处选择使用ASPCMS v2.2.9版本,通过代码审计,并结合互联网上已有的漏洞信息,进行安全测试。
构造SQL注入语句
根据搜索到的漏洞信息,CommentList.asp程序文件中存在SQL注入漏洞,访问此URL,发现是一个显示评论的页面。虽然有了现成的利用代码,但我们需要进一步理解其能够实现的原因。
打开Plug/Comment/CommentList.asp文件,看到原查询语句为:

其中SwitchCommentsStatus是指评论审核开关,为1的时候代表打开评论审核。{prefix}是表的前缀。
下面,我们在access数据库里,在原有SQL语句的基础上,利用联合查询,构造出能同时查询出管理员密码的SQL语句。
ASPCMS使用的是Access数据库,Access是由微软发布的,包含在专业版和更高版本的Office套件中。Access 的定位是桌面数据库,因为它只能在一台计算机上运行,不像SQL Server、MySQL等网络版数据库,可以有多个客户端通过网络同时访问执行。
将ASPCMS程序源代码data目录下的#data.asp改为#data.mdb,使用Access软件打开,根据文件名推测admin_user表里可能存放用户名和密码,打开查看确实如此。于是在Access里“创建”—“查询设计”,出现“显示表”界面后,不添加表,直接关闭。然后在“查询”界面的标题栏上右键选择“SQL视图”,然后就可以直接输入SQL语句了。

接下来构造SQL注入语句。在commentList.asp文件原有查询评论的SQL语句后面,加上SQL联合查询语句,从admin_user表里查出用户名和密码,代码如下:
select * from aspcms_comments where ContentID=0 union select loginname, password,3,4,5,6,7 from aspcms_user

运行SQL语句,即可获取到admin_user表的用户名和密码。可见,漏洞利用代码本质上就是利用了SQL注入漏洞,将联合查询语句通过id参数注入到了原始的SQL语句当中,从而查询出了管理员密码。
接下来需要将刚才构造好的SQL代码,拼接到URL中去执行。因为在commentlist.asp程序文件中已经写好了前半部分语句,因此在URL利用时只需要拼接上后半部分程序里没有的代码即可,在程序中的利用代码如下:
http://192.168.10.130/plug/comment/commentlist.asp?id=0 union select top 1 userid,groupid,loginname,password,now(),null,1 from aspcms_user
然后使用此URL访问网站时,却得到了如下的报错信息,测试失败。

绕过ASPCMS的SQL注入防御规则
此时一边参考网上的漏洞信息,一边进行代码审计,将这两种方式结合起来,来分析测试失败的原因。根据上面获得的漏洞信息,再次打开Plug/Comment/Commentlist.Asp文件,在10-11行可以看到Aspcms对客户端提交的数据使用Filterpara函数进行过滤,难怪刚才的SQL注入代码会失败。

下面需要查找Filterpara函数的具体代码,ASP程序使用Function定义函数。使用具备文件内容搜索功能的软件,一般的增强型记事本、或开发软件都具有在指定目录下搜索文字的功能。以Notepad3为例,点击菜单“查找—在文件中查找”,搜索字符“Function filterPara”,根据结果,找到定义此函数的文件是Inc/Aspcms_Commonfun.Asp。

打开aspcms_commonfun.asp文件,使用“查找”功能,在aspcms_commonfun.asp文件的901-904行,找到filterpara函数。
'过滤参数
Function Filterpara(Byval Para)
Filterpara=Preventsqlin(Checkxss(Para))
End Function
可以看到这个函数接着调用了Preventsqlin和Checkxss两个函数进行字符过滤,从函数名称可以猜测出Preventsqlin用来过滤SQL注入语句,Checkxss是用来过滤XSS的。
接下来使用“查找”功能,在906-924行找到Preventsqlin函数。

在908行,定义了一些在SQL注入中使用的字符(符号“|”是为了便于分割),对这些字符进行过滤。
第910行,将定义的SQL过滤字符,使用符号“|”分割后,赋值给了一个数组sqlArray。
第913-919行,对一些特殊字符,进行了HTML转义替换。
第920行,对内容进行字符替换,将内容中包含的SQL注入字符替换为空。这样初看起来似乎是安全的,但仔细分析一下,如果用户将SQL注入字符拆分开,中间插入一个其它被过滤的字符,被替换后就可以实现绕过。以select为例,用户将select拆分成两部分,中间插入另一个被过滤的关键字set,形成字符串“selsetect”,根据以上规则,selandect里的set会被替换成空,替换后正好就剩下了select,就实现了绕过。
正常情况下的利用代码:
/commentlist.asp?id=0 union select top 1 userid,groupid,loginname,password,now(),null,1 from aspcms_user
网上流传的一种绕过替换规则的利用代码:
commentList.asp?id=0%20unmasterion%20semasterlect%20top%201%20UserID,GroupID,LoginName,Password,now%28%29,null,1%20%20frmasterom%20{prefix}user"
可以看到,网上的利用代码是将3个SQL关键词都加入了“master”,做了绕过处理,然而我们仔细审查源代码里的过滤字符,会发现关键词select会被替换,而union和from关键词并没有在替换列表里,因此可以只对select做防过滤处理,加入一个短的关键词“set”,利用代码可简化如下:
http://192.168.10.130/plug/comment/commentlist.asp?id=0 union selsetect top 1 userid,groupid,loginname,password,now(),null,1 from aspcms_user
观察网上漏洞利用资料里的SQL注入利用代码,表名使用的是{prefix}user,而非aspcms_user。ASPCMS默认的表前缀是Aspcms,但如果管理员改了,那么用默认的前缀aspcms_user就访问不到了。对于{prefix}user,ASPCMS在程序代码里会把{prefix}解析为相应的前缀,这样即使管理员改了默认的表前缀,使用{prefix}user也能够访问到。
在浏览器里访问以上URL,这次成功的获取到了管理员用户的密码(加密后)。

查到的管理员密码是MD5加密的,通过密码在线查询,获得明文密码,即可登录后台。


浙公网安备 33010602011771号