php에서 코드를 작성할 때, 긴 코드일 경우 다른 파일을 불러오는 Include 를 사용하기도 해요.

 

예를들어 login.php 에서는 다음과 같이 db접속 코드를 삽입할 수 있어요.

<?php
	include('dbConfig.php');
?>

 

include

include_once

require

이 비슷한 역할을 해요.

 

 

File Include 취약점 (LFI 취약점 : Local File Include)

 

위와 같은 코드였을 때, include로 불러온 파일은 php 코드 안쪽에 그대로 텍스트가 적히기 때문에

php 코드인 경우에는 실행이 될거고, 그냥 txt 라면 그 텍스트가 출력될 거에요.

 

webshell.jpg 의 내용이 

<?php echo system($_GET['cmd']); ?>

 

인 경우, 해당 코드가 바로 실행되어 버리죠.

 

그럼 ?cmd=          

저 영역에 명령어를 넣어서, 서버에 존재하는 임의의 파일을 모두 가져올 수 있게 됩니다. (단, 소스코드 빼고!)

 

소스코드는 php로 되어 있기 때문에, 가져올 수 없습니다. (가져오지 않고 실행 됩니다.)

 

파일 업로드는 막혀있지만, LFI 취약점이 존재하는 경우

업로드를 하지 않더라도 웹 로그로 간접적인 영향을 줄 수 있어요.

 

../../../../../../opt/lampp/logs/access_log

 

실행가능한 파라미터를 입력하면, 해당 웹로그에서 실행된 결과를 바로 확인할 수 있어요.

 

 


 

핵심은 서버에서 실행되는 파일을 실행하지 못하게끔 하는 것이에요.

 

1. 파일 이름 난독화 (파일 경로를 감추는 전략) 😥

 

조건부 대응 방안으로 언제든지 뚫릴 수 있어요.

특히 SQLi가 있다면 의미가 없어요.

 

 

2. 확장자 화이트 리스트 기반 필터링 😥

 

역시 미흡해요.

 

 

3. DB에 파일을 저장하는 방법

 

BLOB / CLOB (파일 저장 형식)

데이터 테이블 안에 바이너리 형태로 저장하면, 실행할 여지가 전혀 없어요.

 

4. NAS Server 이용 

 

DB에 파일을 넣는것이 부담스러울 때, DB외에 별도의 서버를 이용해서 저장해요.

파일 저장 서버를 별도로 이용하는 것으로서, 해당 NAS에는 PHP가 설치되어 있으면 안 돼요.

 

웹서버와 분리해서 관리해야 합니다!

 

 


 

LFI와 RFI

LFI는 공격자가 웹 서버 내부에 있는 파일을 포함시키는 공격이고,
RFI의 경우 Remote File Include로 외부 원격 서버에 있는 파일을 포함 시키는 공격이에요.

(해당 파일이 원격지에 위치함)

 

 

+ Recent posts