当前位置: 首页 > ai >正文

SQL注入6----(其他注入手法)

一.前言

本章节来介绍一下其他的注入手法,也就是非常规注入手法,来和大家介绍一下

二.加密注入

前端提交的有些数据是加密之后,到了后台在解密,然后再进行数据库查询等相关操作的,那么既然如 此我们也应该将注入语句按照相同的加密方式,加密之后再进行注入,大家如果知道js逆向的话肯定是知道的,如果我们遇到这个情况,那么就得先找到加密方式,再把payload加密后再放进去,当然我前面也有专门逆向的专栏,这里就只是提一嘴了。

三.堆叠注入

Stacked injections(堆叠注入)从名词的含义就可以看到应该是一堆 sql 语句(多条)一起执行。而在真实的 运用中也是这样的, 我们知道在 mysql 中, 主要是命令行中, 每一条语句结尾加; 表示语句结束。这样我们 就想到了是不是可以多句一起使用。这个叫做 stacked injection。

原理:在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构 造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入) 也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型 是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。例如以下这个例子。用户输 入:1; DELETE FROM products服务器端生成的sql语句为: Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删 除。堆叠查询可以执行多条 SQL 语句,语句之间以分号(;)隔开,而堆叠查询注入攻击就是利用此特点, 在第二条语句中构造要执行攻击的语句。但是堆叠查询只能返回第一条查询信息,不返回后面的信息。 因此,堆叠注入第二个语句产生错误或者结果只能被忽略,我们在前端界面是无法看到返回结果的。因 此,在读取数据时,我们建议使用union(联合)注入。同时在使用堆叠注入之前,我们也是需要知道 一些数据库相关信息的,例如表名,列名等信息。

在 mysql 中php的函数里面 mysqli_multi_query 和 mysql_multi_query这两个函数(函数也叫做API) 执行一个或多个针对数据库的查询。多个查询用分号进行分隔。堆叠注入的危害是很大,可以任意使用 增删改查的语句,例如删除数据库 修改数据库,添加数据库用户。但实际情况中,如PHP为了防止sql注 入,往往调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执 行,所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将对数据安全造成重大威胁。

限制:堆叠注入的局限性在于并不是每一个环境下都可以执行,可能受到API或者数据库引擎不支持的限 制,当然了权限不足也可以解释为什么攻击者无法修改数据或者调用一些程序。

mysql中有些API是支持的,sqlserver都支持,oracle不支持。

比如新建表(like类似于复制users表) select * from users where id=1;create table test likeusers;

那么通过注入语句来添加,就可以这样 ?id=1;create table test like users --+

四.二次注入

4.1 原理

这个漏洞基本上黑盒测试是很难发现的,基本都是代码审计出来的,找程序代码中操作数据库中数据的 地方,看一下从数据库中取出的数据是否进行了脏数据过滤。

二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句 所导致的注入。防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插 入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并 执行SQL查询时,就发生了SQL二次注入。

二次注入的原理,以php代码来举例,在第一次进行数据库插入数据的时候,仅仅只是使用了addslashes 或者是借助 get_magic_quotes_gpc 对其中的特殊字符进行了转义,在写入数据库的时候还 是保留了原来的数据,比如单引号数据,虽然直接注入时效了,但是数据写入到了数据库,数据库中存 的这个数据本身还是脏数据。在将数据存入到了数据库中之后,很多开发者都会认为数据是可信的。在 下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行进一步的检验和处理,这样 就会造成SQL的二次注入。比如在第一次插入数据的时候,数据中带有单引号,直接插入到了数据库 中;然后在下一次使用中在拼凑的过程中,就形成了二次注入。

二次注入,可以概括为以下两步:

第一步:插入恶意数据 进行数据库插入数据时,对其中的特殊字符进行了转义处理,在写入数据库的时候又保留了原来的 数据。

第二步:引用恶意数据 开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进 行进一步的检验的处理。

示意图

4.2 测试

那我们用sqli-lab这个靶场环境测试一下

我们找到第24关二次注入进行测试讲解

我们再来看一下这个user表里的信息,发现一个用户叫admin,密码也是admin。

那我们接下来创建一个用户admin‘# 密码123

这就是已经创建好了,我们再登录这个用户进去

现在修改密码成666

成功修改,我们再来看看数据库

发现了admin'#的密码没有修改,但是admin的密码确修改成了666,这就是2次注入。

五.中转注入

把参数中转一下,再发送到指定网址上去,可以对请求携带的数据进行二次加工。

主要是进行加工处理和代理隐藏

后面学习了sqlmap之后,也可以直接将sqlmap的请求都发送到这个脚本上,所以这里就不过多介绍了

六.伪静态注入

首先要明白概念,伪静态,其实就是看似为静态页面,实则为动态页面,就称之为伪静态页面,而伪静 态页面的注入就叫做伪静态注入。

其实关于静态、动态、伪静态,我们直接看url大致就能发现。

动态:

        http://192.168.0.26/pikachu/vul/sqli/sqli_str.php? name=vince&submit=%E6%9F%A5%E8%AF%A2

        https://search.jd.com/search? keyword=%E6%89%8B%E6%9C%BA&wq=%E6%89%8B%E6%9C%BA&ev=5_122671%5E

静态:

        http://127.0.0.1:8000/jxxx/index.html

        http://127.0.0.1:8000/xxx/person.html

伪静态:

        http://127.0.0.1:8000/jaden/1/wei_news.html

        http://127.0.0.1:8000/jaden/news/1.html

        动态访问:http://192.168.61.149/forum.php?mod=viewthread&tid=1&extra=page%3D1

        静态访问:http://192.168.61.149/thread-1-1-1.html

        配置规则:rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;


 

所以我们也可以在伪静态的url里注入,这里就不细致的说了

七.总结

本章节讲了很多其他注入的手法,但大多数都是了解,需要进阶的后续再讲,期待大家的点赞关注加收藏,持续为您更新。

http://www.xdnf.cn/news/19124.html

相关文章:

  • Spring和mybatis整合后事务拦截器TransactionInterceptor开启提交事务流程
  • 音视频学习(六十一):H265中的VPS
  • 本地部署 hello-algo 并实现外部访问
  • 趣味学RUST基础篇(结构体方法)
  • 吴恩达机器学习(四)
  • 在 MyBatis 中oracle基本数值类型的 JDBC 类型映射
  • Linux命令学习:make,make install,modprobe,lsmod
  • 鸿蒙服务端开发资料汇总
  • android adb调试 鸿蒙
  • 119、【OS】【Nuttx】【周边】效果呈现方案解析:变量展开
  • 计算机三级嵌入式填空题——真题库(26)原题附答案速记
  • components.d.ts声明组件类型的作用
  • RabbitMQ 和 Kafka
  • github同一台电脑支持两个或以上的ssh账户(macos或Linux系统),解决Key is already in use问题
  • 苍穹外卖Day7 | 缓存商品、购物车、SpringCache、缓存雪崩、缓存套餐
  • DVWA靶场通关笔记-CSRF(Impossible级别)
  • VMware 设置 Ubuntu 虚拟机桥接模式完整教程
  • Java进阶教程之多线程与并发编程
  • 33. 包装类型是什么?基本类型和包装类型有什么区别?
  • 深入解析 Java interrupt
  • 从零开始部署 Kubernetes Dashboard:可视化管理你的集群
  • 不惧和谐,永不失效!!
  • 高并发内存池(19)-用基数树优化
  • JavaScript事件
  • FastAPI 入门科普:下一代高性能 Python Web 框架
  • 顶点 (VS)vs 片段(FS):OpenGL纹理滚动着色器的性能博弈与设计哲学
  • Shader开发(十八)实现纹理滚动效果
  • 【基础知识】互斥锁、读写锁、自旋锁的区别
  • 控制系统仿真之PID校正-PID校正(八)
  • 动手实现多元线性回归