BUUCTF [NewStarCTF] Week1 WEB NotPHP 详解
NotPHP
<?php
error_reporting(0);
highlight_file(__FILE__);
if(file_get_contents($_GET['data']) == "Welcome to CTF"){
if(md5($_GET['key1']) === md5($_GET['key2']) && $_GET['key1'] !== $_GET['key2']){
if(!is_numeric($_POST['num']) && intval($_POST['num']) == 2077){
echo "Hack Me";
eval("#".$_GET['cmd']);
}else{
die("Number error!");
}
}else{
die("Wrong Key!");
}
}else{
die("Pass it!");
}
php代码审计。
-
第一层要求将参数data所带的字符串为Welcome to CTF。
用data://伪协议传入数据流绕过。
-
第二层要求
md5($_GET['key1']) === md5($_GET['key2']) && $_GET['key1'] !== $_GET['key2']
MD5强比较,那么用数组绕过,md5()函数无法处理数组,如果传入的为数组,会返回NULL。== 弱比较可用科学计数法绕过。参考文章:(65条消息) 浅谈PHP中哈希比较缺陷问题及哈希强比较相关问题_末初mochu7的博客-CSDN博客
-
第三层
!is_numeric($_POST['num']) && intval($_POST['num']) == 2077
is_numeric()判断是不是数字或数字字符串,intval() 函数用于获取变量的整数值,可以使用2077a,2077%00,2077%0a绕过
-
第四层
eval("#".$_GET['cmd']);
.拼接字符串,#后的被注释了,可以用%0a换行绕过,或者?>闭合。
即可得到flag