CTF后门入侵系统(攻防世界)
php://filter的妙用
php://filter是php中特有协议流,"中间流"来处理其他流,就比如可以用:post请求通过base64将php源码编译并输出; localhost:80/index.php?php://filter/write=convert.base64-decode/resource=index.php //输出的文件名 总结: 2. 使用不同的参数可以达到不同的目的和效果; 3. 利用base64获得源码 / 通过读写编码实行绕过操作;
测试题目
<?php $content = <?php exit; ?>; $content .= $_POST[txt]; file_put_contents($_POST[filename], $content);
$content函数使用了"exit"即使写入了一句话木马也会被退出所以尝试绕出; 思路:php://filter进行绕过 1.通过一句话base64encode; 2. convert(兑换) 3. php://filter/read=convert.base64decode进行解码; 4. **Tips:**那么<?php exit;?>这一部分在经过解码后,php不对其解析,而我们想要写入的一句话正好被成功解码。因此得以成功上传webshell。
测试题目二
工控系统后台渗透拿flag题目,也是通过php:filter进行编码输出的;
审计PHP preg_replace() 函数 preg_replace 函数执行一个正则表达式的搜索和替换。 语法: mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int KaTeX parse error: Expected EOF, got & at position 19: …it = -1 [, int &̲count ]] ) 搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换。 参数说明: $pattern: 要搜索的模式,可以是字符串或一个字符串数组。 $replacement: 用于替换的字符串或字符串数组。 $subject: 要搜索替换的目标字符串或字符串数组。 $limit: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)。 $count: 可选,为替换执行的次数。
PHP 的 preg_replace()函数存在一个安全问题:
“/e” 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。提示:要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。
示例:
//访问的url:?pat=/./e&rep=phpinfo()&sub=aa就会触发phpinfo()的执行 ?pat=/./e&rep=phpinfo()&sub=just test 就会触发phpinfo()
//方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试 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(); } }