• [RoarCTF 2019]Easy Calc


    首先了解一下题目Easy Calc的意思:
    在这里插入图片描述
    嗯…没啥用!

    详解

    没有思路之前就先访问一下源代码!可得!

    
    $('#calc').submit(function(){
            $.ajax({
                url:"calc.php?num="+encodeURIComponent($("#content").val()),
                type:'GET',
                success:function(data){
                    $("#result").html(`
    答案:${data}
    `); }, error:function(){ alert("这啥?算不来!"); } }) return false; })
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    看不懂的东西先百度!
    在这里插入图片描述
    下一个问题,WAF是什么?

    Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。

    详情可以了解一下这篇文章,Web应用防火墙WAF简介
    首先上图的代码可以看出来是一个jsp代码

    encodeURIComponent() 函数通过将一个,两个,三个或四个表示字符的 UTF-8 编码的转义序列替换某些字符的每个实例来编码 URI(对于由两个“代理”字符组成的字符而言,将仅是四个转义序列)。
    
    • 1
    JavaScript中val有两种用法,分别是:1、用于返回第一个匹配元素的value属性值,
    语法为“$(selector).val()”;2、用于设置所有匹配元素的value属性值,
    语法为“$(selector).val(value)”。
    
    • 1
    • 2
    • 3

    好像没有什么了,而后又在代码之中发现了calc.php,应该是个文本,访问一下!
    在这里插入图片描述
    这个很明显的看出来是一个php代码

    error_reporting(0)可以屏蔽任何错误,包括Fatal error,
    
    • 1
    isset() 函数用于检测变量是否已设置并且非 NULL
    • 1
    show_source() 函数对文件进行语法高亮显示。
    本函数是 highlight_file() 的别名。
    
    • 1
    • 2
    foreach 循环用于遍历数组。
    在PHP中,“foreach as”是一个循环语句,用于遍历数组,语法为“foreach($array as $value){要执行代码;}”,
    每进行一次循环,当前数组元素的值就会被赋值给$value变量。
    
    • 1
    • 2
    • 3

    这里可用php中foreach as是什么意思这篇博客进行,进行参考。

    preg_match() 按指定的正则表达式,在给定的字符串进行搜索,匹配到符合特征的部分取出
    
    • 1

    木有了,好像前面看的也…没啥用!
    在这里插入图片描述
    显示存在num参数,传参进行尝试,经过尝试发现,仅可传输数和运算符号。否则就会403在这里插入图片描述

    重点

    重点…重点就是我不会了,接下来主要借鉴了这个博客这个

    PHP字符串解析特性绕过WAF

    这牵扯到一个新的知识点php的解析规则利用PHP的字符串解析特性Bypass,这篇文章有很多方面的内容我还理解不了。
    就这个题而言的话就是在num前加个空格绕过? num=phpinfo()
    分隔线

    scandir()列出目录和文件,var_dump()用于输出

    scandir()函数返回指定目录中的文件和目录的数组。
    scandir(/)相当于ls /
    var_dump()相当于echo

    接下来读取有哪些目录? num=var_dump(scandir(chr(47)))相当于? num=system(ls /)
    由于单引号被过滤了,用chr()绕过(php chr函数用于从指定的ASCII值返回字符),chr(47)=" / "。![在这里插入图片描述](https://img-blog.csdnimg.cn/25b9dab2762e435183014003cd8e968b.png

    file_get_contents()读取并输出文件内容

    例如 file_get_contents(/flag.php),读取/flag.php的代码

    找到flag所在文件名,读取文件? num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))含义为file_get_contents(/f1agg)相当于? num=system(cat /f1agg)
    在这里插入图片描述

    分隔线
    这一部分内容基本转载和复现是上面提到的博客:https://blog.csdn.net/weixin_52116519/article/details/124212036

  • 相关阅读:
    基于Java的师生健康体检管理系统设计与实现(源码+lw+部署文档+讲解等)
    java校园共享单车管理系统
    PostgresSQL - 生成uuid
    C# 内存泄漏之 Internal 关键词代表什么?
    CNN经典模型之ALexNet、ResNet、DenseNet总结和比较
    国际经济学名词解释
    VS2017+Qt5.12使用问题笔记
    【sleuth + zipkin 服务链路追踪】
    java设计模式
    网络安全——SQL注入之安全狗bypass深度剖析
  • 原文地址:https://blog.csdn.net/m0_64702918/article/details/126219768