1. open_basedir 지시어란?
- open_basedir란 설정된 디렉토리 및 하위 디렉토리에서만 파일을 열 수 있도록 제한하는 지시어이다.
- 상세한 설정 및 이에 따른 설명은 아래 [2. 세팅 방법]에서 다루도록 하겠다.
2. 세팅 방법
- 필자는 CentOS 6.0 기준으로 작성하였다. 다른 버전의 경우 검색을 통해 알아보길 바란다.
- vi /etc/httpd/conf/httpd.conf
- 아래 내용 추가 후 저장
<Directory /var/www/html/test/*>
<IfModule php5_module>
php_admin_value open_basedir /var/www/html/test:/tmp
</IfModule>
</Directory>
- service httpd restart
여기서 php_admin_value 옵션은 ini_set() 혹은 set_include_path()와 같은 방법으로 어플리케이션에서 직접적으로 설정 정보를 변경하지 못하도록 하는 옵션이다.
open_basedir로 경로를 설정할 때 : 를 기준으로 여러 디렉토리를 설정해줄 수 있으며 어플리케이션 경로 및 세션 정보와 파일 업로드 시 필요한 tmp 디렉토리만 설정해준다.
이렇게 설정해줄 경우 Directory에 표기된 /var/www/html/test/ 하위에 정의된 파일들은 open_basedir에 설정된 /var/www/html/test 를 벗어나 상위 디렉토리에 접근할 수 없다.
설정 후 httpd service를 restart해주면 적용이 완료된다.
(참고) php.ini에서도 open_basedir 설정이 가능하다.
3. open_basedir 우회
- 올해 3월달에 @Blaklis_ 라는 분께서 open_basedir이 설정되어있을 때 우회하는 PoC를 공개하였다.
- 그리고 이에 대한 상세한 설명 및 방법은 shpik 님께서 블로그에 잘 정리해 놓으셨다.
( https://blog.shpik.kr/2019/PHP_Open_basedir_Bypass/ )
- 개인적으로 테스트를 해보며 첨언을 하자면 위에 내가 세팅한 방법인 httpd.conf 파일에 세팅하는 경우에는 위의 방법으로 우회가 되지 않는다. 왜냐하면 php_admin_value 옵션이 들어가있기 때문이다. 위의 경우는 php.ini 파일에서 open_basedir을 설정하였을 경우 우회되는 방법이다.
- 추후 관련 CTF가 출제될 수 있으므로 Final payload만 저장해둔다.
http://91.121.31.50/phuck3/?eval=chdir('img');ini_set('open_basedir','..');chdir('..');chdir('..');chdir('..');chdir('..');ini_set('open_basedir','/');echo(file_get_contents('flag'));
※ 참고
- https://idchowto.com/?p=22531
- https://ma.ttias.be/php-php_value-vs-php_admin_value-and-the-use-of-php_flag-explained/
'Hacking > Web' 카테고리의 다른 글
PHP wrapper (0) | 2020.03.02 |
---|---|
JWT Signature - RS256 to HS256 (3) | 2020.02.27 |
Sqlite Sql Injection Prevention (0) | 2019.12.30 |
HTTP 인증 우회 (0) | 2019.12.16 |
데이터 평문전송 대응방안 (2) | 2019.12.06 |