Abstract: 万能密码,SQL 注入的分类以及简单的 SQL 注入

Table of Contents

  1. 安全
  2. SQL 注入
    1. 万能密码
    2. SQL 注入原理介绍
    3. SQL 注入分类

安全

搭建好环境后,关机快照,虚拟机不要留下任何关于自己的信息,禁止虚拟机和物理机的连接,虚拟机的主机名随意取,每做完一次渗透后,恢复到初始化快照。

重视:主机名+时间+电量+剪切板

SQL 注入

万能密码

1
SELECT * FROM `TABLE_NAME` WHERE `username` = 'admin' AND `password`= 'password'

当用户输入 admin' or 1 # 时,带入上面的语句为:

1
2
3
4
SELECT * FROM `TABLE_NAME` WHERE `username` = 'admin' or 1 # ' AND `password`='password'
#多行结果,需要碰运气,在验证密码时,有一个用户密码是我们输入的密码
SELECT * FROM `TABLE_NAME` WHERE `username` = 'admin' or 1 # ' AND `password`='password'
#一行结果,admin的没用,因为不知道admin密码,验证密码会失败

可以明显看到后面的有关查询密码的句子被注释掉了,前面是个永真条件。即这条 SQL 语句查询的是所有用户名,登录之后只显示一条数据,有可能是第一条也有可能是其他,具体看程序如何解析。

要想只输出一条语句可以用下面语句

1
2
3
4
5
6
#1. 直接把后面全部注释掉   admin' #
SELECT * FROM `TABLE_NAME` WHERE `username` = 'admin' # ' AND `password`='password'
#2. 把or换成and admin' and 1 #
SELECT * FROM `TABLE_NAME` WHERE `username` = 'admin' or 1 # ' AND `password`='password'
#3. 加入limit限制 admin' or 1 limit 0,1 #
SELECT * FROM `TABLE_NAME` WHERE `username` = 'admin' or 1 # ' AND `password`='password'

做用户登录功能时,有两种实现思路,一种是像上面这样直接用用户名和密码查询,另一种是

1
SELECT * FROM `TABLE_NAME` WHERE `username` = 'admin';

然后再用 if(查询出来的密码和输入的密码是否相等) 来判断,实现方法不同,具体的注入手段也不同,应具体问题具体分析。

SQL 注入原理介绍

当 Web 应用向后台数据库传递 SQL 语句进行数据库操作时,如果对用户输入的参数没有经过严格的过滤处理,那么攻击者就可以构造特殊 SQL 语句,直接输入数据库引擎执行,获取和修改数据库中的数据。

SQL 注入漏洞本质:把用户输入的数据当做代码来执行,违背了 “数据与代码分离“的原则。

SQL 注入漏洞两个关键条件

  • 用户能控制输入的内容
  • Web 应用把用户输入的内容带入到数据库中执行

SQL 注入分类

根据请求不同可以分为

  • GET 请求方式注入
  • POST 请求方式注入
  • 请求头

根据 SQL 注入点的类型参数分为

  • 整型注入
  • 字符型注入

只要有数据提交到数据库中的地方就可能存在注入点

如何区整数型字和字符型

  1. 数字-1 判断字符型和数字型

    结果不变 → 不是数字型

  2. 右边加 ‘ 无数据 无 SQL 错误 → 不一定有注入

  3. 右边加 ‘ # 有数据 → 有注入

根据 SQL 注入点的反馈类型可分为

  • 基于错误显示的 SQL 注入
  • UNION 类型的 SQL 注入
  • 布尔类型的 SQL 注入
  • 基于时间的 SQL 注入
  • 多语句
  • 内联

根据 Web 应用常用的数据库类型分类

  • MySQL 数据库注入

  • SQLServer 数据库注入

  • Oracle 数据库注入

  • Access数据库注入

  • MongoDB 数据库注入

注入方法分类

  • 直接页面看到数据
    • UNION SELECT
    • 报错
  • 一个一个字母判断值
    • 布尔盲注
    • 时间延时注入
    • 内联
  • 多语句