SQL 注入漏洞_代码审计是什么意思

SQL 注入漏洞_代码审计是什么意思简单来讲,所有可以涉及到数据库增删改查的系统功能点都有可能存在SQL注入漏洞。1 PHP MySQLi基本函数。

1.SQL注入原理

SQL注入就是攻击者通过把恶意的SQL语句插入到Web表单的输入页面中,且插入的恶意语句会导致原有的SQL语句发生改变,从而达到攻击者的目的去让它执行一些危险的数据操作,进一步欺骗服务器去执行一些非本意的操作。

简单来讲,所有可以涉及到数据库增删改查的系统功能点都有可能存在SQL注入漏洞

一个简单的攻击原理举例:

SQL 注入漏洞_代码审计是什么意思

在SQL注入中,我们更应该关注的是业务逻辑,例如业务中可能设计到的增删改查操作,下面通过一个简单的代码小demo来进行SQL注入的演示:

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>SQL注入小demo</title>
</head>
<body>
用户名:
<form method="GET">     //form表单通过get方式接收数据
   <input type="text" name="name" size="50" />   //通过name参数接收数据
   <br>
   <input type="submit" value="点击查询" style="margin-top:50px;">
   <?php
  $db = mysqli_connect("localhost","root","123456","demo"); //建立mysql连接
  if(!$db){
          echo "数据库链接失败!";
          exit();
  }

  $name = $_GET['name']; //通过前端设置的name参数将数据接收到后端进行处理
  $sql = "select * from user where name = '".$name."';";
  echo " 输出当前执行的SQL主句:".$sql."";
       $result = mysqli_query($db,$sql);  //执行SQL语句

   while($row=mysqli_fetch_array($result))   //取出一行数据的所有内容以数组的形式返回
  {
       echo "账号:".$row['user']."";      //输出一行数据的user字段值
       echo "密码:".$row['passwd']."";//输出一行数据的passwd字段值
  }
   mysqli_close($db);//关闭mysql连接
   ?>
</form>
</body>
</html>

代码100分

【一一帮助安全学习,所有资源关注我,私信回复“资料”获取一一】
①网络安全学习路线
②20份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥网络安全必备书籍
⑦100个漏洞实战案例
⑧安全大厂内部教程

1.1 PHP MySQLi基本函数

PHP MySQLi 函数允许访问 MySQL 数据库服务器。通俗来说MySQLi 下的函数用来处理PHP中关于数据增删改查的操作。

mysqli_connect()

SQL 注入漏洞_代码审计是什么意思

mysqli_query()

SQL 注入漏洞_代码审计是什么意思

mysqli_fetch_array()

SQL 注入漏洞_代码审计是什么意思

mysqli_close()

SQL 注入漏洞_代码审计是什么意思

为了方便演示实际的业务流程,我们创建demo数据库,并且创建user表,在表中插入演示数据。

SQL 注入漏洞_代码审计是什么意思

这里简单演示了一下通过查询来获取数据的操作原理。

SQL 注入漏洞_代码审计是什么意思

1.2 问题引申:

我们知道某些业务功能会涉及到数据库交互,如上所示,我们是不是可以通过正常功能插入恶意SQL语句来实现我们想要达到的目的呢?

例如这样:

代码100分1' union select 1,2,user(),database();#

2.SQL注入分类

SQL注入大致分为以下五大类,下面我们通过实际的PHP代码进行分析。

SQL 注入漏洞_代码审计是什么意思

2.1 报错注入

2.2.1 示例代码

通过传入id参数且传入的id参数未做过滤直接拼接到SQL语句中执行,直接使用mysqli_error()进行报错处理没有对报错进行良好的错误处理,所以导致报错注入的产生。

<?php
if(isset($_GET['id']))    //判断是否存在id参数传入
{
   header("Content-type:text/html;charset=utf-8");
   $db = mysqli_connect("localhost:3307","root","123456","demo"); //连接一个数据库
   if(!$db){
       echo "数据库链接失败!";
       exit();
  }
   $id=$_GET['id']; //获取id参数值
   $sql="SELECT * FROM user WHERE id='$id' LIMIT 0,1";  //将id参数值直接拼接到SQL语句
   $result=mysqli_query($db,$sql); //执行SQL语句
   $row = @mysqli_fetch_array($result);   //取出第一行查询到的值以数组形式返回

if($row)
{
   echo 'Your Login name:'. $row['user'];  //查询到id为xxx的user字段值并输出
   echo "<br>";
   echo 'Your Password:' .$row['passwd'];  //查询到id为xxx的passwd字段值并输出
}
else
{
   echo mysqli_error($db); //如果语句出现错误直接输出错误
}
   mysqli_close($db); //关闭mysql连接
}
?>

2.1.2 PHP函数介绍

mysqli_erro

SQL 注入漏洞_代码审计是什么意思

2.1.3 测试

当正常查询id=1时输出user以及passwd字段的值php、123456。

SQL 注入漏洞_代码审计是什么意思

当输入id=1′,mysqli_error()捕获错误信息,并将SQL语句报错。

SQL 注入漏洞_代码审计是什么意思

我们闭合SQL语句中的单引号即可执行我们想要的查询的内容

测试语句:

代码100分1' and (select extractvalue("anything",concat('~',( user()))))%20--%20dsddsa
SQL 注入漏洞_代码审计是什么意思

2.2 宽字节注入

2.2.1 代码示例

mysql中有一个特性,由于gbk是多字节编码,两个字节代表一个汉字,所以%df和后面的转义字符\也就是%5c会组成了一个汉字運,而’就逃逸了出来造成SQL注入。

在审计SQL注入时,要着重注意MySQL中设置的字符编码,如果为gbk,那么很可能存在宽字节注入。

<?php
if(isset($_GET['id']))
{
   header("Content-type:text/html;charset=utf-8");
   $db = mysqli_connect("localhost:3307","root","123456","demo");
   mysqli_query($db,"SET NAMES 'gbk'");    //设置MySQL字符编码为gbk
   if(!$db){
       echo "数据库链接失败!";
       exit();
  }
   $id=addslashes($_GET['id']);    //通过addslashes()对特殊字符进行转义
   $sql="SELECT * FROM user WHERE id='$id' LIMIT 0,1";
   echo "输出SQL语句:".$sql."<br><br>";
   $result=mysqli_query($db,$sql);
   $row = @mysqli_fetch_array($result);

   if($row)     //
  {
       echo 'Your Login name:'. $row['user'];
       echo "<br>";
       echo 'Your Password:' .$row['passwd'];
  }
   else
  {
       echo mysqli_error($db);
  }
   mysqli_close($db);
}
?>

2.2.2 PHP函数介绍

addslashes()

SQL 注入漏洞_代码审计是什么意思

2.2.3 测试

我们发现输入’时,’被addslashes()转义。

SQL 注入漏洞_代码审计是什么意思

我们使用%df和前面的\闭合也就是%5c,然后我们的%27也就是’直接逃逸出来,这时我们就能构造自己想要执行的SQL语句,造成SQL注入。

测试语句:

1%df%27 and extractvalue(1,concat(0x7e,(select user()),0x7e)) -- qwe
SQL 注入漏洞_代码审计是什么意思

2.3 盲注

在盲注中不管是布尔盲注还是时间型盲注,页面显示不会有明显的变化,代码审计中只能通过查看源代码闭合原有的SQL语句,然后利用MySQL中延时的方式来判断是否存在SQL注入。

2.3.1 代码示例

这里为了进行盲注的演示,在代码中特意加入了一条if判断,当mysqli_fetch_array()查询的结果集为NULL的时候,返回id=1的数据内容,这就让我们无法判断插入的SQL语句是否执行成功,只能通过延时来进行测试。

<?php
if(isset($_GET['id']))
{
   header("Content-type:text/html;charset=utf-8");
   $db = mysqli_connect("localhost:3307","root","123456","demo");
   if(!$db){
       echo "数据库链接失败!";
       exit();
  }
   $id=$_GET['id'];
   $sql="SELECT * FROM user WHERE id='$id' LIMIT 0,1";
   $result=mysqli_query($db,$sql);
   $row = @mysqli_fetch_array($result);
   if(!$row)  //如果查询的结果集为NULL的话,返回id=1的数据
  {
       $sql="SELECT * FROM user WHERE id='1' LIMIT 0,1";
       $result=mysqli_query($db,$sql);
       $row = @mysqli_fetch_array($result);
  }

   if($row)
  {
       echo 'Your Login name:'. $row['user'];
       echo "<br>";
       echo 'Your Password:' .$row['passwd'];
  }
   mysqli_close($db);
}
?>

2.3.2 测试

当我们查询数据库中存在的数据时返回指定字段的内容

SQL 注入漏洞_代码审计是什么意思

当我们查询数据库中不存在的数据时,由于mysqli_fetch_array()查询结果为NULL,所以返回id=1的指定字段内容。

SQL 注入漏洞_代码审计是什么意思

由于我们在代码审计时可以一目了然看到SQL语句的构造情况,所以我们只需闭合相应的特殊字符,通过sleep()函数使页面延时,从而判断此处是否存在注入点,进而进行下一步的注入。

测试语句:

2312'%20or%20sleep(5)%20--%20qwe

2.4 二次注入

2.4.1 代码示例

二次注入的逻辑是在第一次insert或update操作时代码存在转义而无法造成注入,但数据在被插入数据库时转义会消失,正常的SQL语句将会被存储到数据库中,在第二次调用插入的数据时被还原的SQL语句将被拼接到正常的SQL语句中造成二次注入。

SQL 注入漏洞_代码审计是什么意思

<?phpif(isset($_GET['user'])){    header("Content-type:text/html;charset=utf-8");    $db = mysqli_connect("localhost:3307","root","123456","demo");    if(!$db){        echo "数据库链接失败!";        exit();    }    //第一次更新操作    $user=addslashes($_GET['user']);    $sql="update user set user='$user' where id=1";  //修改id=1的用户名    echo "输出第一次的SQL语句:".$sql."<br><br>";    $result=mysqli_query($db,$sql);	//第二次查询操作    $sql = "select * from user where id=1";    $result=mysqli_query($db,$sql);    $row = @mysqli_fetch_array($result);    $sql = "select * from user where user = '$row[2]'";  //查询结果集中下标为2(name)的一行数据    echo "输出第二次查询的SQL语句:".$sql."<br><br>";    $result=mysqli_query($db,$sql);    var_dump(mysqli_fetch_row($result));  //取出查询到的结果集并以数组的形式返回    mysqli_close($db);}?>

2.4.2 PHP函数介绍

mysqli_fetch_row()

SQL 注入漏洞_代码审计是什么意思

2.4.3 测试

输入’时,’被addslashes()转义,这里无法造成注入

SQL 注入漏洞_代码审计是什么意思

但在数据库中存储时转义\被清除

SQL 注入漏洞_代码审计是什么意思

但在第二次调用时转义后的SQL语句被拼接在正常的SQL语句中,造成二次注入。
测试语句:

' union select 1,2,database(),3 -- qwe
SQL 注入漏洞_代码审计是什么意思

SQL 注入漏洞_代码审计是什么意思

3.SQL注入代码审计总结

在审计SQL注入的时候,我们首先要找到对应的传参点,更要多关注代码中正常SQL语句的规则和过滤情况,最重要的是要闭合正常的SQL语句来,最终执行我们想要执行的SQL语句。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/4076.html

(0)
上一篇 2023-05-26
下一篇 2022-12-15

相关推荐

  • Python集成开发环境

    Python集成开发环境在过去的几年中,Python变得越来越流行。Python的易学性和广泛的应用范围使之成为了许多初学者的首选语言,同时也是许多经验丰富的开发人员的最爱。Python在许多领域中都有应用,如Web开发、数据科学、人工智能和机器学习等。随着Python使用的增加,更多的人开始使用Python集成开发环境(IDE)以提高他们的编程效率。

    2024-09-12
    24
  • Python中删除非空目录的方法

    Python中删除非空目录的方法在Python中,我们可以利用os模块实现删除非空目录。具体操作方法是调用os模块的rmtree()函数,该函数可以递归地删除目录及其子目录下的所有文件和文件夹。下面是代码示例:

    2024-03-01
    95
  • Python中的pow()函数:快速计算幂次方

    Python中的pow()函数:快速计算幂次方Python中的pow()函数可以用来计算一个数的幂次方,它接受两个参数:

    2024-01-20
    102
  • Python 整数类型:定义和使用

    Python 整数类型:定义和使用Python中整数类型的定义非常简单,只需要直接使用数字即可。比如:

    2024-03-04
    79
  • mysql 更新锁_mysql锁是怎么实现的

    mysql 更新锁_mysql锁是怎么实现的利用Mysql的锁来解决高并发的问题,先看没有利用事务的时候并发的后果 创建库存管理表 CREATE TABLE `storage` ( `id` int(11) unsigned NOT NULL…

    2023-03-18
    147
  • 如何切换 Python 版本

    如何切换 Python 版本在开发 Python 程序时,我们可能会涉及不同版本的 Python,在这种情况下,如何切换 Python 版本就成为了一个必须掌握的技能。下面就来介绍如何在不同的操作系统上切换 Python 版本。

    2024-08-23
    21
  • 优化代码流程的小技巧——Python中的elif语句

    优化代码流程的小技巧——Python中的elif语句在Python中,我们经常需要根据一定的条件来执行相应的代码,而多个条件的情况下,我们常常会使用if-else语句来完成不同的分支判断。但是,如果条件分支较多的情况下,嵌套的if-else语句将会使程序难以理解和维护,这时,我们可以使用Python中的elif语句,来优化代码流程,提高程序的可读性和可维护性。

    2024-01-01
    106
  • MongoDB聚合(aggregate)[通俗易懂]

    MongoDB聚合(aggregate)[通俗易懂]https://www.cnblogs.com/wt7018/p/11929359.html MongoDB聚合(aggregate) 一、基础 1、什么是聚合? 聚合是基于数据处理的聚合管道,每个文

    2023-02-13
    173

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注