File inclusion

Jang Seok Woo·2020년 9월 24일
0

File Inclusion

개발환경 : DVWA

File Inclusion을 이용한 우회법을 알아보도록 하자

File Inclusion 탭에 들어가면 다음과 같이 file1.php~file3.php가 있고 URL에 파일의 주소가 나와있다.

DVWA Security를 LOW로 두고 ../ 를 이용해 파일을 읽어보자

다음과 같이 /etc/passwd 파일을 읽는데 성공했다.

다음 난이도는 Medium

공백치환을 고려하여 .(../)./를 이용해 ../가 공백치환 되더라도 ../ 명령어가 입력되도록 입력해준다.

마지막으로 HIGH

File:/// 로 시작하는 file URL을 이용해 해당 위치의 파일을 읽는다.

보안대책으로는 어떤 방법들이 있을까?
첫째, 특정 파일명만 선별적으로 조건문을 걸어 허가한다.

// Only allow include.php or file{1..3}.php
if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}

위와 같이 특정 파일명만 허가를 하고, 나머지는 오류를 내는 방법이 있다.

장점 : 보안성이 좋다. 공격당할 여지가 거의 없다.

단점 : 관리자로서 해당 사이트 사용의 유연성이 줄어든다.

둘째, 경로와 관련된 특수문자를 필터링한다.

========================== 안전하지 않은 코드의 예 ==========================

String name = request.getProperty("filename");
if( name != null )
{
File file = new File("/usr/local/tmp/" + name);
file.delete();
}

============================================================================

위의 코드에서는 외부의 입력(name)이 삭제할 파일의 경로설정에 사용되고 있다. 만일 공격자에 의해 name의 값으로 ../../../root.txt 와 같은 값을 전달하면 의도하지 않았던 파일이 삭제되어 시스템에 악영향을 준다.

============================== 안전한 코드의 예 =============================

String name = request.getProperty("user");
if ( name != null && !"".equals(name) )
{
name = name.replaceAll("/", "");
name = name.replaceAll("\", "");
name = name.replaceAll(".", "");
name = name.replaceAll("&", "");
name = name + "-report";
File file = new File("/usr/local/tmp/" + name);
if (file != null) file.delete();
}

============================================================================

위의 코드와 같이 외부에서 입력되는 값에 대하여 Null 여부를 체크하고, 외부에서 입력되는 파일 이름에서 상대경로(/,\,&,. 등 특수문자)를 설정할 수 없도록 replaceAll을 이용하여 특수문자를 제거한다.

profile
https://github.com/jsw4215

0개의 댓글