BUUCTF刷题_RoarCTF 2019_Easy Calc

Mszr / 2024-07-12 / 原文

个人刷题学习记录,如有错误请多多指教

进入题目如下,猜测是命令注入,输入ls弹框,估计是做了过滤

image

image

查看页面源代码,发现一串代码,但是不怎么看得懂,查看网上大佬的wp进行学习

image

看了别人的解题步骤知道这里有个url,存在calc.php,访问一下看看是啥

image

上面注释里面写了有waf,猜测这里应该是waf的规则,分析一下代码

点击查看代码
<?php  
error_reporting(0);  
if(!isset($_GET['num'])){  
    show_source(__FILE__);  
}else{  
    // get一个参数num  
    $str = $_GET['num'];  
    // 过滤了空格,单双引号,反引号等  
    $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];  
    // 将$blacklist循环遍历去判断  
    foreach ($blacklist as $blackitem) {  
    // 匹配传参里面是否有要过滤的字符,有就die  
        if (preg_match('/' . $blackitem . '/m', $str)) {  
            die("what are you want to do?");  
        }  
    }  
    eval('echo'.$str.';');  
}  
?>

大概意思都弄明白之后,接下来思路就是想办法找flag在哪,本来想着传入ls看看文件有什么,但是显示403,反应过来这里原来只是做个过滤,并不是真正的waf

image

输入1就正常打印,这里只能输入数字,不让输入字母,但是我们需要输入函数去执行得到我们想要的结果,所以就要想办法绕过去使其可以输入字母

image

参考了网上的wp,这里应该是被waf拦截了,那么就想办法绕过waf,这里涉及到一个知识点

PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:
1.删除前后的空白符(空格符,制表符,换行符等统称为空白符)
2.将某些字符转换为下划线(包括空格)

例如下面这张表:

User input Decoded PHP variable name
%20foo_bar%00 foo_bar foo_bar
foo%20bar%00 foo bar foo_bar
foo%5bbar foo[bar foo_bar

假如waf不允许参数输入字母,那么我们可以在参数前面加个空格。

这样waf就找不到num这个变量了,因为现在的变量叫" num",而不是"num"。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。

尝试输入phpinfo(),成功执行

image

那么接下来就是想办法找出flag在哪,这里需要使用几个函数

var_dump:函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构
scandir:列出参数目录中的文件和目录
chr:从不同的 ASCII 值返回字符

http://node5.buuoj.cn:28256/calc.php/? num=var_dump(scandir(chr(47)))

image

找到一个和flag相关的文件

image

flag到手

总结

知识点:
PHP的字符串解析特性
命令注入函数的使用(var_dump,scandir,chr)

参考链接

https://blog.csdn.net/weixin_44077544/article/details/102630714
https://www.cnblogs.com/sfsec/p/15205011.html
https://blog.csdn.net/qq_45521281/article/details/105871192