【渗透课程】第五篇-SQL注入的原理

哈哈哈,讲到注入了。我想给大家讲注入的原理。这个我们前面的前言篇就说过,所谓的SQL注入就是,绕过数据库验证机制直接执行SQL语句。怎么说呢,我们先讲一个概念吧!

网站和网页的区别

单纯的网页是静态的,html就是静态的,一些简单的网站(如某些引导页)只有网页和网页之间的跳转。而网站是动态的,是一个整体性的web应用程序,几乎所有的网站都要用到数据库。数据库我们怎么利用呢?例如某些博客站,cms站点。它的文章并不是存在网站目录里的,而是存在数据库里的,例如某些cms是通过后缀?id=321来调用数据库内的文章内容。此时便是向数据库传递变量为ID值为321请求,而数据库会响应并查询我们的请求。

总体来说原理就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

例子

比方说我们在某网站后台登录界面,有两条输入框,一条是帐号一条是密码。那么我们可以猜测数据库中有一个admin表,表里面有两个字段username和password 。这样我们输入用户(比如123)密码(比如456)并提交之后,数据库就会执行一段查询语句:

select id from users where username = '123 and password = '123'

并判断用户名123是错误的(为假)

之后返回帐号密码错误信息。

那么如果我们在用户名处输入'or 1=1-- 而密码随便输入个456呢? 我们来看看数据库中的查询语句:

select id from users where username = '' or 1=1--  and password = '456'

'又 这里呢1=1永远为真,后面 and password = '456'被注释掉了。数据库不需要考虑,这里我们就跳过了验证。

这就是几年前的万能密码,这里只是说说逻辑。我们再来看看下面另一个例子。

整型参数的判断

SQL注入一般存在于形如:

HTTP://www.xxx.xxx/text.asp?id=XX

这种带有参数的asp或者动态网页中,注入又分为整形注入和字符串注入。总之只要是带有参数的动态网页且此网页访问了数据库,那么就有可能存在SQL注入。下以HTTP://www.xxx.xxx/test.asp?p=xx为例进行分析,xx此处设为整型。

当输入的参数xx为整型时,通常test.asp中SQL语句原貌大致如下:

select * from 表名 where 字段=xx

所以可以用以下步骤测试SQL注入是否存在。

①HTTP://www.xxx.xxx/text.asp?p=xx’(附加一个单引号)此时abc.ASP中的SQL语句变成了

select * from 表名 where 字段=YY’

数据库无法处理,返回异常;

②HTTP://www.xxx.xxx/test.asp?p=xx and 1=1。1=1为真 test.asp运行正常,而且与没加语句之前的test.asp?p=xx运行结果一样正常显示;

③HTTP://www.xxx.xxx/test.asp?p=YY and 1=2,语句为假,因为1≠2  test.asp运行异常;如果以上三步全面满足,test.asp中一定存在SQL注入漏洞

小技巧:有时管理员会在后台设置过滤掉单引号等字符,以防止SQL注入。此时可以用以下几种试一试。

大小定混合法:VBS并不区分大小写,而网站程序可能区分。然后程序员在过滤时通常要么全部过滤大写字符串,要么全部过滤小写字符串,而大小写混合往往会被忽视。如用SelecT代替select,SELECT等;

UNICODE法:在IIS中,以UNICODE字符集实现国际化,我们完全可以IE中输入的字符串化成UNICODE字符串进行输入。如+ =%2B,空格=%20 等;URLEncode信息可以参加百度;

ASCII码法:可以把输入的部分或全部字符全部用ASCII码代替,如U=chr(85),a=chr(97)等,ASCII信息参见百度。

猜解内容

用过明小子、啊D的都知道,存在注入肯定要猜密码了哈哈哈,可是软件是怎样一个工作过程呢?

猜解表名: and exists (select * from 表名)

猜解列名: and exists (select 字段 from 表

爆指定表名内容: and 1=1 union select 1,2,3,4,5 from 表名

猜解列长度 猜解语句: and (select top 1 len(列名)from 表名)>N and (select top 1 len(列名)from 表名)=N 其中N是数字

变换这个N的值猜解列长度,

例如: and (select top 1 len(列名)from 表名)>1 and (select top 1 len(列名)from 表名)>6

如果一直猜到6都显示正常页面,猜到7的时候返回错误(大于6并且小于等于7),那么该列的长度为7。

阿西巴,我好困~~好了这次注入浅谈就说到这里~ 其实网上的注入工具还是挺多的, 如批量注入的明小子、啊D注入工具、椰树、御剑等等。现在不会语法也没太大关系,以后再补上也行啊。SQL 存在注入的站点小编在博客里也送过了,大家可以找几个练练手(不要干坏事)。

手机一个一个字打,贼几把累(其实抄了一部分)~要是你们还不懂,明天来问我吧

转载请注明出处:云态中国


原文地址:https://www.cnblogs.com/cnhacker/p/6984665.html