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 注入的最佳方法。

  1. 所有的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。当前几乎所有的数据库系统都提供了参数化SQL 语句执行接口,使用此接口可以非常有效的防止SQL注入攻击。
  2. 对进入数据库的特殊字符( ' <>&*; 等)进行转义处理,或编码转换。
  3. 确认每种数据的类型,比如数字型的数据就必须是数字,数据库中的存储字段必须对应为int型。
  4. 数据长度应该严格规定,能在一定程度上防止比较长的SQL 注入语句无法正确执行。
  5. 网站每个数据层的编码统一,建议全部使用UTF-8 编码,上下层编码不一致有可能导致一些过滤模型被绕过。
  6. 严格限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害。
  7. 避免网站显示SQL 错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。

利用BurpSuite与SQLMapper检测:

  1. 安装CO2:

在burp中的【Extender】-->【BApp Store】-->【COS】-->install
image.png

  1. 配置SQLMapper:

image.png

  1. 使用SQLMapper:

将数据包发送至:SQLMapper:
image.png
image.png
然后点击【Run】后,会在cmd中直接跑出结果:
image.png
boolean-based blind --基于布尔型的盲注
error-based -- 报错型注入
time-base blind -- 基于时间延迟注入
UNION query -- 可联合查询注入


0x01 与MySQL注入的相关知识

在MySQL5.0版本以后MySQL数据库中会默认存放一个**information_schema**的数据库,在该数据库中,我们需要记住三个表名,分别是schematatablescolumns

  • **schemata**表字段**schema_name **记录着数据库的库名
  • **tables**表字段 **table_schema ****table_nmae **分别记录着数据库中的库名表名;
  • **columns **表字段**table_schema ****table_name **以及 **columns_name **分别记录着数据库的库名表名字段名

  1. 首先查询数据库:

image.png

  1. 根据数据库查询表格:

image.png

  1. 根据表格查询字段:

image.png


0x02 SQL注入原理

产生条件:

SQL注入漏洞的产生需要满足以下两个条件:

  • 参数用户可控:从前端传给后端的参数内容是用户可以控制的;
  • 参数带入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询。

当用户传入参数为 1' 的时候,在数据库执行如下所示:

SELECT * FROM `users` WHERE id=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
image.png
当用户传入的参数为:1 and 1=1 时:

SELECT * FROM `users` WHERE id=1 AND 1=1

因为1=1 为 TRUE ,id=1 为 TRUE ,and 两边同时为 TRUE ;所以页面会返回id=1的结果;
image.png
若用户传入的参数为:1 and 1=2 时:

SELECT * FROM `users` WHERE id=1 AND 1=2

因为 1=2 为 FALSE , id=1 为 TRUE ,and 两边有一个为 FALSE ,故页面返回与 id=1 不一样的结果。
image.png
由此可以初步判断存在SQL 注入漏洞,攻击者可以进一步拼接SQL 攻击语句,进行攻击,致使信息泄露,甚至获取服务器权限。

判断是否存在注入

回显是指:页面有数据,信息返回

id=1 AND 1=1 id=1 AND 1=2 id=1 OR 1=1 id='1' OR '1'='1' id="1" OR "1"="1"

无回显是指: 根据输入的语句,页面无任何变化,或没有数据库中的内容显示到网页中。

SQL语句的注释符:

  1. 单行注释 注意与url中的#区分,常编码为:%23

SELECT * FROM 'user' # test

image.png

  1. --空格 单行注释 注意为:短线短线空格
SELECT * FROM 'user' -- test

image.png

  1. /()/ 多行注释 至少存在两处的注入 /**/ 常用来作为空格
SELECT * FROM `users` /* test */

image.png

注入流程:

  • 是否存在注入并且判断注入类型
  • 判断字段数 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(基于时间延迟注入)

接受请求类型的区分

  1. GET注入

GET请求的参数时放在URL中的,GET请求的URL传参有长度限制 中文需要URL编码
image.png

  1. POST注入

POST请求参数是放在body中的,长度没有限制
image.png

  1. COOKIE注入

cookie参数是放在请求头信息中,提交的时候 服务器会从请求头获取
image.png

注入数据类型的区分

  • int整型
SELECT * FROM 'user' WHERE id=1
  • string字符型
SELECT * FROM 'user' WHERE username='admin'
  • like 搜索型
SELECT * FROM 'news' WHERE title like '%标题%'

SQL 注入常规利用思路

  1. 寻找注入点,可通过web扫描工具实现;
  2. 通过注入点,尝试获得关于连接数据库用户名、数据库名称、连接数据库用户权限、操作系统信息、数据库版本等相关信息;
  3. 猜解关键数据库表及其重要字段与内容(常见如:存放管理员账户的表名、字段名等信息);
    1. 还可获取数据库的root账号 密码--思路;
  4. 还可以通过获取的用户信息,寻找后台登录;
  5. 利用后台或了解的进一步信息。

手工注入常规思路

  1. 判断是否存在注入,注入的类型,字符型还是数字型;
  2. 猜解SQL查询语句中的字段数,order by N;
  3. 确定显示的字段顺序;
  4. 获取当前数据库;
  5. 获取数据库中的表;
  6. 获取表中的字段名;
  7. 查询到账户的数据。

SQL注入 详细注入过程

  1. 判断存在注入:

直接加【'】会报错
image.png
在后面添加注释:【#-->%23】
image.png

  1. 猜解字段数:利用order by 或者 group by;

image.png
image.png
由上可得出,其字段数为:2;

  1. 利用union查询,判断其回显点:

image.png
同样也可使union前的查询条件失败,方可查询后方的语句:
image.png

  1. 获取相关信息:
  • user:

image.png

  • database:

image.png

  • version:

image.png

  1. 查询当前数据库下的表名:

image.png
group_concat() 的作用是:将group by产生的同一个分组中的值连接起来,返回一个字符串结果;
由于该处的回显点,为一处;因此可采用 group_concat() 函数将其值连接起来;

select group_concat(table_name) from information_schema.tables where table_schema=database() // 从information的数据库中的tables表格中,查询table_schema值为当前数据库名的表格名称。 // 实际上就是查询当前数据库中的表名。
  1. 查询表的字段名称:

image.png

select group_concat(column_name) from information_schema.columns where table_name='users' // 从information数据库中的colums表格中,查询table_name值为'users'的值; // 实际上就是查询user表格中的字段
  1. 获取用户数据

image.png


__EOF__

本文作者wh
本文链接https://www.cnblogs.com/LeopoId/p/16181201.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Leopo1d  阅读(282)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示