Skip to content

2010.05.03 01:02

웹어플리케이션 보안

조회 수 17146 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
출처 jhlim7110님의 블로그 | 즐거운맨
원문 http://blog.naver.com/jhlim7110/120037660615
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


List of Articles
번호 제목 글쓴이 날짜 조회 수
88 CentOS Portsentry 1.2 소스설치 오류 ADMINPLAY 2014.01.19 7050
87 PHP 보안의 약방의 감초 open_basedir ADMINPLAY 2014.01.02 7518
86 Portsentry 1.1 설치하기 2 file ADMINPLAY 2012.01.16 15092
85 [그누보드관련] $_POST 는 이미 오염된(?) 변수다. ADMINPLAY 2010.11.18 16119
84 iptables와 mod_security 연동을 통한 ip 차단 file ADMINPLAY 2010.09.15 19761
83 Modsecurity 무료 웹방화벽 설치 file ADMINPLAY 2010.09.12 24046
82 Modsecurity-apache 2.5.X 설치중 에러 server: /usr/lib/... ADMINPLAY 2010.09.12 21283
81 Modsecurity-apache 2.5.12 file ADMINPLAY 2010.09.12 18705
80 modsecurity-2.5 configure: *** apr library not found. ADMINPLAY 2010.09.12 21129
79 iptables를 이용한 SSH brute force 공격방어 l2zeo 2010.05.29 19684
78 PHP 보안관련 설정 권고사항 ADMINPLAY 2010.05.19 20206
77 php 수호신 설치 ADMINPLAY 2010.05.03 20820
76 denyhosts (ssh, ftp 등의 접근 차단) ADMINPLAY 2010.05.03 21356
» 웹어플리케이션 보안 ADMINPLAY 2010.05.03 17146
74 php.ini 보안 설정 ADMINPLAY 2010.05.03 20371
73 해킹 당했는지 알아보는 방법 ADMINPLAY 2010.05.03 19975
72 [적용] iptables 접속 차단 스크립트 ADMINPLAY 2010.05.03 25589
71 보안 체킹 프로그램 - portsentry file ADMINPLAY 2010.04.27 16164
70 /etc/passwd 구조 l2zeo 2010.03.31 34917
69 매직키를 이용한 응급복구법 l2zeo 2010.03.31 32081
Board Pagination Prev 1 2 3 4 5 Next
/ 5

Copyright ADMINPLAY corp. All rights reserved.

abcXYZ, 세종대왕,1234

abcXYZ, 세종대왕,1234