[NSSCTF 2nd]php签到 详细题解

知识点:

linux文件后缀名绕过

表单文件上传

pathinfo 函数    file_put_contents()函数

命令执行

代码审计:

 <?phpfunction waf($filename){$black_list = array("ph", "htaccess", "ini");$ext = pathinfo($filename, PATHINFO_EXTENSION);foreach ($black_list as $value) {if (stristr($ext, $value)){return false;}}return true;
}if(isset($_FILES['file'])){$filename = urldecode($_FILES['file']['name']);$content = file_get_contents($_FILES['file']['tmp_name']);if(waf($filename)){file_put_contents($filename, $content);} else {echo "Please re-upload";}
} else{highlight_file(__FILE__);
} 

页面直接给出了源码,waf()函数作用是对上传文件进行过滤,等下再说,先看主要代码

由$_FILES['file'] 可以判断是要上传文件,但是页面没有给出上传文件的选项,因此需要手动上传表单文件

$_FILES['file']['name'] 就是上传的文件名信息,会先被url解码然后赋值给$filename

$_FILES['file']['tmp_name'] 是上传的文件的临时存储路径信息,例如 /var/www/html/1.php

$content 会读取上传的文件里面的内容  如果$filename满足waf()函数要求,就把$content内容 写入文件$filename


可以考虑传入一句话木马然后蚁剑连接查看后台  或者直接命令执行,但是关键是先绕过函数对文件名限制

观察waf()函数,黑名单中是 ph htaccess ini

pathinfo 函数用于获取文件路径的信息,包括目录名,文件名,扩展名等

PATHINFO_EXTENSION 用于获取文件的扩展名部分

使用 PATHINFO_EXTENSION 时,pathinfo 函数会返回文件名中的最后一个点之后的部分

所以当传入例如 1.php. 的文件时,结果就是空字符串,因为最后一个点后面没有数据,可以利用这一点绕过

但是题目环境是Apache/2.4.25 (Debian)

在Linux系统下1.php.是一个合法的文件名,系统不会像windows系统自动把最后的点去掉然后把文件当成php文件执行,虽然可以绕过waf()函数,但是不会被当作php文件执行,所以点绕过在这里是不可行的

如果把1.php. 换成 1.php/.  也可以绕过waf()函数,然后经过file_put_contents()函数会被解析为1.php,即可完成绕过上传

验证结论:

因为题目是linux环境,所以在kali中创建一个php代码

运行之后看到确实创建了一个1.php的文件

上传文件:

绕过原理就是这样,下面只需要上传文件,使用代码上传文件,先测试一下phpinfo()页面,观察是否可行

windows下不支持/作为文件名的一部分,所以需要进行url编码把 / 编码为%2f 

刚好代码里会对文件名进行url解码,也算是一个小提示

import requests
url = 'http://node5.anna.nssctf.cn:28714/'  # 上传文件地址
file_content = "<?php phpinfo(); ?>"
files = {'file': ('2.php%2f.', file_content)} 
response = requests.post(url=url, files=files)
print(response.text)

访问2.php     搜索关键词flag得到flag

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《CUDA编程》11.CUDA流

本章将介绍CUDA流 CUDA程序的并行层次主要有两个&#xff1a;一个是核函数内部的并行&#xff0c;一个是核函数外部的并行&#xff0c;核函数外部的并行主要指&#xff1a; 核函数计算与数据传输之间的并行主机计算与数据传输之间的并行不同数据传输之间的并行核函数计算与主机…

操作系统期末|考研复习知识点汇总 - 持续更新

本文将根据个人学习进度对b站王道408课程以及题目考察的知识点进行整合&#xff0c;视频中详细的导图将会直接复用&#xff0c;并且将会对一些重点知识进行扩展以及一些思维导图的补充&#xff0c;(目前第三章内容正在整理中……由于第三章内容繁多且都是重点&#xff0c;习题量…

.NET Core WebApi第3讲:第一个WebApi项目、WebApi开发三种模型

一、.NEt Core 1、运行模板项目 1&#xff09;仍然有controllers&#xff0c;说明WebApi是基于MVC模式的&#xff0c;只是对比之下这里没有MVC中的views。 因为WebApi只会向前台发送数据&#xff0c;不会向前台发送HTML页面。 2、验证模板项目的api 1&#xff09;法1&#xf…

微服务之间调用,OpenFeign传递用户(RequestInterceptor接口)

场景&#xff1a;微服务之黑马商城项目-登录拦截器在网关完成用户的校验&#xff0c;并将用户信息&#xff08;用户id&#xff09;存入请求头&#xff0c;假设将购物车里面的商品进行结算就会生成订单并清空购物车&#xff0c;这里涉及到了交易服务模块远程调用购物车模块&…

单细胞数据分析(一):10X数据生成seurat数据对象

文章目录 介绍加载R包数据链接导入数据过滤细胞:移除双重细胞合并所有seurat数据对象输出结果系统信息介绍 在单细胞基因组学研究中,Seurat是一个流行的R包,用于单细胞基因表达数据的分析和探索。以下是如何从10X基因注释数据生成Seurat数据对象,并对该数据进行过滤的步骤…

RHCE的学习(8)

动态网站 lnmp&#xff08;LAMP&#xff09; 解析index.php界面 &#xff08;1&#xff09;预配&#xff0c;确保服务能够被访问 systemctl stop firewalld setenforce 0 &#xff08;2&#xff09;安装nginx服务 mount /dev/sr0 /mnt cat /etc/yum.repos.d/base.repo dnf …

NVR设备ONVIF接入平台EasyCVR视频融合平台智慧小区视频监控系统建设方案

一、方案背景 智慧小区构成了“平安城市”建设的基石。随着社会的进步&#xff0c;社区安全问题逐渐成为公众关注的热点。诸如高空抛物、乱丢垃圾、破坏车辆、入室盗窃等不文明行为和违法行为频繁出现。目前&#xff0c;许多小区的物业管理和安全防护系统仍然较为简单和陈旧&a…

UML总结

零&#xff1a;学习链接 UML_哔哩哔哩_bilibili 一&#xff1a;UML概述 二&#xff1a;类图 类图&#xff08;Class Diagram&#xff09;是统一建模语言&#xff08;UML&#xff09;中一种重要的图形表示&#xff0c;用于描述系统中的类及其之间的关系。它是面向对象设计中常…

软件已死,数据永生?

大数据产业创新服务媒体 ——聚焦数据 改变商业 你有没有注意到&#xff0c;你的生活正在被数据所支配&#xff1f; 我们看似在掌控自己的每一次点击、每一次搜索、每一个消费选择&#xff0c;但实际上&#xff0c;背后隐藏着庞大的数据网络。每一个点赞、每一次搜索&#xff…

Java非对称加密:RSA 数据加密与解密、数字签名与验签

Java常用的加密与解密系列文章: 《Java编码方式:Base64 编码与解码》 《Java消息摘要:MD5 验证数据完整性、密码的加密》 《Java消息摘要:SHA 验证数据完整性、密码的加密》 《Java对称加密:DES、3DES 数据加密标准》 《Java对称加密:AES 高级加密标准》 《Java非对称加密…

Hopfield网络

Hopfield网络是由John Hopfield在1982年提出的一种递归神经网络&#xff0c;它在模式识别和记忆存储方面有着重要的应用。这种网络模型基于能量函数&#xff0c;通过迭代更新神经元的状态&#xff0c;最终达到能量的稳定状态&#xff0c;即网络的吸引子状态。以下是Hopfield网络…

java质数的判断 C语言指针变量的使用

1. public static void main(String[] args) {Scanner scnew Scanner(System.in);System.out.println("请输入一个值");int num sc.nextInt();boolean flagtrue;for (int i2;i<num;i){if (num%i0){flagfalse;break;}}if (flag){System.out.println(num"是一…

FreeIPCC:呼叫中心客服系统是什么

呼叫中心客服系统是什么 作者&#xff1a;开源呼叫中心系统 FreeIPCC 呼叫中心客服系统是现代企业与客户沟通的重要桥梁&#xff0c;它集成了电话、互联网和移动通信技术&#xff0c;为企业提供了一个集中处理客户咨询、投诉、订单处理等服务的平台。以下是对呼叫中心客服系统…

深度学习:权重参数相关知识(深度学习入门:基于Python的理论与实现 (斋藤康毅)))

在神经网络的学习中&#xff0c;权重的初始值特别重要&#xff0c;经常关系到神经网络的学习能否成功。 第一点&#xff0c;权重初始值不能设置为0&#xff0c;严格说权重初始值不能设为同样的值&#xff0c;是因为在误差反向传播法中&#xff0c;所有权重值都会进行相同的更新…

数据库设计与范式及其应用

数据库设计是数据库管理系统&#xff08;DBMS&#xff09;中的核心环节&#xff0c;良好的数据库设计不仅可以提高数据存取的效率&#xff0c;还能增强数据的可维护性和一致性。范式&#xff08;Normalization&#xff09;是一种设计原则&#xff0c;用于减少数据冗余和提高数据…

云联网对等连接--实现内网互通

云联网 今天给大家介绍一款产品&#xff0c;腾讯云的云联网。 云联网&#xff1a;为您提供云上私有网络间&#xff08;VPC&#xff09;、VPC 与本地数据中心间&#xff08;IDC&#xff09;内网互联的服务&#xff0c;具备全网多点互联、路由自学习、链路选优及故障快速收敛等…

Android NSD局域网发现服务

近期在了解局域网发现服务的时候无意间看到Android 自带的&#xff08;Network Service Discovery&#xff09;网络发现服务&#xff0c;在一番验证之后发现实现比较简单&#xff0c;可靠性也高&#xff0c;因此在这里做一个整理&#xff0c;算是对自己知识做一个归档。 网络服…

采用指针作为函数参数

在main.cpp里输入程序如下&#xff1a; #include <iostream> //使能cin(),cout(); #include <iomanip> //使能setbase(),setfill(),setw(), //setprecision(),setiosflags()和resetiosflags(); using namespace std; //告诉编译器使用std标准程序库; void…

C++函数的属性

C函数的属性 1. inline2. constexpr3. noexcept4. virtual5. override 与 final6. declspec 和 attribute7. template总结 在 C 中&#xff0c;函数的属性是指可以为函数提供额外信息或指示编译器如何处理该函数的特性。这些属性可以影响函数的行为、优化、链接等。以下是一些常…

kali——tcpdump的使用

目录 前言 使用方法 监听指定网卡 将抓取的数据包保存到指定文件 读取数据包 前言 定义&#xff1a;tcpdump 是 Linux 系统下的一个强大的命令行式数据包嗅探工具&#xff0c;它能够实时捕获网络接口上的数据包&#xff0c;并将这些数据包的头部信息或完整内容显示出来或保…