PHP代码审计危险函数记录

记录一下一些比较经典的危险函数,当然后续再审计过程中遇到新的也会不断更新,以红日安全师傅们的这些文章以及实例进行一个学习记录。

https://xz.aliyun.com/t/2451

0x01:in_array() 函数缺陷

为防止篇幅过长,不详细说每个函数的功能,直接看用法:in_array(search,array,type),这里type为可选参数,且默认为false
当参数为false时, PHP 会尝试将文件名自动转换为整数再进行判断,导致该判断可被绕过。

class Challenge {
    const UPLOAD_DIRECTORY = './solutions/';
    private $file;
    private $whitelist;

    public function __construct($file) {
        $this->file = $file;
        $this->whitelist = range(1, 24);
    }

    public function __destruct() {
        if (in_array($this->file['name'], $this->whitelist)) {
            move_uploaded_file(
                $this->file['tmp'],
                self::UPLOAD_DIRECTORY . $this->file['name']
            );
        }
    }
}

$challenge = new Challenge($_FILES['solution']);

这里做了一个判断,in_array($this->file[‘name’], $this->whitelist),判断文件名是否为数字,但是由于in_array第三个参数没有设置,导致可绕过

0x02:filter_var

filter_var(variable, filter, options),只是单纯从形式上检测url是否合法,没有检测协议

可以看到exec中site_info可控,来自于url参数,而且正则匹配请求参数$site_info是否以sec-redclub.com结尾

payload为:file://”|cat<>flag.php;”sec-redclub.com’

拼接之后为:

0x03:parse_str

不安全的使⽤ parse_str 函数,从而导致变量覆盖

以文中的练习为例子

文中代码有点问题,改了一下代码,首先看index.php,看到md5(‘QNKCDZO’)应该就知道利用240610708的md5与它相等,再利用变量覆盖

然后看到uploadsomething.php,令filename=flag,content随便输入一个,可以将flag输入出来,但是后面还有两串代码

    usleep(100000);
    $content = "Too slow!";
    file_put_contents("$savepath" . $_GET['filename'], $content);

如果直接访问,速度太慢conent内会被写入to solw

也是一个比较常见的考点,利用条件竞争来进行读取,在还没有写入too slow的时候访问到即可,类似于之前上传之后会被ulink一样

利用bp,同时发两个包,一个写入,一个读取即可

0x04:str_replace

str_replace 函数过滤不当会造成的任意文件包含漏洞,例如只会将 ../ 字符替换成空,双写就可以绕过限制

0x05:htmlentities

默认不会转义单引号

<?php
$query = $_GET['query'];
echo "<a href='/image/size.php?" . htmlentities($query) . "'>link </a>";
?>

输入单引号可以进行逃逸

全局变量注册导致变量覆盖

全局变量注册处理不当,导致存在变量覆盖问题

程序中的两个$,会将获取到的数组键名作为变量,数组中的键值就成了变量的值,从而导致变量覆盖

发表评论

电子邮件地址不会被公开。 必填项已用*标注