挖掘经验:sql注入经常出现在登录界面、获取HTTP请求头、订单处理等地方。而登录界面的注入现在来说大多是发生在HTTP头里面的client-ip和x-forward-for,一般用来记录登录的ip地址。
 
普通注入:
这里说的普通注入是指最容易利用的sql注入漏洞,比如通过注入union查询就可以查询数据库。源码如下:
<?php
$con=mysqli_connect("localhost","root","123456","test");
// 检测连接
if (mysqli_connect_errno())
{
    echo "连接失败: " . mysqli_connect_error();
}
$id = $_GET['id'];
$result = mysqli_query($con,"select * from users where `id`=".$id);
while($row = mysqli_fetch_array($result))
{
    echo $row['username'] . ": " . $row['address'];
    echo "<br>";
}
?>
含有普通注入漏洞的数据库操作存在一些关键字,比如select from、mysql_connect、mysql_query、mysql_fetch_row等,数据库的查询方式还有update、insert、delete,我们在做白盒审计时,只需要查找这些关键字,即可定向挖掘SQL注入漏洞。
常用语句注释:
mysql_connect() 函数打开非持久的 MySQL 连接。mysql_connect(server,user,pwd,newlink,clientflag)
mysql_query() 函数执行一条 MySQL 查询。
mysql_query(query,connection)
参数
描述
query
必需。规定要发送的 SQL 查询。注释:查询字符串不应以分号结束。
connection
可选。规定 SQL 连接标识符。如果未规定,则使用上一个打开的连接。
mysql_fetch_row() 函数从结果集中取得一行作为数字数组。

语法

mysql_fetch_row(data)
参数
描述
data
必需。要使用的数据指针。该数据指针是从 mysql_query() 返回的结果。

编码注入:

1.宽字节注入:关于编码的小知识
尽管现在呼吁所有的程序都使用unicode编码,所有的网站都使用utf-8编码,来一个统一的国际规范。但仍然有很多,包括国内及国外(特别是非英语国家)的一些cms,仍然使用着自己国家的一套编码,比如gbk,作为自己默认的编码类型。也有一些cms为了考虑老用户,所以出了gbk和utf-8两个版本。
 
以gbk字符编码为例,gbk是一种多字符编码
通常来说,一个gbk编码汉字,占用2个字节。一个utf-8编码的汉字,占用3个字节。
在php中,我们可以通过输出 echo strlen("我"); 来测试。当将页面编码保存为gbk时输出2,utf-8时输出3。
宽字节注入原理
1、数据库编码(GBK)与PHP编码(utf-8)不一致
2、PHP中使用了用于转义特殊字符的函数:
在mysql中,用于转义(即在字符串中的符号如单引号 ' ,双引号 " 反斜杠 \ 和 NULL 字符前加上"\")的函数有addslashes,mysql_real_escape_string,mysql_escape_string等,还有一种情况是magic_quote_gpc(即魔术引号开关),不过高版本的PHP将去除这个特性。
在使用Php连接mysql数据库时,当设置“set character set client=gbk”时会导致一个编码转换的注入问题,也就是宽字节注入。当存在宽字节注入时,注入参数里带入%df%27,即可把程序中过滤的\(%5c)吃掉。魔术引号:https://www.cnblogs.com/i-honey/p/7905953.html
 
出现这个漏洞的原因是在PHP连接Mysql的时候执行了如下设置:
set character_set_client=gbk
解决方法:在执行查询前先执行SET NAMES 'gbk',character_set_client=binary设置character_set_client为binary
测试代码:
?php
 
$conn = mysql_connect('localhost', 'root', '123456') or die('bad!');
mysql_select_db('test', $conn) OR emMsg("数据库连接失败");
mysql_query("SET NAMES 'gbk'",$conn);
 
$id = addslashes($_GET['id']);
$sql="SELECT * FROM kuanzifu WHERE id='$id' LIMIT 0,1";
$result = mysql_query($sql, $conn) or die(mysql_error());
$row = mysql_fetch_array($result);
 
    if($row)
    {
      echo $row['username'] . $row['address'];
      }
    else
    {
    print_r(mysql_error());
    }
 
?>
</font>
<?php
 
echo "<br>The Query String is : ".$sql ."<br>";
 
?>
对宽字节注入的挖掘方法也比较简单,只要搜索如下几个关键字即可:
SET NAMES         character_set_client=gbk      mysql_set_charset('gbk')
二次urldecode注入
只要字符被进行转换就有可能产生漏洞,现在的web程序大多都会进行参数过滤,通常使用addslashes()、mysql_real_escape_string()、mysql_escape_string()函数或者开启GPC的方式来防止注入,也就是给单引号(')、双引号(")、反斜杠(\)和NULL加上反斜杠转义。
如果某处使用了urldecode或者rawurldecode函数,则会导致二次解码生成单引号引发注入。原理是我们提交参数到webserver时,webserver会自动解码一次,假设目标开启GPC,我们提交了/1.php?id=1%2527,因为我们提交的参数里面没有单引号,所以第一次解码后的结果为id=1%27,%25解码的结果为%,如果程序里面使用了urldecode或者rawurldecode函数来解码id函数,则解码后的结果为id=1',单引号成功出现引发注入。
既然知道了原理主要是由于urldecode使用不当造成的,那我们就可以通过搜索urldecode和rawurldecode函数来挖掘urldecode注入漏洞。
 
 
 
总结:SQL注入漏洞的防范
在PHP中可以通过魔术引号来防范,不过魔术引号在PHP5.4后被取消,并且gpc在遇到int类型的注入时显得不那么给力了,所以通常用得多的还是过滤函数和类。当然最好的解决方案是利用预编译的方式。
1.gpc/runtime魔术引号
magic_quotos_gpc负责对GET、POST、COOKIE的值进行过滤,magic_quotos_runtime对从数据库或者文件中获取的数据进行过滤。通常在开启2个选项后能防止部分SQL注入漏洞,但在int类型是没多大用。
2.addslashes函数
addslashes函数过滤的值范围和GPC是一样的。他只是一个简单的检查的参数的函数,大多数程序使用它是在程序的入口,进行判断如果没有开启GPC,则使用它对$_POST/$_GET等变量进行过滤,不过它的参数必须是string类型。
3.mysql_[real_]escape_string函数
这两个函数都是对字符串进行过滤,在PHP4.0.3以上版本才存在。区别在于mysq_real_escape_string接受的是一个连接句柄并根据当前字符集转义字符串,所以推荐使用mysql_real_escape_string。
4.intval等字符进行转换
上面提到的过滤方式,在int类型注入时效果并不好,比如可以通过报错或者盲注等方式绕过,这时候intval等函数就起作用了,intval的作用是将变量转换为int类型。这里举例intval是要表达一种方式,一种利用参数类型白名单的方式来防止漏洞。
<?php
$id=intval("1 union select  ");
echo $id;
?>
以上代码输出:1
5.过滤危险字符:多数cms都采用过滤危险字符的方式,例如,采用正则表达式匹配union、sleep、load_file等关键字,如果匹配到,就退出程序。
6.PDO 预编译语句
预编译:指的是预先编译SQL的结构的一种执行SQL的方法。具体见:https://www.cnblogs.com/xiaoyoucai/p/7397163.html
其实使用PDO预编译语句,需要注意的是,不要将变量直接拼接到PDO语句中,而是使用占位符进行数据库的增加、删除、修改、查询。

代码审计(1):sql注入漏洞的更多相关文章

  1. PHP代码审计入门(SQL注入漏洞挖掘基础)

    SQL注入漏洞 SQL注入经常出现在登陆页面.和获取HTTP头(user-agent/client-ip等).订单处理等地方,因为这几个地方是业务相对复杂的,登陆页面的注入现在来说大多数是发生在HTT ...

  2. 2020/1/27代码审计学习之SQL注入漏洞

    PHP代码审计SQL注入漏洞 0x00 首先明确什么是SQL注入,SQL语句必须掌握. 常见的注入总的来说可以分为两大类:数字型和字符型. 这两类中包含了诸如报错注入,宽字节注入,盲注,二次注入,co ...

  3. 【代码审计】五指CMS_v4.1.0 copyfrom.php 页面存在SQL注入漏洞分析

      0x00 环境准备 五指CMS官网:https://www.wuzhicms.com/ 网站源码版本:五指CMS v4.1.0 UTF-8 开源版 程序源码下载:https://www.wuzhi ...

  4. 【代码审计】五指CMS_v4.1.0 后台存在SQL注入漏洞分析

      0x00 环境准备 五指CMS官网:https://www.wuzhicms.com/ 网站源码版本:五指CMS v4.1.0 UTF-8 开源版 程序源码下载:https://www.wuzhi ...

  5. 【代码审计】大米CMS_V5.5.3 SQL注入漏洞分析

      0x00 环境准备 大米CMS官网:http://www.damicms.com 网站源码版本:大米CMS_V5.5.3试用版(更新时间:2017-04-15) 程序源码下载:http://www ...

  6. 【代码审计】XIAOCMS_后台database.php页面存在SQL注入漏洞

      0x00 环境准备 XIAOCMS官网: http://www.xiaocms.com/ 网站源码版本:XiaoCms (发布时间:2014-12-29) 程序源码下载:http://www.xi ...

  7. 【代码审计】iZhanCMS_v2.1 前台IndexController.php页面存在SQL注入 漏洞分析

      0x00 环境准备 iZhanCMS官网:http://www.izhancms.com 网站源码版本:爱站CMS(zend6.0) V2.1 程序源码下载:http://www.izhancms ...

  8. 【代码审计】iZhanCMS_v2.1 前台GoodsController.php页面存在SQL注入漏洞分析

      0x00 环境准备 iZhanCMS官网:http://www.izhancms.com 网站源码版本:爱站CMS(zend6.0) V2.1 程序源码下载:http://www.izhancms ...

  9. 【代码审计】iZhanCMS_v2.1 后台存在多个SQL注入漏洞分析

      0x00 环境准备 iZhanCMS官网:http://www.izhancms.com 网站源码版本:爱站CMS(zend6.0) V2.1 程序源码下载:http://www.izhancms ...

  10. 【代码审计】iCMS_v7.0.7 admincp.app.php页面存在SQL注入漏洞分析

      0x00 环境准备 iCMS官网:https://www.icmsdev.com 网站源码版本:iCMS-v7.0.7 程序源码下载:https://www.icmsdev.com/downloa ...

随机推荐

  1. codeforces-Three Friends

      Three Friends Three friends are going to meet each other. Initially, the first friend stays at the ...

  2. github 创建gitlab每次提交都要输入账号

    在使用git提交代码到github的时候,经常要求输入用户名和密码,类似这种: 除了在 github 上添加 SSH key 网上有这么一种解决方法:使用git提交到github,每次都要输入用户名和 ...

  3. 安卓之线性布局LinearLayout

    一.xml属性   (1)orientation:指定线性布局的方向   (2)gravity:指定布局内部视图与本线性布局的对齐方式   (3)layout_weight:指定当前视图的宽或高占上级 ...

  4. SpringCloud全家桶学习之消息总线---SpringCloud Bus

    一.概述 ConfigClient(微服务)从ConfigServer端获取自己对应的配置文件,但是目前的问题是:当远程git仓库配置文件发生改变时,每次都是需要重启ConfigCient(微服务), ...

  5. 修正SQLSERVER package连接

    drop table #temp_mt; --WITH XMLNAMESPACES ('www.microsoft.com/SqlServer/Dts' AS DTS) SELECT ROW_NUMB ...

  6. Google Earth Engine学习资源分享

    最近在学习Google Earth Engine的使用,发现这个平台确实是一个非常好用.非常强大的平台.在GEE官网上找到了一些中文的学习资料,现在搬运过来分享给大家共同学习.教程分为两个部分 教程一 ...

  7. ORM框架的概述

    ORM: object relation mapping [对象][关系]映射    将对象  映射到  数据库中        类名        数据库表名        对象           ...

  8. node.js+mysql环境搭建

    https://www.jianshu.com/p/9b338095cbe8 node.js+mysql环境搭建 0x01 前言 随着html web技术的发展,和全栈式开发的需求,对于前端人员来讲, ...

  9. C++11⾥⾯很好⽤的auto声明

    本文摘录于柳神笔记: auto 是C++11⾥⾯的新特性,可以让编译器根据初始值类型直接推断变量的类型.⽐如这样: 当然这个在算法⾥⾯最主要的⽤处不是这个,⽽是在STL中使⽤迭代器的时候, auto ...

  10. 树莓派4B踩坑指南 - (7)root账户及权限设置

    树莓派启用root账户 树莓派默认用户是pi 密码为raspberry. root账户默认无密码,但是账户锁定. 开启root账户命令: sudo passwd root #执行后提示设置密码,输入2 ...