php开发中常见的漏洞点(一) 基础sql注入
前言
本系列为小迪2022的学习笔记,仅用于自我记录。
正文
在一般情况下,一个网站的首页大致如下
在上方存在着各种各样的导航标签、链接。而一般情况下网站的导航会用参数进行索引的编写,比如id、page等等
比如上面的链接格式,当用户访问不同页面时id参数值也会跟着变化,比如我让id=2即可更改页面内容
动手编写一个导航页
在phpstorm中打开我们在phpstudy中创建的网站
PS:在phpstudy中创建网站时,最好勾选同步hosts文件。不然如果你定义的域名可能访问不到
数据库的创建
下面是创建数据库表的sql语句,使用方法就是你使用mysql创建一个空的数据库,然后运行这个sql文件即可
/* Navicat Premium Data Transfer Source Server : localhost_mysql8.0 Source Server Type : MySQL Source Server Version : 80012 (8.0.12) Source Host : localhost:3306 Source Schema : wushiyiwuzhong_com Target Server Type : MySQL Target Server Version : 80012 (8.0.12) File Encoding : 65001 Date: 07/11/2023 14:37:06 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for products -- ---------------------------- DROP TABLE IF EXISTS `products`; CREATE TABLE `products` ( `id` int(11) NOT NULL AUTO_INCREMENT, `product_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `product_description` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL, `product_price` decimal(10, 2) NOT NULL, `sales_volume` int(11) NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = MyISAM AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of products -- ---------------------------- INSERT INTO `products` VALUES (1, 'IDEA', 'IDEA是一款好用的Java开发工具', 999.00, 1000); INSERT INTO `products` VALUES (2, 'Pycharm', 'Pycharm在开发python这方面非常的好用', 999.00, 1000); INSERT INTO `products` VALUES (3, 'Phpstorm', '一款大家都在用的php开发工具', 999.00, 1000); SET FOREIGN_KEY_CHECKS = 1;
sql解释
- id: 主键,自动递增的整数,用于唯一标识每个产品。
- product_name: 产品名称,最大长度为255个字符,不能为空。
- product_description: 产品具体介绍,使用TEXT类型存储。
- product_price: 产品价格,使用DECIMAL类型存储,保留2位小数,不能为空。
- sales_volume: 销量,整数类型。
运行完该sql文件后库的表结构如下
编写数据库的连接配置文件
创建一个config文件夹,然后在config文件夹里创建一个conn.php数据库连接文件
<?php // 数据库连接信息 $servername = "localhost"; // 数据库服务器地址 $username = "root"; // 数据库用户名 $password = "root"; // 数据库密码 $dbname = "wushiyiwuzhong_com"; // 数据库名称 // 创建数据库连接 $conn = new mysqli($servername, $username, $password, $dbname);
如下:
html页面的编写
我这里没有用小迪的原始页面,美化了一下
html部分
在phpstorm中创建一个index.php,在里面写入下面的代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Head</title> <link rel="stylesheet" href="index.css"> </head> <body> <div class="header"> <a href="index.html" class="logo"> <h1>wushiyiwuzhong</h1> </a> <nav class="navbar"> <ul> <li><a href="#">首页</a></li> <li><a href="#">公司介绍</a></li> <li><a href="#">产品</a> <ul class="hide"> <li><a href="#">IDEA</a></li> <li><a href="#">Pycharm</a></li> <li><a href="#">Phpstorm</a></li> </ul> </li> </li> <li><a href="#">开源社区</a></li> <li><a href="#">后台管理</a></li> </ul> </nav> </div> <div class="content"> </div> </body> </html> <?php //操作数据库讲数据取出进行展示 include("config/conn.php"); $i=$_GET['id'];//GET请求接受id参数名值给变量i $sql="select * from products where id=$i"; $result=$conn->query($sql); if ($result->num_rows > 0) { // 输出数据 echo "<table border='1'>"; echo "<tr><th>ID</th><th>产品名称</th><th>产品介绍</th><th>产品价格</th><th>销量</th></tr>"; while ($row = $result->fetch_assoc()) { echo "<tr>"; echo "<td>" . $row["id"] . "</td>"; echo "<td>" . $row["product_name"] . "</td>"; echo "<td>" . $row["product_description"] . "</td>"; echo "<td>" . $row["product_price"] . "</td>"; echo "<td>" . $row["sales_volume"] . "</td>"; echo "</tr>"; } echo "</table>"; }
CSS样式部分
为了好看点加个css文件,在phpstorm中创建index.css文件
/* css样式初始化 */ * { font-family: 'Poppins', sans-serif; margin: 0; padding: 0; box-sizing: border-box; outline: none; border: none; text-decoration: none; text-transform: capitalize; transition: .2s linear; } html { font-size: 62.5%; } /* header样式初始化*/ .header { position: fixed; top: 0; left: 0; right: 0; z-index: 1000; background: #3F3D56; display: flex; align-items: center; justify-content: space-between; } .header .logo { color: white; padding: 0 1rem; } /* 导航样式 */ .navbar ul{ display: flex; } .navbar ul li{ font-weight: bold; width: 128px; list-style: none; text-align:center; } .navbar ul li a { width: 128px; line-height: 45px; font-size: 1.7rem; color: white; } .navbar ul li a:hover{ color: #009933; } /* 二级菜单样式 */ .navbar ul li ul{ position: absolute; display: none; width: 128px; line-height: 45px; } .navbar ul li ul li{ background-color: #3F3D56; } /* 悬浮展开二级菜单 */ .navbar ul li ul li a:hover{ color: white; } .navbar ul li ul li:hover{ background-color: #009933; } .navbar ul li:hover ul{ display: block; } /* 网站内容*/ .content{ margin-top:50px; }
如下:
将其在浏览器打开,页面如下
接下来我们传入id值获取内容
可以成功获取到了对应的内容,既然id可控,那么我们在id这个参数上尝试着进行sql注入,这里sqlmap直接跑就行了
可以看到sqlmap成功注入了
sql注入原理
这里的代码存在 SQL 注入漏洞的原因是在构建 SQL 查询语句时,直接将用户提供的数据(通过 $_GET['id'])插入到 SQL 查询语句中,而没有进行适当的过滤和转义。导致了
攻击者可以利用这个漏洞通过修改 URL 中的 id 参数来执行恶意的 SQL 代码
本文来自博客园,作者:夜未至,转载请注明原文链接:https://www.cnblogs.com/wushiyiwuzhong/p/17815108.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步