堆叠+无列名+时间盲注
延时盲注
延时函数:
sleep()
select sleep(); |
benchmark()
select benchmark(100000,sha1(sha1(sha1('tlfie')))); |
get_lock
在一个session中先锁定一个变量 然后通过另一个session,再次执行get_lock函数
select get_lock('tlife',1); |
但也不是每次都能用,需要提供长连接,在Apache+PHP搭建的环境中需要使用mysql_pconnect函数来连接数据库,所以只能根据环境去实际测试一下,我在本地也没测试成功
正则表达式延时
正则匹配在匹配较长字符串但自由度比较高的字符串时,会造成比较大的计算量,我们通过rpad或repeat构造长字符串,加以计算量大的pattern,通过控制字符串长度我们可以控制延时。
select rpad('a',4999999,'a') RLIKE concat(repeat('(a.*)+',30),'b'); |
文件操作
mysql变量
可以通过
show variables |
来查看系统变量以及其值
和文件有关的变量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 "<?php phpinfo();?>" into outfile "/tmp/1.php" |
outfile函数在将数据写到文件里时有特殊的格式转换,而dumpfile则保持原数据格式
堆叠注入
堆叠注入条件
$mysqli->multi_query($sql); |
当secure_file_priv为null时
如果堆叠注入,可以利用log日志文件写马
set global general_log=on; |
堆叠注入中select被过滤
handler
mysql除可使用select查询表中的数据,也可使用handler语句,这条语句使我们能够一行一行的浏览一个表中的数据,不过handler语句并不具备select语句的所有功能。它是mysql专用的语句,并没有包含到SQL标准中。
handler users open as hd; #指定数据表进行载入并将返回句柄重命名 |
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; |
例1:
以上 不设置变量直接使用,以下为设置了变量直接进行调用,
这是另一种使用方式,但是似乎无法使用字符串
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(); |
select table_name from mysql.innodb_table_stats where database_name='security' |
select group_concat(table_name) from sys.schema_table_statistics |
但是我们查询不了列名,这个时候就需要使用无列名盲注
#查询所有的库 |
无列名盲注
union重命名
select 1,2,3 union select * from users |
select group_concat(a.2) from (select 1,2,3 union select * from users); |
比较法
这就是盲注的思想了,前面的部分是你要注的内容,因为要判断不同,所以后面的都应该是最大的zzz 这样才能保证每一位的改变能影响后面的
这是对比第二位是的完整结果是admin
编写脚本的时候可能还需要做一个该字段是否结束的判断,也就是从一开始遍历到最后都没改变 说明结束了
堆叠+无列名+时间盲注