This commit is contained in:
k4l0ng
2017-02-20 20:53:20 +08:00
parent 9c44e8cbeb
commit cc4d67560f
9 changed files with 67 additions and 26 deletions

View File

@@ -1,4 +1,7 @@
#LFILocal File Include漏洞 #LFILocal File Include漏洞
[TOC]
##漏洞简介 ##漏洞简介
下面是纯bb了解过的跳过这部分 下面是纯bb了解过的跳过这部分
@@ -31,7 +34,7 @@ include和require区别主要是include在包含的过程中如果出现错
当使用这4个函数包含一个新的文件时该文件将作为PHP代码执行PHP的内核并不会在意被包含的文件是什么类型。即你可以上传一个含shell的txt或jpg文件包含它会被当作PHP代码执行图马 当使用这4个函数包含一个新的文件时该文件将作为PHP代码执行PHP的内核并不会在意被包含的文件是什么类型。即你可以上传一个含shell的txt或jpg文件包含它会被当作PHP代码执行图马
##这个玩意儿与CTF的渊源基础 ##这个玩意儿与CTF的渊源协议基础)
1. `php://`伪协议 >> 访问各个输入/输出流; 1. `php://`伪协议 >> 访问各个输入/输出流;
- php://filter - php://filter
1. 解释php://filter是一种元封装器设计用于"数据流打开"时的"筛选过滤"应用,对本地磁盘文件进行读写。简单来讲就是可以在执行代码前将代码换个方式读取出来,只是读取,`不需要`开启allow\_url_include 1. 解释php://filter是一种元封装器设计用于"数据流打开"时的"筛选过滤"应用,对本地磁盘文件进行读写。简单来讲就是可以在执行代码前将代码换个方式读取出来,只是读取,`不需要`开启allow\_url_include
@@ -44,29 +47,7 @@ include和require区别主要是include在包含的过程中如果出现错
- http://4.chinalover.sinaapp.com/web7/index.php](http://4.chinalover.sinaapp.com/web7/index.php) - http://4.chinalover.sinaapp.com/web7/index.php](http://4.chinalover.sinaapp.com/web7/index.php)
- nctf{edulcni_elif_lacol_si_siht} - nctf{edulcni_elif_lacol_si_siht}
- 练习题目源码文件见filter文件夹 - 练习题目源码文件见filter文件夹
5. Tips上述利用的是encode编码为base64再带出来filter还有decode解密语句可利用场景如下文字摘自phithon博客
- 源码存在eval(xxx)但xxx长度限制为16个字符而且不能用eval或assert怎么执行命令。题目源码文件见tips.php那么利用这个代码怎么拿到webshell
- 利用file_put_contents可以将字符一个个地写入一个文件中大概请求如下
1. file_put_contents的第一个参数是文件名我传入N。PHP会认为N是一个常量但我之前并没有定义这个常量于是PHP就会把它转换成字符串'N'第二个参数是要写入的数据a也被转换成字符串'a'第三个参数是flag当flag=8的时候内容会追加在文件末尾而不是覆盖。
2. 除了file_put_contentserror_log函数效果也类似。
3. 但这个方法有个问题就是file_put_contents第二个参数如果是符号就会导致PHP出错比如`param=$_GET[a](N,<,8);&a=file_put_contents`。但如果要写webshell的话<”等符号又是必不可少的。
4. 于是微博上 @买贴膜的 想出一个办法,每次向文件'N'中写入一个字母或数字最后构成一个base64字符串再包含的时候使用php://filter对base64进行解码即可。
5. 这时候就利用了decode了成功getshell。
6. ```php+HTML
# 每次写入一个字符PD9waHAgZXZhbCgkX1BPU1RbOV0pOw
# 最后包含
param=include$_GET[0];&0=php://filter/read=convert.base64-decode/resource=N
```
- php://input - php://input
@@ -77,7 +58,7 @@ include和require区别主要是include在包含的过程中如果出现错
- 碰到file\_get_contents()就要想到用php://input绕过因为php伪协议也是可以利用http协议的即可以使用POST方式传数据具体函数意义下一项 - 碰到file\_get_contents()就要想到用php://input绕过因为php伪协议也是可以利用http协议的即可以使用POST方式传数据具体函数意义下一项
- http://ctf4.shiyanbar.com/web/9](http://ctf4.shiyanbar.com/web/9) - http://ctf4.shiyanbar.com/web/9](http://ctf4.shiyanbar.com/web/9)
- 并且可以用data伪协议来绕过由于这个题由于存在extract()函数,存在变量覆盖漏洞;直接?flag=1&shiyan=即可; - 并且可以用data伪协议来绕过由于这个题由于存在extract()函数,存在变量覆盖漏洞;直接?flag=1&shiyan=即可;
- 练习题目源码文件见input文件夹 - 练习题目源码文件见input1文件夹;
- 2016华山杯有一道题源码见本地data文件夹这个可以利用data流 - 2016华山杯有一道题源码见本地data文件夹这个可以利用data流
2. `data://`伪协议 >> 数据流封装器和php://相似都是利用了流的概念将原本的include的文件流重定向到了用户可控制的输入流中简单来说就是执行文件的包含方法包含了你的输入流通过你输入payload来实现目的 2. `data://`伪协议 >> 数据流封装器和php://相似都是利用了流的概念将原本的include的文件流重定向到了用户可控制的输入流中简单来说就是执行文件的包含方法包含了你的输入流通过你输入payload来实现目的
- data://text/plain - data://text/plain
@@ -92,7 +73,7 @@ include和require区别主要是include在包含的过程中如果出现错
- 如果php.ini里的allow\_url_include=OnPHP < 5.30,就可以造成任意代码执行同理在这就可以理解成远程文件包含漏洞RFI - 如果php.ini里的allow\_url_include=OnPHP < 5.30,就可以造成任意代码执行同理在这就可以理解成远程文件包含漏洞RFI
4. 例子 4. 例子
- 和php伪协议的input类似碰到file\_get_contents()来用 - 和php伪协议的input类似碰到file\_get_contents()来用
- 练习题目源码文件见data文件夹 - 练习题目源码文件见data文件夹
3. `phar://`伪协议 >> 数据流包装器,自 PHP 5.3.0 起开始有效正好契合上面两个伪协议的利用条件。说通俗点就是php解压缩包的一个函数解压的压缩包与后缀无关。 3. `phar://`伪协议 >> 数据流包装器,自 PHP 5.3.0 起开始有效正好契合上面两个伪协议的利用条件。说通俗点就是php解压缩包的一个函数解压的压缩包与后缀无关。
- phar:// - phar://
@@ -118,6 +99,41 @@ include和require区别主要是include在包含的过程中如果出现错
2. include()就是require,reqiuire_once,include_require这一类include是针对文档的代码结构的。也就是说include进来成了这个文件的其中一部分源代码这类函数就是文件包含漏洞的罪魁祸首。 2. include()就是require,reqiuire_once,include_require这一类include是针对文档的代码结构的。也就是说include进来成了这个文件的其中一部分源代码这类函数就是文件包含漏洞的罪魁祸首。
3. include把导入的字符串当成当前文件的代码结构而file_get_contents只是返回字符串这是两个函数最大的不同。关于字符串执行的问题file_get_contents返回的字符串失去了被执行的能力哪怕字符串里面有<?php ?>一样能拿出来但不执行。而include导入的字符串如果被导入的文件有<?php那就成为php代码的一部分。如果没有<?php只是把它当做源文件<?php ?>外的一部分。 3. include把导入的字符串当成当前文件的代码结构而file_get_contents只是返回字符串这是两个函数最大的不同。关于字符串执行的问题file_get_contents返回的字符串失去了被执行的能力哪怕字符串里面有<?php ?>一样能拿出来但不执行。而include导入的字符串如果被导入的文件有<?php那就成为php代码的一部分。如果没有<?php只是把它当做源文件<?php ?>外的一部分。
## 简单有趣的Web题
1. 本地包含、代码注入:
- 源码文件见:命令执行文件夹
- payloadhttp://localhost/?hello=);echo \`cat flag.php\`;//
- );用来闭合var_dump()方法echo\`command\`;执行命令,//注释。
2. php://input伪协议
- 源码文件见input2文件夹
- payloadhttp://localhost/index.php?path=php://input POST数据<?php echo \`cat flag.php\`;?>
- php://input协议读取POST过来的数据并执行。
## Tips
1. 上述filter伪协议利用的是encode编码为base64再带出来filter还有decode解密语句可利用场景如下文字摘自phithon博客
- 源码存在eval(xxx)但xxx长度限制为16个字符而且不能用eval或assert怎么执行命令。题目源码文件见tips.php那么利用这个代码怎么拿到webshell
- 利用file_put_contents可以将字符一个个地写入一个文件中大概请求如下
- file_put_contents的第一个参数是文件名我传入N。PHP会认为N是一个常量但我之前并没有定义这个常量于是PHP就会把它转换成字符串'N'第二个参数是要写入的数据a也被转换成字符串'a'第三个参数是flag当flag=8的时候内容会追加在文件末尾而不是覆盖。
- 除了file_put_contentserror_log函数效果也类似。
- 但这个方法有个问题就是file_put_contents第二个参数如果是符号就会导致PHP出错比如`param=$_GET[a](N,<,8);&a=file_put_contents`。但如果要写webshell的话<”等符号又是必不可少的。
- 于是微博上 @买贴膜的 想出一个办法,每次向文件'N'中写入一个字母或数字最后构成一个base64字符串再包含的时候使用php://filter对base64进行解码即可。
- 这时候就利用了decode了成功getshell。
- ```php+HTML
# 每次写入一个字符PD9waHAgZXZhbCgkX1BPU1RbOV0pOw
# 最后包含
param=include$_GET[0];&0=php://filter/read=convert.base64-decode/resource=N
```
##参考博文 ##参考博文
1. [http://www.cnblogs.com/LittleHann/p/3665062.html](http://www.cnblogs.com/LittleHann/p/3665062.html) 1. [http://www.cnblogs.com/LittleHann/p/3665062.html](http://www.cnblogs.com/LittleHann/p/3665062.html)
2. [http://www.cnblogs.com/iamstudy/articles/include_file.html](http://www.cnblogs.com/iamstudy/articles/include_file.html) 2. [http://www.cnblogs.com/iamstudy/articles/include_file.html](http://www.cnblogs.com/iamstudy/articles/include_file.html)

3
input2/flag.php Normal file
View File

@@ -0,0 +1,3 @@
<?php
# flag={12312312312}
?>

8
input2/index.php Normal file
View File

@@ -0,0 +1,8 @@
<?php
show_source(__FILE__);
if(isset($_REQUEST['path'])){
include($_REQUEST['path']);
}else{
include('phpinfo.php');
}
?>

3
input2/phpinfo.php Normal file
View File

@@ -0,0 +1,3 @@
<?php
phpinfo();
?>

5
命令执行/flag.php Normal file
View File

@@ -0,0 +1,5 @@
<?php
$flag = 'Too Young Too Simple';
# echo $flag;
# flag{ccd234c9-c022-4ce3-8a62-e56374e3324f};
?>

6
命令执行/index.php Normal file
View File

@@ -0,0 +1,6 @@
<?php
include "flag.php";
$a = @$_REQUEST['hello'];
eval( "var_dump($a);");
show_source(__FILE__);
?>