SQL注入防御绕过

一、宽字节注入
1、什么是宽字节
GB2312、GBK、GB18030、BIG5等这些都是常说的宽字节,实际为两字节

2、宽字节注入原理
防御:将 ‘ 转换为 \‘
绕过:将 \ 消灭

mysql在使用GBK编码的时候,会认为两个字符为一个汉字
\ 编码为 %5c
‘ 编码为%27
%df%5c mysql会认为是一个汉字
构造:
%df‘ %df\‘ %df%5c%27 其中%df%5c将成为一个汉字专为 汉字‘ 从而绕过了/的转义
注:前一个ascii码大于128才能到汉字的范围

注入方法:在注入点后键入%df,然后按照正常的注入流程开始注入

工具注入方法:
在注入点后面手动添加%df即可 (没成功。。。)

白盒测试:
1、查看mysql编码是否为GBK
2、是否使用preg_replace把单引号替换成 \‘
3、是否使用addslashes进行转义
4、是否使用mysql_real_escape_string进行转义

宽字节防御
1、使用UTF-8,避免宽字节
不仅GBK、韩文、日文等等都是宽字节,都有可能存在诸如漏洞
2、mysql_real_escape_string, mysql_set_charset(‘gbk‘,$conn);
3、可以设置参数, character_set_client=binary

二、二次编码注入
在url中可能出现一些特殊字符,如= & ; +
为了避免冲突,需要转移
index.php?id=1&name=admin&pwd=123
mysql会对url提交的编码进行自动转换
例如:url中的%3d,mysql会自动转为=

宽字节和二次编码注入:
是在面对php代码或配置,对输入的‘(单引号)进行转义的时候,在处理用户输入数据时存在问题,可以绕过转义

二次编码注入是由于两次编码转义冲突导致出现的注入点
注入方法:在注入点后键入%2527,然后按照正常的注入流程开始注入

白盒测试
1、是否使用urldecode函数
2、urldecode函数是否在转义方法之后

三、二次注入
第一步, 插入恶意数据
保留了原来的数据,插入到数据库
第二步,引用恶意数据
在将数据存入到了数据库中之后,开发者未经验证,直接引用
例如修改密码
输入admin‘#
在修改密码过程中,将会修改admin的密码

select concat_ws(0x7e,username,password) from security

四、Waf绕过原理分析
sql注入是***测试与waf防御最激烈的战场
1、白盒绕过
1)大小写变形
2)等价替换:and -> &&, or -> ||
3)。。。

2、黑盒绕过
一、架构层绕过
1) 寻找源站
2)利用同网段
3)利用边界漏洞

        二、资源限制角度绕过
        1、POST大BODY

        三、协议层面绕过WAF的检测
        1、协议未覆盖绕过WAF
                *请求方式变换 get  ->  post
                *content-type变换 

                2、参数污染
                index.php?id=1&id=2

                id=1
                id=2
                waf可能只检测id=1
        四、规则层面的绕过
                1、sql注释符绕过
                 level-1   union/**/select
                 level-2   union/*ajlsjdlf*/select

                 2 空白符绕过
                 mysql空白符:%09,%0A。。。
                 正则空白符:  %09,%0A
                 example-1:union%250Cselect

                 3函数分分割符号
                 在函数和数据中间引入一些内容
                 concat%2520(
                 concat/**/(
                 concat%250c(

                 4 浮点数词法解析
                 select * from users where id=8E0union select 1,2,3,4

                 5 利用error-based进行sql注入:error-based sql注入函数非常容易被忽略
                    extractvalue(1, concat(0x5c,md5(3)));
                        updatexml(1,concat(0x5d,md5(3)),1);

                6 mysql特殊语法
                        select{x table_name}from{x information_schema.tables};

     五、Fuzz绕过waf
             1、注释符绕过
                         *先测试最基本的: union/**/select
                         *再测试中间引入特殊字:union/*aaaa%01bbs*/select
                         *最后测试注释长度:union/*aaaaaaaaaaaaaaaa*/select
                         最基本的模式
                     union/*something*/select
                         将空格替换为/*sldfj$%^&*/
                         特殊函数 xx() 替换为 xx/*sldfj$%^&*/()

                六、SQLmap waf绕过脚本编写

原文地址:http://blog.51cto.com/2042617/2340487

时间: 2024-10-11 00:37:44

SQL注入防御绕过的相关文章

SQL注入防御绕过——二次编码之干掉反斜杠

SQL注入防御绕过--二次编码 01 背景知识 一.为什么要进行URL编码 通常如果一样东西需要编码,说明这样东西并不适合传输.对于URL来说,编码主要是为了避免引发歧义与混乱.例如,URL参数字符串中使用key=value键值对这样的形式来传参,键值对之间以&符号分隔,如/?name=abc&pwd=123如果你的value字符串中包含了=或者&,那么势必会造成接收Url的服务器解析错误,因此必须将引起歧义的&和= 符号进行转义,也就是对其进行编码.对于URL编码的深入研

Bypass ngx_lua_waf SQL注入防御(多姿势)

0x00 前言 ? ngx_lua_waf是一款基于ngx_lua的web应用防火墙,使用简单,高性能.轻量级.默认防御规则在wafconf目录中,摘录几条核心的SQL注入防御规则: select.+(from|limit) (?:(union(.*?)select)) (?:from\W+information_schema\W) 这边主要分享三种另类思路,Bypass ngx_lua_waf SQL注入防御. 0x01 环境搭建 github源码:https://github.com/lov

23. Bypass ngx_lua_waf SQL注入防御(多姿势)

0x00 前言 ngx_lua_waf是一款基于ngx_lua的web应用防火墙,使用简单,高性能.轻量级.默认防御规则在wafconf目录中,摘录几条核心的SQL注入防御规则: select.+(from|limit) (?:(union(.*?)select)) (?:from\W+information_schema\W) 这边主要分享三种另类思路,Bypass ngx_lua_waf SQL注入防御. 0x01 环境搭建 github源码:https://github.com/loves

看好你的门-保护数据存储区(1)-SQL注入防御

首先需要声明,本文纯属一个毫无远见和真才实学的小小开发人员的愚昧见解,仅供用于web系统安全方面的参考. 1.常用的SQL注入防御的方法 一个能连接数据库的应用. 1.对用户端输入的数据进行严格防范: 2.使用PreparedStatement执行Sql语句: 3.不仅仅要在页面层面进行验证,在服务端层面还要同步进行这些验证: 2.使用正则表达式屏蔽特殊字符 使用SQL注入攻击多在特殊字符上下手脚,如"'","*","/" ,"–&qu

SQL注入之绕过WAF和Filter

知己知彼,百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 本文小结 0x6 参考资料 0x0 前言 网上关于绕过WAF有诸多文章,但是观察之后会发现大体上绕过WAF的方法就那八.九种,而且这些技术出来也有些日子了,继续使用这些方法是否有效有待于我们在实际中去验证.看过数篇绕过WAF的文章后,前人对技术的总结已经比较全面,但是完整的内容可能分布在各处,查阅起

SQL 注入防御方法总结

SQL 注入是一类危害极大的攻击形式.虽然危害很大,但是防御却远远没有XSS那么困难. SQL 注入可以参见:https://en.wikipedia.org/wiki/SQL_injection SQL 注入漏洞存在的原因,就是拼接 SQL 参数.也就是将用于输入的查询参数,直接拼接在 SQL 语句中,导致了SQL 注入漏洞. 1. 演示下经典的SQL注入 我们看到:select id,no from user where id=2; 如果该语句是通过sql字符串拼接得到的,比如: Strin

登陆页面Sql注入(绕过)

如图,看到这道题的时候发觉之前做过一个类似的手工注入: 不过这次手注会失败,后台过滤了sql语句里的一些东西,但我们并不知道过滤了什么 到这里我就基本上没辙了,不过查询了资料以后发现sqlmap可以对登录页面进行注入(一直以为sqlmap只能对url里的对象进行注入) 参考资料:https://x.hacking8.com/post-307.html “sqlmap的爬虫会爬取自定义的深度以及寻找form表单并自动填充缺失的数据加入扫描”,换句话说sqlmap可以对登陆页面进行注入,并且它会自动

通用的关于sql注入的绕过技巧(利用mysql的特性)

1 直接上语法   2 select * from users where id=8E0union select 1,2,3,4,5,6,7,8,9,0  3 select * from users where id=8.0union select 1,2,3,4,5,6,7,8,9,0  4 select * from users where id=\Nunion select 1,2,3,4,5,6,7,8,9,0  5 因为一般waf在防御的时候会识别union等关键词的单词边界,但是这个

sql注入防御

1 特殊字符转义 通过jakarta commons lang 通用类包中(spring/lib/jakarta-commons/commons-lang.jar)的 StringEscapeUtils完成转义: import org.apache.commons.lang.StringEscapeUtils; public class SqlEscapeExample { public static void main(String[] args) { String userName = "1