宽字节注入原理

宽字节注入原理分析_1stPeak's Blog-CSDN博客_宽字节注入原理

原理: mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围)

php的魔术引号(magic_quotes_gpc)开启,会在特殊字符(比如 ' , " , \ , null)前面加 \ ,导致闭合失败。

\ 作用:mysql中\后面接的字符代表本身字符的意思,比如 \%

SELECT txt1 FROM T1 WHERE txt1 LIKE '_a\%' //本身%代表通配符,但是前面加了\,%代表要找的是a%这个字符串

补充:PHP5.4.0及其之后PHP版本取消了魔术引号,之后转义都需要加上addslashes函数 (stripslashes删除反斜杠\)

           魔术引号: 总结3:PHP中的魔术引号_hyh1123176978的博客-CSDN博客

实例:

sqli-32:   
http://127.0.0.1/sqli/Less-32/?id=-1%df' union select 1,database(),3 --+

(记住union前面语句要错的,虽然这里我不知道id=1%df'为什么不行,我觉得转义之后为1运,应该不会找到id=1了吧,如果有大佬解答的话就多谢啦)

防御:

宽字节注入原理分析_1stPeak's Blog-CSDN博客_宽字节注入原理

客户端-连接层-服务器各自字符集名称:

 转换场景:

(1)在PHP中使用mysql_query(“set names GBK”),3个字符集都为gbk,

%df%27=====(addslashes)======>%df%5c%27======(GBK)======>運’

(2)都为utf-8,但是url直接传入gbk编码

%e5%5c%27====(addslashes)====>e55c5c5c27====(iconv)====>e98ca65c5c27

防御方法:缺一不可 
(1)使用mysql_set_charset(GBK)指定字符集 
(2)使用mysql_real_escape_string进行转义 
原理:mysql_real_escape_string与addslashes的不同之处在于其会考虑mysql_set_charset(GBK)指定的字符集,不会出现前面df和5c拼接为一个宽字节的问题

感谢本文章的链接的作者,侵权私我必删


原文连接:https://blog.csdn.net/qq_45730325/article/details/123256725

相关推荐

全链路灰度在数据库上我们是怎么做的?

MySQL约束

MongoDB安装教程

FTP服务配置

【云原生】Docker部署数据库的持久化

MySQL - 函数及约束命令

【云原生】风云暗涌的时代,DBA们的利刃出鞘了

没错,列式存储非常牛。但是,Ta还可以更高效

SpringBoot数据库管理 - 用flyway对数据库管理和迁移

Redis如何实现持久化?详细讲解RDB的三种触发机制及其优缺点,带你快速掌握RDB

效率低?响应慢?报表工具痛点及其解决方案

使用systemd,把服务装进 Linux 心脏里~

C2B模式下优惠券架构演进

《MySQL高级篇》四、索引的存储结构

学习 MySQL 需要知道的 28 个小技巧

数据库持久化+JDBC数据库连接

shell脚本实现mysql数据库双机定时备份

详解缓存穿透、缓存雪崩、缓存击穿

图文详解Redis集群与扩展

【云原生】SQL(及存储过程)跑得太慢怎么办?