首先了解一下题目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;
})
看不懂的东西先百度!
下一个问题,WAF是什么?
Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。
详情可以了解一下这篇文章,Web应用防火墙WAF简介。
首先上图的代码可以看出来是一个jsp代码
encodeURIComponent() 函数通过将一个,两个,三个或四个表示字符的 UTF-8 编码的转义序列替换某些字符的每个实例来编码 URI(对于由两个“代理”字符组成的字符而言,将仅是四个转义序列)。
JavaScript中val有两种用法,分别是:1、用于返回第一个匹配元素的value属性值,
语法为“$(selector).val()”;2、用于设置所有匹配元素的value属性值,
语法为“$(selector).val(value)”。
好像没有什么了,而后又在代码之中发现了calc.php
,应该是个文本,访问一下!
这个很明显的看出来是一个php代码
error_reporting(0)可以屏蔽任何错误,包括Fatal error,
isset() 函数用于检测变量是否已设置并且非 NULL。
show_source() 函数对文件进行语法高亮显示。
本函数是 highlight_file() 的别名。
foreach 循环用于遍历数组。
在PHP中,“foreach as”是一个循环语句,用于遍历数组,语法为“foreach($array as $value){要执行代码;}”,
每进行一次循环,当前数组元素的值就会被赋值给$value变量。
这里可用php中foreach as是什么意思这篇博客进行,进行参考。
preg_match() 按指定的正则表达式,在给定的字符串进行搜索,匹配到符合特征的部分取出
木有了,好像前面看的也…没啥用!
显示存在num参数,传参进行尝试,经过尝试发现,仅可传输数和运算符号。否则就会403
。
这牵扯到一个新的知识点php的解析规则
,利用PHP的字符串解析特性Bypass,这篇文章有很多方面的内容我还理解不了。
就这个题而言的话就是在num前加个空格绕过,? num=phpinfo()
…分隔线
…
scandir()
函数返回指定目录中的文件和目录的数组。
scandir(/)
相当于ls /
var_dump()
相当于echo
接下来读取有哪些目录? num=var_dump(scandir(chr(47)))
相当于? num=system(ls /)
。
由于单引号被过滤了,用chr()绕过(php chr函数用于从指定的ASCII值返回字符),chr(47)=" / "。
例如 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