SQL注入攻击(sql injection)被广泛用于非法获取网站控制权,在设计程序时,忽略或过度任性用户的输入,从而使数据库受到攻击,可能导致数据被窃取,更改,删除以及导致服务器被嵌入后门程序等

sql注入的条件
用户输入数据可控,源程序要执行代码,拼接了用户输入的数据

注入两大类型(不同数据库的比较方式不同)

数字型注入:当输入的参数为整数时,可认为是数字型注入(如 id 年龄,页码等都可以认为是数字型注入,并且不需要单引号来闭合)
$result = "select * freo admin where id=$id";

字符型注入:当输入的参数为字符串时。称为字符型,需要单引号来闭合
$result = "select * from admin where id='$id'";

<?php
$conn = mysql_connect('localhost', 'root', 'root') or die('bad!');
mysql_query("SET NAMES binary'");
mysql_select_db('test', $conn) OR emMsg("数据库连接失败");
//这里id没有做整形转换
$id = isset($_GET['id']) ? $_GET['id'] : 1;//sql语句没有做过滤,造成注入
$sql = "SELECT * FROM news WHERE id={$id}";
$result = mysql_query($sql, $conn) or die(mysql_error());
?>

注入的利用方式
查询数据
读写文件
执行命令

注入过程
攻击者访问页面
将包含有攻击字符组成的sql语句转发给数据库执行
数据库执行发回应用程序服务器
应用程序将内容返回浏览器,即成功攻击

盲注:在sql注入过程中,sql语句执行的选择后,选择的数据不在页面显示
基于布尔sql盲注
基于时间sql盲注
基于报错sql盲注

修复方案
使用预编译语句
使用存储过程
检查数据类型
使用安全函数过滤

宽字节注入及二次注入

宽字节注入:字符(charater)是组成字符集(character set)的基本单位,对字符赋予一个数值(encoding)来确定这个字符在该字符集中的位置,字符序(collation)指同一字符集内字符间的比较规则,由于ascll表示的字符只有128个,因此规范使用Unicode编码,但是使用ascll表示的字符使用Unicode并不高效,所以出现了中间格式字符集,被称为通用转换格式及UTF。GB2312 GBK GB118030 BIG5 Shift JIS等这些都是常说的宽字节,实际只有两字节,宽字节带来的安全问题主要是ascll字符(一字节)的现象

<?php
//连接数据库部分,注意使用了gbk编码,把数据库信息填写进去
$conn = mysql_connect('localhost', 'root', 'toor!@#$') 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()); //sql出错会报错,方便观察
?>
<!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>
2</html>

SQL语句是SELECT * FROM news WHERE tid='{$id}',就是根据文章的id把文章从news表中取出来,在这个sql语句前面,使用了一个addslashes函数,将$id的值转义。这是通常cms中对sql注入进行的操作,只要我们的输入参数在单引号中,就逃逸不出单引号的限制,无法注入,addslashes函数产生的效果就是,让’变成\’,让引号变得不再是“单引号”,只是一撇而已。一般绕过方式就是,想办法处理\’前面的\,我们这里的宽字节注入是利用mysql的一个特性,mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围)。如果我们输入%df’会看到报错,说明sql语句出错,看到出错说明可以注入了,为什么在’也就是%27前面加了一个%df就报错了?而且可以看到,报错的原因就是多了一个单引号,而单引号前面的反斜杠不见了,这就是mysql的特性,因为gbk是多字节编码,他认为两个字节代表一个汉字,所以%df和后面的\也就是%5c变成了一个汉字“運”,而’逃逸了出来。

原理:%df%27---->(addslashes)--->%df%5c%27------>(GBK)====運'用户输入---->g过滤函数--->代码层的$sql--->mysql处理请求--->mysql中的sql
默认编码character_set_client-->根据character_set_connection转换-->更新数据库是转换成字段对应的编码。

修复方案
使用mysql_set_charset(GBK)指定字符集
使用mysql_real_escape_string进行转义

二次注入
注入点因为经过过滤处理无法触发sqlsql注入漏洞,比如addslashes函数,将单引号等字符转义变成\’,但是存进数据库后数据又被还原,在这种情况下,如果发现一个新的注入同时引用了被插入的数据库数据时,就可以实现闭合新发现的注入漏洞引发二次注入,

利用思路:
现将注入语句插入到数据库,注册,留言等功能具有insert数据库的操作,然后在使用update的地方触发插入到数据库的注入语句。

一阶sql注入:发生在一个http请求和响应中,对系统的攻击是立即执行的,攻击者在http请求中提交非法输入,应用程序处理非法输入,使用非法输入构造sql语句,在攻击过程中向攻击者返回结果

二阶sql注入:攻击者在http请求中提交恶意输入,恶意输入保存在数据库中,攻击者提交第二次http请求,为处理第二次htt请求,程序在检索存储在数据库中的恶意输入,构造sql语句,如果攻击成功,在第二次请求响应中返回结果

代码1
<?php
    include('./connect.php'); //引入数据库配置文件
    $id=$_GET['id'];
    $select_sql="SELECT * FROM article WHERE title='$id'";
    echo $select_sql;
    mysql_query('set names utf8');
    $select_sql_result=mysql_query($select_sql);
    $date=mysql_fetch_assoc($select_sql_result);
 ?>
 <!DOCTYPE html>
 <html>
   <head>
     <meta charset="utf-8">
     <title><?php echo $date['title']."啦啦啦啦啦啦"?></title>
   </head>
   <body>
      <h1><?php echo $date['title'] ?></h1><br />
      作者:<?php echo $date['author'] ?><br/>
      时间:<?php echo date("Y-m-d H:i:s",$date['dateline'])?><br />
      概述: <?php echo $date['description']; ?><br />
      正文: <?php echo $date['content'] ?>
   </body>
 </html>

代码2
<?php
   include('../connect.php');
   $title=addslashes($_POST['title']);  //addslashes 将预定义字符串转义
   $author=addslashes($_POST['author']);
   $description=addslashes($_POST['description']);
   $content=addslashes($_POST['content']);
   $dataline=time();
   $insert="INSERT INTO article(title,author,description,content,dateline) VALUES('$title','$author','$description','$content','$dataline')";
   echo $insert;
   mysql_query("set names utf8"); //设置编码
   if($result=mysql_query($insert)){
     $num=mysql_affected_rows($con);
     echo $num;
     }
 ?>

代码1是一个内容显示页面,通过传入的title在数据库进行查询,然后在页面调用输出,可以看到传递的参数id并没有经过过滤,可以成为一个典型的字符串GET注入,但是我们今天要讨论的是二次注入,暂时不考虑这个注入。代码2是一个添加页面,通过表单POST的数据执行INSERT语句插入数据,成功后返回数据库影响行数,而且这里的每一个参数都用addslashes函数进行了转义。两段代码结合,是一个典型的二次注入,虽然文章添加页面中过滤的非常严格,但是addslashes有一个特点就是虽然参数在过滤后会添加 “\” 进行转义,但是“\”并不会插入到数据库中,再配合内容显示页面中的查询是通过title查询的,所以可以利用这个构造一个二次注入。

php代码审计3审计sql注入漏洞的更多相关文章

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

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

  2. 【代码审计】VAuditDemo SQL注入漏洞

    这里我们定位 sqlwaf函数 在sys/lib.php中,过滤了很多关键字,但是42 43 44行可以替换为空 比如我们可以 uni||on来绕过过滤

  3. [CMS] UsualToolCMS-8.0 sql注入漏洞【转载】

    原文地址:http://lyscholar.cn/2019/07/30/代码审计-usualtoolcms存在sql注入漏洞/ 0x01 漏洞环境 版本信息:UsualToolCMS-8.0-Rele ...

  4. [代码审计]DM企业建站系统v201710 sql注入漏洞分析 | 新版v201712依旧存在sql注入

    0x00 前言 本来呢,这套CMS都不想审的了.下载下来打开一看,各种debug注释,排版烂的不行. 贴几个页面看看 感觉像是新手练手的,没有审下去的欲望了. 但想了想,我tm就是新手啊,然后就继续看 ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. oracle ---中文乱码问题

    ---- 1.原因分析 ---- 通过对用户反映情况的分析,发现字符集的设置不当是影响ORACLE数据库汉字显示的关键问题.那么字符集是怎么一会事呢?字符集是ORACLE 为适应不同语言文字显示而设定 ...

  2. highcharts钻取例子

    <!doctype html> <html lang="en"> <head> <script type="text/javas ...

  3. spring-cloud配置服务器配置

    本文介绍spring-cloud配置服务器 server端配置 目录结构 依赖 java代码 properties 运行 client端配置 目录结构 依赖 java代码 properties 运行 ...

  4. Python——Dict

    Python字典(Dictionary) 字典是一种可变容器模型,可存储任意类型对象. 字典的每个键值(key => value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花 ...

  5. 在VS13上编译通过的代码放在12上编译-错误:l __dtoui3 referenced in function _event_debug_map_HT_GROW

    在VS13上编译通过的代码放在12上编译 遇到错误:l __dtoui3 referenced in function _event_debug_map_HT_GROW 1>------ 已启动 ...

  6. c语言实践 1/1+1/2+1/3+1/4+...+1/n

    给定一个n求这个分式的和. int n = 1; float sum = 0; float frac = 0; int i = 1; scanf_s("%d",&n); w ...

  7. Luogu 4213 【模板】杜教筛(Sum)

    当作杜教筛的笔记吧. 杜教筛 要求一个积性函数$f(i)$的前缀和,现在这个东西并不是很好算,那么我们考虑让它卷上另外一个积性函数$g(i)$,使$(f * g)$的前缀和变得方便计算,然后再反推出这 ...

  8. mvc json 日期问题的最简单解决方法

    1.首先编写BaseController这个类,需要引入Newtonsoft.Json.dll程序集 using System;using System.Collections.Generic;usi ...

  9. JMS-消息中间件的应用01-基本概念-来自慕课学习-新手学习

    什么是JMS? Java消息服务(Java Message Service),即JMS,是一个java平台中关于面向消息中间件的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信. ...

  10. (转)基于MVC4+EasyUI的Web开发框架形成之旅--界面控件的使用

    原文地址:http://www.cnblogs.com/wuhuacong/p/3317223.html 在前面介绍了两篇关于我的基于MVC4+EasyUI技术的Web开发框架的随笔,本篇继续介绍其中 ...