Week1——Web
1zflask
- 根据题目描述,查看 robots.txt 发现以下内容。
User-agent: *
Disallow: /s3recttt
import os
import flask
from flask import Flask, request, send_from_directory, send_file
app = Flask(__name__)
@app.route('/api')
def api():
cmd = request.args.get('SSHCTFF', 'ls /')
result = os.popen(cmd).read()
return result
@app.route('/robots.txt')
def static_from_root():
return send_from_directory(app.static_folder,'robots.txt')
@app.route('/s3recttt')
def get_source():
file_path = "app.py"
return send_file(file_path, as_attachment=True)
if __name__ == '__main__':
app.run(debug=True)
- 阅读上述代码,可知通过
/api
路径去用 GET 通过变量 SSHCTFF
传递需要执行的命令,即可获取 flag。
MD5 Master
<?php
highlight_file(__file__);
$master = "MD5 master!";
if(isset($_POST["master1"]) && isset($_POST["master2"])){
if($master.$_POST["master1"] !== $master.$_POST["master2"] && md5($master.$_POST["master1"]) === md5($master.$_POST["master2"])){
echo $master . "<br>";
echo file_get_contents('/flag');
}
}
else{
die("master? <br>");
}
?>
- 很明显,这是一个 MD5 的强类型判断,且前面还拼接了一个特定的字符串。
- 我们可以使用 fastcoll 工具来进行 MD5 的爆破,该工具的爆破是在原字符后接上其他内容,从而使拼接后的字符串的 md5 的值相等。
<?php
function readmyfile($path){
$fh = fopen($path, "rb");
$data = fread($fh, filesize($path));
fclose($fh);
return $data;
}
echo '⼆进制md5加密:'.md5( (readmyfile("1_msg1.txt")));
echo 'url编码:'.urlencode(readmyfile("1_msg1.txt"));
echo '⼆进制md5加密:'.md5( (readmyfile("1_msg2.txt")));
echo 'url编码:'. urlencode(readmyfile("1_msg2.txt"));
?>
ez_gittt
- 一个简单的 git 泄露。
- 可以用 GitHack 工具解决。
jvav
- 该题要求写一个可以执行任意系统命令的 Java 程序。
- 示例代码(如下)
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class ShellExecutor {
public static void main(String[] args) {
try {
// 定义要执行的shell命令
String command = "cat /flag";
// 使用 Runtime.exec() 方法执行命令
Process process = Runtime.getRuntime().exec(command);
// 获取命令的输出流
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
// 读取输出流中的每一行并打印
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
// 关闭流
reader.close();
// 等待命令执行完成
int exitCode = process.waitFor();
System.out.println("Command execution completed with exit code: " + exitCode);
} catch (Exception e) {
e.printStackTrace();
}
}
}
poppopop
<?php
class SH {
public static $Web = false;
public static $SHCTF = false;
}
class C {
public $p;
public function flag()
{
($this->p)();
}
}
class T{
public $n;
public function __destruct()
{
SH::$Web = true;
echo $this->n;
}
}
class F {
public $o;
public function __toString()
{
SH::$SHCTF = true;
$this->o->flag();
return "其实。。。。,";
}
}
class SHCTF {
public $isyou;
public $flag;
public function __invoke()
{
if (SH::$Web) {
($this->isyou)($this->flag);
echo "小丑竟是我自己呜呜呜~";
} else {
echo "小丑别看了!";
}
}
}
if (isset($_GET['data'])) {
highlight_file(__FILE__);
unserialize(base64_decode($_GET['data']));
}
else {
highlight_file(__FILE__);
echo "小丑离我远点!!!";
}
?>
- 首先寻找入口点,这里是
__destruct
方法,在该方法中,最后存在 echo
即可以回显由 __toString
转化的特定内容的字符串。
F
类中的 o
想要调用 flag
函数,所以要将含有 flag
函数的 C
类传给 o
。
- 最终在
flag
函数中调用 SHCTF
类中的 __invoke
魔术方法。
Payload 如下: