LFI(Local File Inclusion)
: 공격 대상 서버에 위치한 파일을 포함시켜 읽어오는 공격
쉽게 이야기해서, 공격 대상 서버에 있는 디렉터리로 접근하여 원하는 파일을 열어볼 수 있다는 것이다.
예를 들어, 아래와 같이 파일 이름을 url 파라미터로 넘겨주어 파일을 불러오는 코드가 있다고 하자.
<?php include(./$_GET['filename']); ?>
이러한 부분에서 특수문자 필터링 혹은 적절한 디렉터리 권한 설정을 안 해줄 경우에 LFI 취약점이 발생할 수 있는데, filename을 ../../../../etc/passwd와 같이 넘겨주면 파일을 include 하는데 아무런 제약이 없기 때문에 서버 내에 있는 계정의 모든 패스워드를 훔칠 수 있다.
include() 함수 이외에도, include_once(), require(), require_once(), file_get_contents() 함수에도 LFI 취약점이 발생할 수 있다.
(대응 방안)
1. 특수문자 필터링
str_replace('.', '', $filename);
str_replace('/', '', $filename);
(개인적으로 ../ 자체를 필터링하는 것보다 특수문자를 각각 필터링하는 게 좋다고 생각된다.)
2. 원격지 파일을 열지 못하도록 php.ini 환경설정 수정(RFI 취약점 방어)
allow_url_fopen = OFF
allow_url_include = OFF
3. include 관련한 에러를 출력하지 않음
display_errors = OFF
4. 파일이 존재하는 지 확인하는 코드 삽입
<?php
$filename = $_GET(['filename']);
if(file_exists(./$filename){
include(./$filename);
}
else{
echo "no hack";
}
?>
'보안 공부 > Web' 카테고리의 다른 글
[Web] SQL 쿼리 취약점 정리 (0) | 2021.11.11 |
---|---|
[Web] 웹 인코딩 종류 (0) | 2021.11.11 |
SSRF(Server-Side Request Forgery) 취약점 (1) | 2020.09.01 |
PHP 비교 연산자 취약점, 매직 해쉬 (0) | 2020.07.31 |
[Python] Request 모듈 사용 방법 (1) | 2020.04.30 |
댓글