首页 > 数据库 >php开发中常见的漏洞点(一) 基础sql注入

php开发中常见的漏洞点(一) 基础sql注入

时间:2023-11-07 15:35:17浏览次数:40  
标签:echo product 漏洞 navbar li ul sql php id

前言

本系列为小迪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 代码

标签:echo,product,漏洞,navbar,li,ul,sql,php,id
From: https://www.cnblogs.com/wushiyiwuzhong/p/17815108.html

相关文章

  • mysql 表级锁之一元数据锁(meta data lock,MDL)
    什么是元数据锁(metadatalock,MDL)在MySQL5.5.3之前,有一个著名的bug#989(bug链接:MySQLBugs:#989:IfDROPTABLEwhilethere’sanactivetransaction,wrongbinlogorder),大致如下:#session1:BEGIN;INSERTINTOt...;COMMIT; #session2:DROPTABLEt; #......
  • mysql测试语句创建写入存储过程调用8.0
    --创建表格 CREATETABLEmy_table(idINTAUTO_INCREMENT,nameVARCHAR(255)CHARACTERSETutf8mb4COLLATEutf8mb4_0900_ai_ci,emailVARCHAR(255)CHARACTERSETutf8mb4COLLATEutf8mb4_0900_ai_ci,passwordVARCHAR(255)CHARACTERSETutf8mb4COLL......
  • 云上的RDS mysql长事务kill时间很长怎么解决
    【问题】实例删除大事务之后,kill时间较长,运行中【建议&注意事项】超大事务执行期间被kill。这时候,回滚操作需要对事务执行期间生成的所有新数据版本做回收操作,这种场景耗时会比较长。建议:1.通过影响系统环境,让这个Killed状态尽快结束。比如:临时调大innodb_thread_concurre......
  • sql server 排序 row_number() over(order by ) as row /
    第一种排序方法:利用row_number()over(orderbycreatetimedesc)asrow参考来源:版权声明:本文为CSDN博主「云游的二狗」的原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/missingshirely/article/details/44037037语法如......
  • 如何使用phpstorm调试php
    以前调试php都是使用dump或者var_dump来进行,非常不方便,现在可以使用phpstorm来进行动态调试,单步跟踪等,可以更快完成任务,环境为本地是win10,ip地址为192.168.0.114服务器使用虚拟机centos7,ip地址为192.168.115.1201.服务器安装xdebug扩展,如果服务器使用了宝......
  • Web_php_include
    常用伪协议用法:1.php伪协议用法:(大小写都可以)php://input,用于执行php代码,需要post请求提交数据。php://filter,用于读取源码,get提交参数。?a=php://filter/read=convert.base64/resource=xxx.php需要开启allow_url_fopen:php://input、php://stdin、php://memory、php://temp不......
  • 如何避免Mysql的timestamp的大坑
    如何避免Mysql的timestamp的大坑Mysql的timestamp类型讨论需要测试MYSQL的同学,可以点以下链接免费试用腾讯云mysql服务器https://curl.qcloud.com/tgnMO3KJ一.时间戳字段定义timestamp时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起到......
  • 生产真实案例:震惊,几条SQL把服务器干崩了,事后还大言不惭!
    大家好,我是冰河~~今天跟大家分享一个发生在今天凌晨的真实案例,这篇文章也是我事后临时写出来的,处理事情的过程有点无语,又有点气愤!事件背景事情的背景是这样的:一个朋友今年年初新开了一家公司,自己是公司的老板,不懂啥技术,主要负责公司的战略规划和经营管理,但是他们公司的很多事情......
  • linux版本mysql安装
    linux版本mysql安装1先检查有没有安装mariadb,有的话将其卸载,不然会和mysql冲突。yumlist|grepmariadbmariadb-libs.x86_641:[email protected]_641:5.5.68-1.el7basem......
  • pgsql多行合并方法,将结果返回为逗号分隔的列表
    --公式STRING_AGG(expression,separator)CREATETABLEemployees(idSERIALPRIMARYKEY,nameVARCHAR(50),departmentVARCHAR(50));INSERTINTOemployees(name,department)VALUES('John','Sales'),('Jan......