sql 注⼊原理
我们输⼊的数据,被代⼊到了数据库,当做 sql 语句去执⾏
开发规范
<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);
// take the variables
if(isset($_GET['id'])) //判断⽤户是否通过 get 请求 传⼊了⼀个参数
数据库注释符:语句不会⽣效了
--空格
--+
#
%23
payload:漏洞验证概念
sql注⼊-1(防护)
http://127.0.0.1:8787/user/by-id-safe?id=1
// 基础设置部分(相当于快递单上的默认信息)
DefaultQuery: "id=1", // 默认测试⽤的参数,就像默认快递地址
Path: "/user/by-id-safe", // 接⼝路径,类似银⾏柜台窗⼝名称
Title: "不存在SQL注⼊的情况(数字严格校验)", // 业务标题,像保险箱上的安全标签
// 核⼼处理逻辑(像银⾏柜员处理业务的流程)
Handler: func(writer http.ResponseWriter, request *http.Request) {
// 第⼀步:获取身份证(从URL参数取id)
var a = request.URL.Query().Get("id") // 就像从客户⼿中接过身份证复印件 a=1
// 第⼆步:严格验证身份(确保必须是纯数字)
// 就像银⾏柜员检查身份证是否伪造
i, err := strconv.ParseInt(a, 10, 64) // 10进制,最⼤64位数字
if err != nil { // 如果发现假证件(⾮法参数)
writer.Write([]byte(err.Error())) // 在回执单上写错误原因
writer.WriteHeader(500) // 盖⼀个红⾊的「操作失败」章
return // 终⽌业务办理
}
// 第三步:⾦库取钱(数据库查询)
// ⽤经过验证的保险箱号码(转换后的整数)开保险箱
u, err := s.database.GetUserById(int(i))
if err != nil { // 如果保险箱找不到
writer.Write([]byte(err.Error())) // 在回执单写错误原因
writer.WriteHeader(500) // 盖红⾊失败章
return
}
// 第四步:安全交付(返回查询结果)
sqliWriter(writer, request, []*VulinUser{u}) // ⽤防弹运钞⻋送现⾦
return
},
// 安全评估结果(像安检报告)
RiskDetected: false, // ⾦属探测器没响,说明没带危险品
// 预期检测结果(像安检员的检查清单)
ExpectedResult: map[string]int{"参数:id未检测到闭合边界": 1}, // 预计能拦截1种攻击⽅式
}
sql注⼊-2
http://127.0.0.1:8787/user/id?id=1
1 and 1=0 union select md5(2011-10-12),md5(2011-10-12),md5(2011-10-12),md5(2011-10-
12),md5(2011-10-12),md5(2011-10-12),md5(2011-10-12),md5(2011-10-12),md5(2011-10-12) --
sql注⼊-3
数据格式:
常⻅:user=admin,pass=root
JSON:{"user":"admin","pass":"root"}
http://127.0.0.1:8787/user/id-json?id=%7B%22uid%22%3A1%2C%22id%22%3A%221%22%7D
GET /user/id-json?id={"uid":1,"id":"1 and 1=1"} HTTP/1.1
sql注⼊-4
服务端使⽤什么数据格式类型和编码类型,那么我们在传参的时候也要使⽤相同的类型
http://127.0.0.1:8787/user/id-b64-json?id=eyJ1aWQiOjEsImlkIjoiMSJ9
{"uid":1,"id":"1 and 1=1"}
第13节课作业
1. SQL注入漏洞的原理是什么?
我们输⼊的数据,被代⼊到了数据库,当做 sql 语句去执⾏
2. SQL注入漏洞的危害是什么?
SQL注入漏洞的危害非常严重,主要包括以下几个方面:
1. 数据库信息泄露
攻击者可以通过SQL注入获取数据库中存储的敏感信息,如用户隐私数据、账户密码、信用卡信息等。
2. 数据篡改
攻击者可以修改数据库中的数据,例如更改用户账户余额、订单状态等,导致业务逻辑混乱或经济损失。
3. 网页篡改
通过操作数据库,攻击者可以篡改网站内容,植入恶意链接或虚假信息,损害企业声誉。
4. 网站挂马与恶意软件传播
攻击者可能修改数据库字段,嵌入恶意代码或链接,导致用户访问时感染恶意软件。
5. 数据库服务器被控制
SQL注入可能使攻击者获取数据库管理员权限,进一步操纵数据库甚至操作系统,例如通过`xp_cmdshell`执行系统命令。
6. 服务器被植入后门
攻击者可利用数据库漏洞安装后门程序,长期控制服务器,进行更广泛的攻击。
7. 系统瘫痪与数据破坏
部分数据库支持通过SQL指令操作文件系统,攻击者可能格式化硬盘或删除关键数据,导致业务中断。
8. 绕过身份验证
例如通过注入`' OR '1'='1`等语句,攻击者可绕过登录验证,直接访问系统后台。
3. SQL注入漏洞的利用思路?
寻找注入点,判断数据库类型,构造SQL语句试探,
4. 在一个真实站点,哪些功能点会存在SQL注入漏洞?
所有发生信息交互的地方都会有可能存在漏洞,例如留言板,头像上传,邮箱等
5. 实际操作课堂讲解的yakit sql注入靶场