상세 컨텐츠

본문 제목

[펌] 웹 어플의 취약점 방지 항목.

개발

by 동동주1123 2009. 4. 5. 22:59

본문


출처 : http://richlino.egloos.com/667091

기록용 펌


1. 명령어 삽입 가능성  : HTML 형식이나 쿠키, URL 파라미터 형식으로 시스템 명령어를 삽입함으로써 웹상에서도 시스템 명령을 실행할 수 있는 취약점이 존재함

- php.ini의 allow_url_fopen=Off로 세팅변경해야 됨


2. XSS : 웹어플리케이션을 사용해서 다른 최종 사용자에게 자바스크립트와 같은 악성 데이터를 보낼 때 발생, 사용자의 환경 설정사항을 변경할 수 있음.

o htmlspecialchars()를 이용하여 특수만자를 Entity 형태로 치환
 - 용도 : 이 함수는 특정 문자열에 대한 HTML encoding을 수행. 사용자가 입력한 값으로 HTML 페이지를 구성하기 전에 사용하면
          Cross-Site Scripting 공격 대비를 위해 사용할 수 있음
 - 사용법
  htmlspecialchars("<a href='test'>Test</a>")
 - 결과
  &lt;a href='test'&gt;Test&lt;/a;&gt;
o strip_tags() 함수를 이용하여 문자열로부터 HTML 태그와 PHP 태그를 제거
 - 용도 : 사용자가 입력한 값을 HTML 화면에 출력할 경우 사용하여 Cross-Site Scripting 공격에 대비할 수 있음.
 - 적용 가능한 PHP 버전 : PHP 3.0.8 이상
 - 사용법
  A. strip_tags('<script>'); : 모든 HTML에서 <script> 태그를 제거한다.

o 사용자 입력으로 사용 가능한 문자들을 정해놓고, 그 문자들을 제외한 나머지 모든 문자들은 필터링
 필터링 대상은 GET 질의 문자열, POST 데이터, 쿠키, URL, 그리고 일반적으로 브라우저와 웹서버가 주고받는 모든 데이터 포함

o 게시판에서 HTML 포맷을 사용할 수 없도록 설정

o 필요한 경우 모든 HTML을 사용하지 못하게 설정 후 필요한 HTML tag만 쓸 수 있도록 설정


3. SQL 구문 삽입 가능성 : 웹페이지를 통해 입력된 파라미터값을 이용하여 쿼리를 재구성하는 방법으로, 홈페이지 변조 및 DB정보의 유출 취약점이 있음.

일반대책

o 데이터베이스와 연동을 하는 스크립트의 모든 파라미터들을 점거하여 사용자의 입력 값이 SQL injection을 발생시키지 않도록 수정

o 사용자 입력이 SQL injection을 발생시키지 않도록 사용자 입력 시 특수 문자(' " / \ ; : Space - +등)가 포함되어 있는지
검사하여 허용되지 않은 문자열이나 문자가 포함된 경우에는 에러로 처리

o SQL 서버의 에러메지를 사용자에게 보여주지 않도록 설정. 공격자는 리턴 되는 에러 메시지에 대한 분석을 통하여 공격에 성공할 수
있는 SQL injection 스트링을 알아낼 수 있다. 따라서 SQL 서버의 에러메시지를 외부에 제공하지 않도록 한다.

o 웹 애플리케이션이 사용하는 데이터베이스 사용자의 권한을 제한
 가능하면 일반 사용자 권한으로는 모든 system stored procedures에 접근하지 못하도록 하여 웹 애플리케이션의 SQL injection 취약점을
이용하여 데이터베이스 전체에 대한 제어권을 얻거나 데이터베이스를 운용중인 서버에 대한 접근이 불가능하도록 설정

o php.ini 설정 변경
 magic_quotes_gpc 값을 On으로 설정

예)
; Magic quotes
;
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = On; Off에서 On으로 변경

; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off

; Use Sybase-style magic quotes (escape ' with " instead of \').
magic_quotes_sybase = Off

개발언어 대책
o 사용자로부터 입력받은 변수로 SQL 쿼리 구문을 생성하는 CGI는 입력 받은 변수를 체크하거나 변경하는 로직을 포함하고 있어야 한다.
o 입력받은 변수와 데이터 베이스 필드의 데이터형을 일치 시켜야 하고, 사용 중인 SQL 구문을 변경시킬 수 있는 특수문자가 포함되어 있는지
체크해야 한다.
o 검색 부분과 같이 클라이언트로부터 생성된 SQL 구문을 받는 부분이 있다면 이를 제거



4. 쿠키 스니핑/조작 가능성 : 별도의 암호화나 안전성을 확보하지 못해, 네트워크 패킷을 캡처하는 것만으로도 해당 값을 알아낼 수 있는 약점이 존재함

- SSL을 사용하여 로그인 트랜젝션 전체를 암호화
- Cookie 대신 보안성이 강한 Server Side Session 사용

5. 디렉터리 인덱싱 : 디렉터리 인덱싱이 허가 되어 있을 경우 특정 파일에 대한 다운로드를 통한 정보유출이 가능.
- 아파치 Indexes 지시어가 들어가 있는 부분을 삭제
- 아파치 디폴트 디렉터리 icons, manual 삭제


6. 관리자 페이지 추측 : 일반 사용자와 관리자의 로그인 페이지가 동일할 경우, 관리자로의 접근 시도가 발생할 수 있음

- 될 수 있는 한 허용된 IP 대역에서만 관리자 페이지에 접속할 수 있게 설정

예)
<Directory /home/www/admin/>
    AllowOverride AuthConfig (또는 All)
    Order deny, allow
    Deny from all
    Allow from 10.10.100.7 192.168.100.0/24
</Directory>

# 먼저 접근을 제어하고자 하는 디렉터리에 대한 상위 디렉터리 정의에
# AllowOverride 부분이 'All", 'AuthConfig', 'FileInfo' 등으로 설정되어 있어야 한다.
<Directory "접근을 제어하고자 하는 디렉터리">
....
AllowOverride FileInfo AuthConfig Limit
....
</Directory>
....
AccessFileName .htaccess
<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
</Files>

<.htaccess>
AuthName "인증이 필요한 관리자 페이지입니다."
AuthType Basic
AuthUserFile /home/www/admin/.htpasswd
AuthGroupFile /dev/null
require valid-user
Order deny,allow
Deny from all
Allow from 10.10.100.7 192.168.100.0/24

관리자 페이지와 같이 인증이 필요한 디렉터리에 .htaccess 파일을 만들고 admin 계정의 패스워드를 다음과 같이 설정한다.

#/usr/local/apache/bin/htpasswd -c /home/www/admin/.htpasswd [사용자명]
New passwd: ********
Re-type new password : ********
Adding password for user [사용자명]

# 주의사항
1. 아파치 서버의 경우 AllowOverride 지시자를 변경시 아파치 restart가 필요하다.
2. 관리자 페이지의 디렉터리명을 변경시 웹프로그램에서 관리자 디렉터리의 경로명을 지정하고 있는 경우 웹프로그램 또한 수정해야 된다.
3. 관리자 페이지 웹 서버 인증 설정시 관리자 디렉터리에는 일반 사용자의 접근이 필요한 파일이 존재하지 않아야 한다.
4. .htpasswd 파일에 other 사용자 부분에 read 권한이 있어야 된다.

7. 백업파일 : 웹 상에서 해당 파일을 확인 또는 다운로드 할 수 있어 내부 정보가 유출될 가능성이 있음.

- 웹상에서 백업 파일 볼 수 없도록 설정하거나 불필요한 백업 파일 삭제

# 아파치 설정
<Files ~ "\.bak$">
Order allow,deny
Deny from all
</Files>

# 특정 파일의 내용 보기 방지
AddType application/x-httpd-php .php .php3 .php4 .inc ,html .phtml .bak
AddType application/x-httpd-php-source .phps

8. 디폴트 페이지 : 외부 공격자에게 해당 어플리케이션에 대한 정보를 전달 및 디폴트 페이지에 대한 취약성이 노출되어 있음

- 디폴트 디렉터리와 파일 삭제
예)phpinfo.php, 아파치 루트 디렉터리에 manual, icons 등

9. 파일 업로드 : 불필요한 코드의 업로드를 허용함으로서 시스템 정보유출 및 침해가능성이 있음.
- 첨부 파일 업로드 기능을 통한 스크립트 업로드 및 실행을 금지
- Upload 파일을 위한 디렉터리에는 실행설정을 제거
- 첨부파일의 확장자 필터링 처리

10. 파일 다운로드 : 절대 경로를 URL에 직접 입력하는 형식으로 실행이 가능할 경우 임의의 정보 유출이 가능함.
o 파일 다운로드의 취약성은 주로 파일의 이름을 조작하는 데서 비롯한다. 다운로드 파일의 이름을 데이터베이스에 저장하고 다운로드
수행 시 요청 파일 이름과 비교하여 적절한지 확인하여 사용자가 조작할 수 있는 변수를 제거하는 것이 바람직.
또한 다운로드 위치는 지정된 데이터 저장소를 고장하여 사용하는 것이 바람직.

o 파일을 다운로드 받을 수 있는 디렉터리를 특정 디렉터리로 한정

o PHP를 사용하는 경우 php.ini에서 magic_qutoes_gpc를 On으로 설정하여 ".\./"와 같은 역 슬래시 문자에 대해 대응 가능


11. 인증절차 미흡 : 로그인을 확인하는 모듈이 존재하지 않는 관리자 페이지나 기타 페이지가 존재한다면 로그인을 하지 않고 직접적인 접근이 가능하게됨.
- 로그인을 확인하는 모듈이 존재하지 않는 관리자 페이지나 기타페이지가 존재하는지 점검

12. 히든필드 점검 : 데이터를 전송하는 방법 중 Hidden 필드를 이용하여 전송하는 경우가 있는데, 이때 이 값을 변경하여 시스템을 공격할 수 있음.

회원정보 변경 모듈에 사용자의 key 값(예:id)를 hidden form 필드로 전송한 후, 이를 다시 받아서 update에 사용하는 경우가 있는데,
공격자가 이 값을 변경할 경우 다른 사용자의 정보를 변경할 수 있는 취약점이 존재

o 해당 값의 무결성을 검사할 수 있는 루틴(예, 해쉬값 비교)의 추가 또는 서버 세션을 이용

13. 취약한 패스워드
추측하기 힘든 어려운 패스워드를 사용

14. Google Hacking  : 구글 검색기능을 통하여 로그인을 통하지 않고 접근할 수 있거나 해킹에 필요한 정보를 습득할 수 있음.
- 서비스 중인 도메인 구글 검색어 site:도메인명으로 검색해서 조치


15. 기타
o [PHP 4.0 이상] 환경 설정(php.ini) 내용 중 register_global을 "On"으로 설정할 경우, PHP 스크립트의 변수 값을
임의로 변경할 수 있는 취약성 존재. 따라서 register_global은 "off"로 설정한 후, $_GET, $_POST 문을 사용해서 사용자가 전달한 값을 얻어야 한다.

o PHP 스크립트 오류를 사용자에게 보내지 않기 위해서 PHP 환경 설정(php.ini)에서 아래와 같이 설정
log_error = On
display_errors = Off

o include 파일을 보호
 - 일반적인 디렉터리 (/lib, /include, /library등)을 사용하지 않도록 한다.
 - include 파일들의 확장자를 .inc나 .lib등을 사용하는 경우 웹 페이지 상에서 텍스트 파일로 인식하지 않도록 .php를 붙여서 사용한다.
 (예: config.inc.php, lib.inc.php등)
 - 별도의 확장자를 사용할 경우 아래와 같이 해당 확장자를 처리할 수 있도록 웹서버에서 설정
 AddType application/x-httpd-php .lib .inc .html .htm .php .xml


Apache 보안 강화 설정
o 불필요한 파일 관리
테스트 파일과 같은 불필요한 파일 삭제. 서비스와 관련 없는 디렉터리는 일반 사용자가 접근이 불가능하도록 적절한 권한을 설정.
<Files ~"\.bak$">
Order allow,deny
Deny from all
</Files>

o 최소한의 사용자 계정 사용
아파치 운영 시 위험을 최소화하기 위해서 최소한의 권한을 가진 사용자 아이디와 그룹으로 운영하는 것이 안전.

o 디렉터리 Indexes 설정 제거
<Directory "/usr/local/apache">
Options Indexes <- 제거한다
</Directory>

o 심볼릭 링크 사용 설정 제거
<Directory "/usr/local/apache">
Options FollowSymLinks <- 제거한다
</Directory>

o PUT, POST, DELETE의 제한
<Directory "/home/*/public_html">
 <Limit POST PUT DELETE>
  Require valid-user
 </Limit>
</Directory>

o 헤더 정보 숨기거나 최소화
ServerTokens Prod
ServerSignature Off

o 특정 파일의 내용 보기 방지
AddType application/x-httpd-php .php .php3 .php4 .inc .html .phtml .bak .xml .wml
AddType application/x-httpd-php-source .phps

'개발' 카테고리의 다른 글

PHP (Wordpress) development using Eclipse and XAMPP : 예전 버전  (0) 2009.04.06
php.ini  (0) 2009.04.05
[웹표준] DTD선언하기  (0) 2009.03.24

관련글 더보기