攻防世界-Web-ics-05

题目信息


知识点:
文件包含漏洞
PHP伪协议中的 php://filter
preg_replace函数引发的命令执行漏洞

解析
打开题目场景以后,只有一个index.php的页面能点开,并且页面没有显示完全,该页面很可疑。
查看源码发现?page=index,出现page这个get参数,联想到可能存在文件包含读源码的漏洞


尝试读取index.php的页面源码,通过php内置协议直接读取代码

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

LFI漏洞的黑盒判断方法:
单纯的从URL判断的话,URL中path、dir、file、pag、page、archive、p、eng、语言文件等相关关键字眼的时候,可能存在文件包含漏洞。

base64解密之后,审计源码,分析得到如下关键部分

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

}

?>

preg_replace函数

函数作用:搜索subject中匹配pattern的部分, 以replacement进行替换。
$pattern: 要搜索的模式,可以是字符串或一个字符串数组。
$replacement: 用于替换的字符串或字符串数组。
$subject: 要搜索替换的目标字符串或字符串数组。

preg_replace函数存在命令执行漏洞
此处明显考察的是preg_replace 函数使用 /e模式,导致代码执行的问题。

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

也就是说,pat和sub有相同部分,rep的代码就会执行。

根据源码分析X-Forwarded-For改成127.0.0.1之后,GET进三个参数。然后调用了preg_replace函数。并且没有对pat进行过滤,所以可以传入"/e"触发漏洞
我首先执行一下phpinfo()


果然成功执行
然后使用system("ls")尝试获取文件目录

使用cd进入目标文件,并查看该文件夹下文件system("cd%20s3chahahaDir%26%26+ls")
此处不能使用空格隔开,可用%20或者+代替,%26%26&&&&意思是当前面命令执行成功时,继续执行后面的命令。


看到flag文件
继续进入查看system("cd%20s3chahahaDir/flag%26%26+ls")

看到flag.php,使用cat命令查看flag.php中的内容

得到flag
慎用preg_replace危险的/e修饰符(一句话后门常用)
php LFI读php文件源码以及直接post webshell

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章