본문 바로가기

코딩공부/WEB2 - PHP

[15] PHP 보안

PHP 웹애플리케이션에서 일어날 수 있는 해킹의 사례와 해결 방법

 

Cross site scripting (XSS)

입력가능한 웹사이트에 스크립트 태그를 삽입하여 정보를 빼낸다.

스크립트 태그란?

자바스크립트라는 컴퓨터 언어를 웹브라우저에서 실행하는 코드

 

ex) 악성 스크립트 예시

 

사용자가 입력가능한 부분에 XSS 구문 삽입

 

목록에서 스크립트 구문을 등록한 게시글을 클릭하면, 스크립트가 실행된다.

 

이러한 스크립트 실행 가능성으로 로그인, 글삭제, 민감한정보유출 등의 악성행위가 가능하다.

 

XSS를 방지하기 위한 PHP 함수 2가지

htmlspecialchars() - 스크립트가 실행되지 않고, 태그가 문자 그대로 출력

 

※ html에서 특수문자를 표현하고 싶을 때 사용하는 엔티티

&lt; -> <

&gt; -> >

&quot; -> "

 

 

 

프로젝트 파일에서 사용자가 입력한 정보를 출력하는 모든 부분에 htmlspecialchars()를 추가해준다.

xss 스크립트가 저장된 게시물을 클릭하면, 스크립트가 실행되지않고 태그 문자 그대로 출력된다.

 

 

스트립 태그 ( strip tag )

이미지 태그, 줄바꿈 태그 등 몇몇 필수적으로 필요한 태그를 사용해야할 수 있다. 

스트립 태그를 이용해서 모든 태그를 날리고, 특정 태그들은 허용하도록 옵션을 지정할 수 있다.

 

 

=> 결론 : " 사용자가 입력한 정보를 무조건 불신 해야한다. "

 


파일 경로 보호 (1)

url을 이용해서 공격

 

루트에 계정정보가 저장된 password.txt 파일을 가지고 있다고 하자

공격자가 password.txt가 있는 경로. 현재 id값을 처리하는 페이지의 '부모디렉터리 하위'에 있다는 것을 알아냈다.

id 값에 해당 파일을 요구하면 다음과 같이 password.txt 파일의 내용이 보여지게된다.

 

 

id값을 통해서 해당 파일을 file_get_contents() 함수로 콘텐츠를 읽어오고 있기 때문에 취약점이 발생한다.

파일시스템을 사용할 때는 많은 주의가 필요하다.

 

 

basename() - 파일의 경로에서 파일명만 추출해주는 함수

 

'../password.txt' 를 입력하면, basename()함수를 통해서 경로부분인 '../'이 잘라내지고, 'password.txt'라는 파일명만 가져온다.

basename()을 통해서 다른 경로에 있는 파일을 읽어들이지 못하게 한다.

 

 

프로젝트 페이지에서 파일을 읽어오는 부분에 basename()함수를 적용시키자.

상위디렉터리로 이동하지 못해서 password.txt 파일을 찾을 수 없다는 오류메시지가 나오는 것을 확인할 수 있다. (권한없는 곳의 접근을 막는다. )

 

 

파일 경로 보호 (2)

파일을 삭제하는 명령을 내릴 때, 공격자는 최대한 많은 정보를 수집한다.

[개발자 도구] > [Network] > CHECK [Preserve log] : 서버와 주고받는 정보를 쌓아둔다. 

체크 후, 삭제버튼을 누르면, 서버랑 어떤 데이터를 어떤 방식으로 주고받는지 살펴볼 수 있다.

 

정보 수집

" 서버에 delete_process.php 를 호출하고, Form Data로 id 값을 전달하고 있다. 전송할 때 사용하는 방식은 POST 방식이다. "

 

공격자는 위 정보를 바탕으로 POST 방식으로 delete_process.php로 id 값을 넣어서 패킷을 전송할 수 있다.

id 값에 "../index.php" 를 넣어서 전송하면 파일이 삭제된다.

 

이러한 문제를 방지하기 위해서 삭제 대상을 "data" 디렉토리의 파일로 제한해야 한다.

delete_process.php 파일에서 입력받은 id값에 대해서 경로가 있다면 지우고, 파일명만 가져온다.

'코딩공부 > WEB2 - PHP' 카테고리의 다른 글

[14] PHP 파일로 모듈화 - require  (0) 2019.09.27
[13] PHP 글 삭제 기능 구현  (0) 2019.09.26
[12] PHP 글 수정 기능 구현  (1) 2019.09.26
[11] PHP 글 생성 기능 구현  (0) 2019.09.26
[10] PHP에서 FROM과 GET, POST  (0) 2019.09.26