LitCTF2024赛后web复现

复现要求:看wp做一遍,自己做一遍,第二天再做一遍。(一眼看出来就跳过)

目录

[[LitCTF 2024]浏览器也能套娃?](#[LitCTF 2024]浏览器也能套娃?)

[[LitCTF 2024]一个....池子?](#[LitCTF 2024]一个....池子?)

[[LitCTF 2024]高亮主题(划掉)背景查看器](#[LitCTF 2024]高亮主题(划掉)背景查看器)

[[LitCTF 2024]百万美元的诱惑](#[LitCTF 2024]百万美元的诱惑)

[[LitCTF 2024]SAS - Serializing Authentication](#[LitCTF 2024]SAS - Serializing Authentication)

[[LitCTF 2024]exx](#[LitCTF 2024]exx)


[LitCTF 2024]浏览器也能套娃?

类型:ssrf、http协议

尝试输入http://127.0.0.1发现跳出一个相同页面,输入http://www.baidu.com发现跳转到了百度页面,这里我们可以想到可能是ssrf漏洞

直接用file伪协议

file伪协议:允许直接访问本地文件系统

file:///path/file

复制代码
输入file:///etc/passwd尝试发现有回显

既然有/etc/passwd这个目录存在且里面也没有发现flag的相关信息,尝试查看一下/flag目录存在不存在,直接得到flag。

file:///flag

[LitCTF 2024]一个....池子?

类型:SSTI、Flask(Jinja2)

看到这个页面会联想到的漏洞可能是xss也可能ssti,用xss弹cookie发现没有弹出flag先不考虑先用ssti。

输入{{7*7}},回显49说明存在ssti漏洞

输入{{"".class}}发现回显成功不存在过滤

{{"".class.base.subclasses()[137].init.globals['builtins']['eval']("import('os').popen('ls /').read()")}}

{{"".class.base.subclasses()[137].init.globals['builtins']['eval']("import('os').popen('cat /flag').read()")}}

[LitCTF 2024]高亮主题(划掉)背景查看器

类型:文件包含、目录穿越

进入后看到一段php代码且是文件包含漏洞演示

先根据页面里代码提示的在url里用?url=/ect/passwd尝试看看有没有回显结果发现一直在加载中说明url里不存在漏洞

用hackbar打开post传参一下theme=/etc/passwd发现有报错信息不能打开这个文件且现在的路径是themes//etc/p说明当前页面的路径是themes,可能存在漏洞

用目录穿越继续测试../etc/passwd发现还在themes路径下

../../etc/passwd发现成功穿越到var/www路径下

此时尝试../../flag发现没有这个文件那就继续穿越(正常有/etc/passwd的路径下才可能有flag)

试了半天没动静感觉可能hackbar有问题用bp抓包弄弄(之前也有出现过就无语)

也是成功回显,这时候再改成flag试试

成功得到flag

[LitCTF 2024]百万美元的诱惑

类型:无字母RCE、无数RCE、PHP

代码审计

is_numeric()函数:用于检查传入函数中作为参数的变量是数字还是数字字符串,该函数返回一个布尔值

扩展:

type_digit() 和 is_numeric() 都可以 "判断变量是否为数字"。

type_digit() :只有在字符串中全是「数字」才会返回 true ,整型、浮点型、甚至包含正负符号的值都返回 false。

is_numeric() :对整型、浮点型、以及包含正负符号的值都返回 true 。

由于is_numeric()前有一个!说明逻辑取反,变量c不是数字但是变量c的大小要大于2024所以用2025e即可绕过

完整payload:

?a[]=1&b[]=2&c=2025e

得到一个php文件

访问得到新的php代码

flag在12.php里,通过rce得到,只需要x=12即可得到,但是需要绕过正则。

这里想不到12需要怎么构造来绕过查了一波资料

在Linux中,可以使用$(())进行数学运算,$(())是空运算,默认值是0。

$((3*4))=12

由于这里数字全被禁用了所以我们需要进一步构造

((\~(())))=-1

(())内部数学表达式的结果为(())=0,按位取反后的结果是 -1。

继续

((\~(())))((\~(())))=-1-1=-2

((\~((((\~(())))((\~(())))((\~(())))))))=-(-3+1)=2

构造payload:

dollar.php?x=((\~((((\~(())))((\~(())))((\~(())))((\~(())))((\~(())))((\~(())))((\~(())))((\~(())))((\~(())))((\~(())))((\~(())))((\~(())))((\~(())))))))

打开后是个空白界面根据之前做题经验查看源代码得到flag

[LitCTF 2024]SAS - Serializing Authentication

类型:PHP反序列化

根据代码直接username=admin,password=secure_password且需要base64_encode加密

输入直接得到flag

[LitCTF 2024]exx

类型:XXE、PHP

看到登入界面我们先输个常规的admin 123456进去试试

发现在上面有回显登入失败

接着测试一下有没有sql注入,ssti注入和xss发现都不存在

打开源代码查看(另一种思路则是用bp打开fuzz得到回显)

发现一串代码(且从代码可以看出是关于用户名提交和密码提交),请求包的格式是xml,有一个php文件打开是一个报错页面

看到了DOMDocument::loadXML字样,再根据题目名称和登录请求包格式(XML格式),推测是考察XXE那一块。

DOCTYPE用于定义xml文件中实体内容

DOCTYPE声明

**内部声明DTD**

<!DOCTYPE 根元素 [元素声明]>

**引用外部DTD**

<!DOCTYPE 根元素 SYSTEM "文件名">
DOCTYPE内部实体分类

**引用内部实体**

<!ENTITY 实体名称 "实体的值">

**引用外部实体**

<!ENTITY 实体名称 SYSTEM "URL">

或者:

<!ENTITY 实体名称 PUBLIC "public_ID" "URL">

实体必须在DTD中声明定义才能在其他位置使用

打开bp开始构造payload

先构造内部实体用伪协议查看发现都不可行,可能在外部,构造payload引用外部实体b

正常会先查看/etc/passwd这个目录这边就不放进去了

得到一串base64字符串解密后得到flag

相关推荐
奔跑的web.3 分钟前
TypeScript 全面详解:对象类型的语法规则
开发语言·前端·javascript·typescript·vue
江上月5137 分钟前
JMeter中级指南:从数据提取到断言校验全流程掌握
java·前端·数据库
代码猎人8 分钟前
forEach和map方法有哪些区别
前端
恋猫de小郭9 分钟前
Google DeepMind :RAG 已死,无限上下文是伪命题?RLM 如何用“代码思维”终结 AI 的记忆焦虑
前端·flutter·ai编程
m0_4711996318 分钟前
【小程序】订单数据缓存 以及针对海量库存数据的 懒加载+数据分片 的具体实现方式
前端·vue.js·小程序
编程大师哥19 分钟前
Java web
java·开发语言·前端
A小码哥20 分钟前
Vibe Coding 提示词优化的四个实战策略
前端
Murrays21 分钟前
【React】01 初识 React
前端·javascript·react.js
大喜xi24 分钟前
ReactNative 使用百分比宽度时,aspectRatio 在某些情况下无法正确推断出高度,导致图片高度为 0,从而无法显示
前端
helloCat24 分钟前
你的前端代码应该怎么写
前端·javascript·架构