Day 1 - Wish List(in_array函数缺陷)

靶场是红日安全的 https://www.ripstech.com/php-security-calendar-2017/ PHP SECURITY CALENDAR 2017

起因是最近在学一点内网渗透,问秦学长要个工具,他问:“源码审计你做了吗”,我说:“没有”,他:“可以开始了”,我:“好的”

虽然我人菜但还是很听话的嘛,源码审计只在 ctf 做题的时候会看一下,还没有专门找时间训练过,而且觉得自己并没有做到熟读源码,只是开发系统的时候现学现卖一点。小黄同学推荐了红日安全的靶场,那就学起来吧(顺便再记一些可能和漏洞无关但是源码涉及到的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_name'],
        self::UPLOAD_DIRECTORY . $this->file['name']
      );
    }
  }
}

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

  在访问PHP类中的成员变量或方法时,如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就必须使用操作符::,反之如果被引用的变量或者方法没有被声明成const或者static,那么就必须使用操作符->。

  move_uploaded_file 将上传的文件移动到新位置。

  这是一个任意文件上传漏洞,而导致这一漏洞的发生则是不安全的使用 in_array() 函数来检测上传的文件名。由于该函数并未将第三个参数设置为 true ,这导致攻击者可以通过构造的文件名来绕过服务端的检测,例如文件名为 7shell.php 。因为PHP在使用 in_array() 函数判断时,会将 7shell.php 强制转换成数字7,而数字7在 range(1,24) 数组中,最终绕过 in_array() 函数判断,导致任意文件上传漏洞。(这里之所以会发生强制类型转换,是因为目标数组中的元素为数字类型,进行弱比较。如果第三个参数设置为 true ,还会比较前两个参数的类型是否相同)

(*)修复

这个漏洞的原因是弱类型比较问题,那么就可以使用强匹配进行修复。例如将 in_array() 函数的第三个参数设置为 true ,或者使用 intval() 函数将变量强转成数字,又或者使用正则匹配来处理变量。

参考:

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

猜你喜欢

转载自www.cnblogs.com/wkzb/p/12464884.html