庞大资源库的计算机教程网站!
设为首页
加入收藏
总编信箱
投稿或申请专栏请先 [登 陆]
首页 操作系统 程序设计 图形图像 媒体动画 机械电子 WEB开发 数 据 库 办公系列 路由技术 网络原理 网络应用
认证考试 安全技术
首页>安全技术>黑客攻防>黑客教程>正文
资料搜索
Google搜索
Google
返回上级列表

推荐文章

快速保存网页中所有图片的方法
Windows中让光驱巧妙“隐身”技
防范非法用户入侵Win 2000/XP系
两款比较典型的ASP木马防范方法
有关表格边框的css语法整理
Windows XP中可以被禁用的服务
SQL Server导出导入数据方法
Javascript所有对象的属性的获
网页(HTML)中的特殊字符
与篮球共舞,尽显模式本色
QQ病毒的手工清除方法
Photoshop为极品美女打造性感睫
天衣无缝:IIS与PHP水火也相容
SQL Server存储过程编写和优化

SQL Injection中文猜测的两种方法

 作者:本站收集   日期:2005-5-17
字号选择〖 〗/ 双击滚屏 单击停止   
一、MS-SQL中的汉字猜测
可以说MS-SQL下的汉字是不用猜测的,你只要构造的条件足够的好,可以直接让对方在报错的时候将数据内容直接显示出来。通常的做法是把你要猜的内容所在的列做上一个其它类型的运算,这样由于执行中进行了错误的类型转换,会使得查询失败并且返回错误信息,而要猜的内容正好在信息中,例如:

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

name列是n<I>var</I>char,要让他做加法运算,铁定是出错:

Syntax error converting the n<I>var</I>char 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,而且确定为汉字,开始猜测:

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

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

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

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

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

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

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

同样的,我们又猜了一个超级管理员的用户名/密码,登陆后上传shell,然后拿到了管理权限。没有恶意,只是证明无论是汉字的用户名还是密码,不会给你带来更好的安全性。
上一篇:最全的后门制作及安装技术 一    下一篇:动网论坛7.0获得WebShell的分析  
[发送给好友]  [关闭窗口]  [返回顶部]   转载请注明来源:www.it00.com   
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 原点 投稿作者: 本站收集
信息来源: 网络 录入时间: 2005-5-17
关于我们 - 广告服务 - 版权申明 - 网站地图 - 联系方式 - 总编信箱 - 会员投稿