1. SQL注入原理
0x00 SQL注入漏洞注入与防御
SQL注入漏洞
漏洞描述:
Web程序代码中对于用户提交的参数未做过滤就直接放到SQL语句中执行,导致参数中的特殊字符打破了SQL语句原有逻辑,黑客可以利用该漏洞执行任意SQL语句,如查询数据、下载数据、写入webshell、执行系统命令以及绕过登录限制等。
测试方法:
在发现有可控参数的地方使用sqlmap进行SQL注入的检查或者利用,也可以使用其他的SQL注入工具,简单点的可以手工测试,利用 **单引号**
、 ** and 1 = 1**
** **和 **and 1 = 2**
以及字符型注入进行判断。
推荐使用burpsuite的SQLMap插件,这样可以很方便,鼠标右键就可以将数据包直接发送到sqlmap里面进行检测了!
修复建议:
代码层最佳防御sql漏洞方案:采用sql语句预编译和绑定变量,是防御sql 注入的最佳方法。
- 所有的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。当前几乎所有的数据库系统都提供了参数化SQL 语句执行接口,使用此接口可以非常有效的防止SQL注入攻击。
- 对进入数据库的特殊字符( ' <>&*; 等)进行转义处理,或编码转换。
- 确认每种数据的类型,比如数字型的数据就必须是数字,数据库中的存储字段必须对应为int型。
- 数据长度应该严格规定,能在一定程度上防止比较长的SQL 注入语句无法正确执行。
- 网站每个数据层的编码统一,建议全部使用UTF-8 编码,上下层编码不一致有可能导致一些过滤模型被绕过。
- 严格限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害。
- 避免网站显示SQL 错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。
利用BurpSuite与SQLMapper检测:
- 安装CO2:
在burp中的【Extender】-->【BApp Store】-->【COS】-->install
- 配置SQLMapper:
- 使用SQLMapper:
将数据包发送至:SQLMapper:
然后点击【Run】后,会在cmd中直接跑出结果:
boolean-based blind --基于布尔型的盲注
error-based -- 报错型注入
time-base blind -- 基于时间延迟注入
UNION query -- 可联合查询注入
0x01 与MySQL注入的相关知识
在MySQL5.0版本以后MySQL数据库中会默认存放一个**information_schema**
的数据库,在该数据库中,我们需要记住三个表名,分别是schemata,tables,columns。
**schemata**
表字段**schema_name **
记录着数据库的库名;**tables**
表字段**table_schema **
和**table_nmae **
分别记录着数据库中的库名和表名;**columns **
表字段**table_schema **
和**table_name **
以及**columns_name **
分别记录着数据库的库名、表名、字段名;
- 首先查询数据库:
- 根据数据库查询表格:
- 根据表格查询字段:
0x02 SQL注入原理
产生条件:
SQL注入漏洞的产生需要满足以下两个条件:
- 参数用户可控:从前端传给后端的参数内容是用户可以控制的;
- 参数带入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询。
当用户传入参数为 1' 的时候,在数据库执行如下所示:
此SQL 语句不符合语法规则就会报错;如下:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' LIMIT 0, 25' at line 1
当用户传入的参数为:1 and 1=1
时:
因为1=1
为 TRUE ,id=1
为 TRUE ,and 两边同时为 TRUE ;所以页面会返回id=1的结果;
若用户传入的参数为:1 and 1=2
时:
因为 1=2 为 FALSE , id=1 为 TRUE ,and 两边有一个为 FALSE ,故页面返回与 id=1 不一样的结果。
由此可以初步判断存在SQL 注入漏洞,攻击者可以进一步拼接SQL 攻击语句,进行攻击,致使信息泄露,甚至获取服务器权限。
判断是否存在注入
回显是指:页面有数据,信息返回
无回显是指: 根据输入的语句,页面无任何变化,或没有数据库中的内容显示到网页中。
SQL语句的注释符:
-
单行注释 注意与url中的#区分,常编码为:%23
- --空格 单行注释 注意为:短线短线空格
- /()/ 多行注释 至少存在两处的注入 /**/ 常用来作为空格
注入流程:
- 是否存在注入并且判断注入类型
- 判断字段数 order by
- 确定回显点 union select 1,2
- 查询数据库信息 @@version @@datadir
- 查询用户名,数据库名 user(),database()
- 文件读取 union select 1,load_file()
- 写入shell select...into outfile...
补充:使用sql注入遇到转义字符串的单引号或双引号,可使用HEX编码绕过
0x03 SQL注入类型区分 SQL注入的流程 手工注入演示
SQL注入分类:
SQL 注入分类:按SQLMap 中的分类来看,SQL 注入类型有以下5 种:
- UNION query SQL injection(可联合查询注入)
- Stacked queries SQL injection(可多语句查询注入)堆叠查询
- Boolean-based blind SQL injection(布尔型注入)
- Error-based SQL injection(报错型注入)
- Time-based blind SQL injection(基于时间延迟注入)
接受请求类型的区分
- GET注入
GET请求的参数时放在URL中的,GET请求的URL传参有长度限制 中文需要URL编码
- POST注入
- COOKIE注入
cookie参数是放在请求头信息中,提交的时候 服务器会从请求头获取
注入数据类型的区分
- int整型
- string字符型
- like 搜索型
SQL 注入常规利用思路
- 寻找注入点,可通过web扫描工具实现;
- 通过注入点,尝试获得关于连接数据库用户名、数据库名称、连接数据库用户权限、操作系统信息、数据库版本等相关信息;
- 猜解关键数据库表及其重要字段与内容(常见如:存放管理员账户的表名、字段名等信息);
- 还可获取数据库的root账号 密码--思路;
- 还可以通过获取的用户信息,寻找后台登录;
- 利用后台或了解的进一步信息。
手工注入常规思路
- 判断是否存在注入,注入的类型,字符型还是数字型;
- 猜解SQL查询语句中的字段数,order by N;
- 确定显示的字段顺序;
- 获取当前数据库;
- 获取数据库中的表;
- 获取表中的字段名;
- 查询到账户的数据。
SQL注入 详细注入过程
- 判断存在注入:
- 猜解字段数:利用order by 或者 group by;
- 利用union查询,判断其回显点:
- 获取相关信息:
- user:
- database:
- version:
- 查询当前数据库下的表名:
group_concat()
的作用是:将group by产生的同一个分组中的值连接起来,返回一个字符串结果;
由于该处的回显点,为一处;因此可采用 group_concat()
函数将其值连接起来;
- 查询表的字段名称:
- 获取用户数据
__EOF__

本文链接:https://www.cnblogs.com/LeopoId/p/16181201.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本