个人刷题学习记录,如有错误请多多指教
进入题目如下,猜测是命令注入,输入ls弹框,估计是做了过滤
查看页面源代码,发现一串代码,但是不怎么看得懂,查看网上大佬的wp进行学习
看了别人的解题步骤知道这里有个url,存在calc.php,访问一下看看是啥
上面注释里面写了有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
输入1就正常打印,这里只能输入数字,不让输入字母,但是我们需要输入函数去执行得到我们想要的结果,所以就要想办法绕过去使其可以输入字母
参考了网上的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(),成功执行
那么接下来就是想办法找出flag在哪,这里需要使用几个函数
var_dump:函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构
scandir:列出参数目录中的文件和目录
chr:从不同的 ASCII 值返回字符
http://node5.buuoj.cn:28256/calc.php/? num=var_dump(scandir(chr(47)))
找到一个和flag相关的文件
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