0x01 背景

PHP程序员在开发过程中难免会使用一些字符替换函数(str_replace)、反转义函数(stripslashes),但这些函数使用位置不当就会绕过全局的防护造成SQL注入漏洞。

0x03 漏洞分析

str_replace函数的错误使用

第一种情况是写程序时会使用str_replace函数将参数中的单引号、括号等字符替换为空,这样在一些双条件查询的情况就会引发注入问题。缺陷代码如下:

<?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("数据库连接失败");
$tmp_id = isset($_GET['id']) ? $_GET['id'] : 1;
$title = isset($_GET['title']) ? $_GET['title'] : 'news title';
//程序编写时直接用str_replace去掉id里的单引号
$id = str_replace("'",'',$tmp_id);
//sql查询语句通过id和titile两个条件进行查询
$sql = "SELECT * FROM news WHERE id='{$id}' and title='{$title}'";
echo $sql;
$result = mysql_query($sql, $conn) or die(mysql_error());
?>

浏览器输入”http://localhost/sqltest/streplace.php?id=1'&title=news title”,发现报错了,我们直接打印出执行的sql语句如下图:

发现参数id右边的单引号被反斜杠转义成字符了,说明又可以注入了。
简单分析下上面id参数的执行过程,-1’经过addslashes函数转义后变成了-1\’,然后再经过str_replace函数干掉了单引号变成了-1\,最后带入查询的语句才是下面这样:

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

反斜杠转义了sql查询语句里id后面那个单引号,导致title参数可以构造sql注入语句了,我们直接构造获取管理员账户密码的语句”http://localhost/sqltest/streplace.php?id=-1'&title=unionselect 1,2,concat(name,0x23,pass) from admin%23”

第二种情况是str_replace函数是用户可控的,就是说用户想把啥替换成空就可以将什么替换为空。
首先我们先看看addslashes函数对%00-%ff的转义情况,经过fuzz发现%00会被转义为\0,如下:

那么注入的时候我们提交%00’,经过addlashes就会变为\0\’,这时候我们用replace函数替换0为空就变成了\‘,成功转义了转义字符让单引号逃逸出来,从而造成注入漏洞。

stripslashes函数的错误使用

这个函数的定义是删除由 addslashes() 函数添加的反斜杠,所以很明显使用不当的话就会引发SQL注入。缺陷代码如下:

<?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("数据库连接失败");
$tmp_id = isset($_GET['id']) ? $_GET['id'] : 1;
$id = stripslashes($tmp_id);
$sql = "SELECT * FROM news WHERE id='{$id}'";
echo $sql.'<br />';
$result = mysql_query($sql, $conn) or die(mysql_error());
?>

浏览器输入”http://localhost/sqltest/stripslashes.php?id=-1'",发现报错了,echo出执行的sql语句如下图:

分析下参数id的执行过程,-1’经过addslashes函数转义后变成了-1\’,然后再经过stripslashes函数干掉了反斜杠变成了-1’,所以又可以愉快的注入了。
获取管理员账户密码的语句”http://localhost/sqltest/stripslashes.php?id=-1‘ union select 1,2,concat(name,0x23,pass) from admin%23”

原文链接:http://www.cnbraid.com/2016/04/29/sql5/,如需转载请联系作者。

【PHP代码审计】 那些年我们一起挖掘SQL注入 - 6.全局防护Bypass之一些函数的错误使用的更多相关文章

  1. 【PHP代码审计】 那些年我们一起挖掘SQL注入 - 3.全局防护Bypass之Base64Decode

    0x01 背景 现在的WEB程序基本都有对SQL注入的全局过滤,像PHP开启了GPC或者在全局文件common.php上使用addslashes()函数对接收的参数进行过滤,尤其是单引号.同上一篇,我 ...

  2. 【PHP代码审计】 那些年我们一起挖掘SQL注入 - 2.全局防护Bypass之UrlDecode

    0x01 背景 现在的WEB程序基本都有对SQL注入的全局过滤,像PHP开启了GPC或者在全局文件common.php上使用addslashes()函数对接收的参数进行过滤,尤其是单引号.遇到这种情况 ...

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

    0x01 背景 现在的WEB程序基本都有对SQL注入的全局过滤,像PHP开启了GPC或者在全局文件common.php上使用addslashes()函数对接收的参数进行过滤,尤其是单引号.二次注入也是 ...

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

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

  5. 【PHP代码审计】 那些年我们一起挖掘SQL注入 - 8.全局防护盲点的总结下篇

    0x01 背景 现在的WEB应用对SQL注入的防护基本都是判断GPC是否开启,然后使用addlashes函数对单引号等特殊字符进行转义.但仅仅使用这样的防护是存在很多盲点的,接上篇http://www ...

  6. 【PHP代码审计】 那些年我们一起挖掘SQL注入 - 7.全局防护盲点的总结上篇

    0x01 背景 现在的WEB应用对SQL注入的防护基本都是判断GPC是否开启,然后使用addlashes函数对单引号等特殊字符进行转义.但仅仅使用这样的防护是存在很多盲点的,比如最经典的整型参数传递, ...

  7. PHP代码审计】 那些年我们一起挖掘SQL注入 - 1.什么都没过滤的入门情况

    0x01 背景 首先恭喜Seay法师的力作<代码审计:企业级web代码安全架构>,读了两天后深有感触.想了想自己也做审计有2年了,决定写个PHP代码审计实例教程的系列,希望能够帮助到新人更 ...

  8. 【PHP代码审计】 那些年我们一起挖掘SQL注入 - 1.什么都没过滤的入门情况

    0x01 背景 首先恭喜Seay法师的力作<代码审计:企业级web代码安全架构>,读了两天后深有感触.想了想自己也做审计有2年了,决定写个PHP代码审计实例教程的系列,希望能够帮助到新人更 ...

  9. ASP代码审计学习笔记-1.SQL注入

    ASP注入漏洞 一.SQL注入的原因 按照参数形式:数字型/字符型/搜索型 1.数字型sql查询 sql注入原因: ID=49 这类注入的参数是数字型,SQL语句原貌大致如下: id=request. ...

随机推荐

  1. linux 从命令行自动识别文件并将其打开的命令

    若是shell是 zsh,则可: 使用 alias -s 定义后缀别名 (zsh) % alias -s pl=perl % script.pl perl script.pl % alias -s p ...

  2. openstack 实例迁移

  3. 第三百零八至三百二十天 how can I 坚持

    十三天..2月4号至2月16号,好快,假期还没开始就结束了.一一回忆下. 2月4号,腊月二十六,最后一天上班,没多大事,好像是玩了一天,东月回家,貌似路上好折腾,晚上D401,和她聊了一路,也聊了好多 ...

  4. css斜线

    斜线 .demo{ display: inline-block; width: 400px; height: 100px; resize: both; overflow: auto; margin-t ...

  5. Primitive Objects

    [Primitive Objects] Unity can work with 3D models of any shape that can be created with modelling so ...

  6. DataTemplate和ControlTemplate的关系

    DataTemplate和ControlTemplate的关系(转载自haiziguo) 一.ContentControl中的DataTemplate 在开始之前,我们先去看一下ContentCont ...

  7. MES取所有部门的函数实例

    USE [ChangHong]GO/****** Object: UserDefinedFunction [dbo].[FN_GetDeptCode] Script Date: 04/26/2016 ...

  8. 通过点击取消按钮关闭dialog窗口

  9. 设置文字在div中垂直居中,使用line-height

    (从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期2014-02-19) line-height 行间距 详细使用方法:http://www.w3school.com.cn/css/pr ...

  10. (1)html开头解说与案例演示

    看完后也可以参考http://www.cnblogs.com/csxiaoyu/p/5228889.html http://www.cnblogs.com/zfc2201/p/5429252.html ...