笔记32
Abstract: 万能密码,SQL 注入的分类以及简单的 SQL 注入
Table of Contents
安全
搭建好环境后,关机快照,虚拟机不要留下任何关于自己的信息,禁止虚拟机和物理机的连接,虚拟机的主机名随意取,每做完一次渗透后,恢复到初始化快照。
重视:主机名+时间+电量+剪切板
SQL 注入
万能密码
1 | SELECT * FROM `TABLE_NAME` WHERE `username` = 'admin' AND `password`= 'password' |
当用户输入 admin' or 1 #
时,带入上面的语句为:
1 | SELECT * FROM `TABLE_NAME` WHERE `username` = 'admin' or 1 # ' AND `password`='password' |
可以明显看到后面的有关查询密码的句子被注释掉了,前面是个永真条件。即这条 SQL 语句查询的是所有用户名,登录之后只显示一条数据,有可能是第一条也有可能是其他,具体看程序如何解析。
要想只输出一条语句可以用下面语句
1 | #1. 直接把后面全部注释掉 admin' # |
做用户登录功能时,有两种实现思路,一种是像上面这样直接用用户名和密码查询,另一种是
1 | SELECT * FROM `TABLE_NAME` WHERE `username` = 'admin'; |
然后再用 if(查询出来的密码和输入的密码是否相等)
来判断,实现方法不同,具体的注入手段也不同,应具体问题具体分析。
SQL 注入原理介绍
当 Web 应用向后台数据库传递 SQL 语句进行数据库操作时,如果对用户输入的参数没有经过严格的过滤处理,那么攻击者就可以构造特殊 SQL 语句,直接输入数据库引擎执行,获取和修改数据库中的数据。
SQL 注入漏洞本质:把用户输入的数据当做代码来执行,违背了 “数据与代码分离“的原则。
SQL 注入漏洞两个关键条件:
- 用户能控制输入的内容
- Web 应用把用户输入的内容带入到数据库中执行
SQL 注入分类
根据请求不同可以分为:
- GET 请求方式注入
- POST 请求方式注入
- 请求头
根据 SQL 注入点的类型参数分为:
- 整型注入
- 字符型注入
只要有数据提交到数据库中的地方就可能存在注入点
如何区整数型字和字符型
数字-1 判断字符型和数字型
结果不变 → 不是数字型
右边加 ‘ 无数据 无 SQL 错误 → 不一定有注入
右边加 ‘ # 有数据 → 有注入
根据 SQL 注入点的反馈类型可分为:
- 基于错误显示的 SQL 注入
- UNION 类型的 SQL 注入
- 布尔类型的 SQL 注入
- 基于时间的 SQL 注入
- 多语句
- 内联
根据 Web 应用常用的数据库类型分类:
MySQL 数据库注入
SQLServer 数据库注入
Oracle 数据库注入
Access数据库注入
MongoDB 数据库注入
注入方法分类:
- 直接页面看到数据
- UNION SELECT
- 报错
- 一个一个字母判断值
- 布尔盲注
- 时间延时注入
- 内联
- 多语句