세이박스

[컴퓨팅] 네이트온 쪽지를 이용한 해킹 및 악성프로그램 유포 주의!

서버,보안
사용자 삽입 이미지
최근 네이트온 해킹으로 인해 지인을 사칭하여 쪽지로 발송하고 있다.

"이 신발 어때?" 등의 메시지와 함께 악성코드 프로그램을 바로 설치 하도록 하는 사이트 URL 주소 내용으로 보내고 있으며, 해당 사이트로 접속시 바로 설치 파일이 뜨도록 설정 되어 있다.

마치 "화면 보호기" 파일 설치를 요청하게 되는데 "see.scr" 파일을 설치하게 되면 화면 보호기가 동작하는게 아니라 악성코드가 PC에 설치 되는 것이다.

이와 같이 다양한 방법으로 악성 프로그램을 유포하는 사태가 속출하고 있는 만큼 인터넷 사용에 항상 주의를 해야한다.

다행이도 네이트온 쪽지에서 링크를 클릭시에는 해당 사이트 접근을 차단하고 있지만, 만약 친구가 보낸것으로 판단하여 브라우저에 직접 해당 URL 주소를 입력후 접속한다면 바로 설치 요청창이 나타 날 것이다.

만약 해당 프로그램이 설치가 되었다면 사용자의 비밀번호등 개인정보가 유출 될 수 있으므로 반드시 백신으로 치료를 받아야 한다.

아이핀 (i-pin) 정보통신망법에 따라 사이트 적용 의무화

기타

방송통신위원회원에서는 '09년 6월 26일 "정보통신망법 제 23조의 2 및 동법 시향령 제 9조의 2에 따라 주민번호외 회원가입 방법 제공 의무화 사업자" 리스트를 공시 하였습니다.

 

주민번호외 회원가입 방법 제공 의무화 적용기간은 '2010 3 27일 까지이며 기간 내 관련조치가 이행되지 않은 사업자는 방송통신위원회의 행정처분(3천만원 이하의 과태료)부과될 수 있습니다.

아이핀 발급업체

ㅇ 공공 i-pin : http://www.gpin.go.kr
공공기간에 한해서만 발급

ㅇ 서울신용평가정보 : http://www.siren24.com 
이용중인 업체 : 네이버, 네이트, 야후, 옥션, SK, 지마켓 등

ㅇ 한국신용정보 : http://www.nuguya.com
이용중인 업체 : 다음, 잡코리아, KBS, OK캐시백, 멜론, 11번가 등

ㅇ 한국신용평가정보 : http://www.vno.co.kr

ㅇ 한국정보인증 : http://www.signgate.com
전화 거의 안됨, 이메일 문의 접수 가능

ㅇ 한국전자인증 : http://www.crosscert.com 
주로 서버보안SSL 인증서 및 ActiveX 응용프로그램 인증서 제공하는 업체인데 i-pin도 제공 하나 봅니다.

ㅇ 코리아크레닷뷰로 : http://www.koreack.com
전화 연락 안됨, 이메일 리턴됨, 웹상에 신청서 페이지 오류남 (정식 발급 업체가 아닌듯)

* 여기까지 제가 확인한 i-pin 제공 업체 입니다.



아이핀의 문제점 (개인적인 견해)

1. ActiveX로 설치 해서 아이핀을 이용하므로 IE에서만 동작 합니다.

2. 아이핀의 장점으로 내세우는 보안에 의구심을 갖게 됩니다. 오히려 신용정보업체들이 해킹을 당하게 된다면 개인정보는 물론이거니와 어떤 사이트에 가입 되었는지 까지 더많은 정보를 제공해주게 되는 격이 됩니다.
내부에서의 자료 유출도 무시 못하겠죠.

3. 전자상거래 이용시 개인 신분을 확인 하기 위해선 수시로 아이핀 정보를 열람 하게 되므로 공인된 신용정보업체에 엉청난 수수료를 지불하게 됩니다. 쇼핑몰 뿐만아니라 게시판이 실명제로 된 경우에도 빈번하게 확인 해야하는 사항에서는 어마어마한 수수료가 발생하게 됩니다.

4. 인터넷 사업자들이 아이핀을 적극 도입하지 않는 이유가 비용 문제 입니다. 업체 규모에 따라 500만원에서 11억 까지 들어간다고 합니다. 즉, 인터넷 사업자들에게 부담을 주게 되니 시행을 꺼려 하게 되는 것입니다.

정부는 이와 같은 문제점을 좀더 심사 숙고해서 지원을 하면서 법적 시행을 해야 하지 않을까라는 생각 입니다.



아이핀 도입시 참고 사항

위 사이트들을 비교 할 때 가격적인 면도 중요 하겠지만 문제 발생시 얼마나 빠른 대응이 가능한지 꼭 확인 해 보시기 바랍니다.
특히 전화 연락 안되는 곳은 좀 고민 되는 곳이네요.
그리고, 설치 지원또한 지원이 잘 되는지 보안이 잘되어 있는지 등 개발자라면 구체적인 항목까지 알아 보시는게 좋을 듯 합니다.


[보안] 서버 설치 후 기본적으로 해야할 보안 사항을 간단하게 정리 해보겠습니다.

서버,보안
1. 서버패치 주기적으로 설치
서버 패치는 항상 주기적으로 해주셔야겠죠!
윈도우 서버의 경우 윈도우업데이트 기능이 있으며 리눅스의 경우 yum으로 편리하게 업데이트 가능하죠
yum -y upgrade

2. 비번 주기적으로 변경
루트 뿐만 아니라 일반 개정 까지 주기적으로 변경 해주시는게 좋습니다.
요즘, 같은 네트워크 대역의 서버 또는 라우트 등의 장비등이 해킹 당하면 지나 다니는 모든 패킷을 수집하여 관리자 개정등을 분석하여 접속하게 됩니다.
따라서, 주기적으로 변경 한다면 수집된 개정이 이전 개정이라 접속 못하게 되겠죠.
어디까지나 조금이라도 피해를 줄이기 위해선 변경 해주시는게 좋습니다.

3. OS 방화벽 및 포트 설정
윈도우든 리눅스든 OS 자체에 방화벽이 있습니다.
원리는 포트를 막느냐 열어 주느냐 정도 이지만 불필요한 포트를 막아 두므로써 취약한 서비스를 통해 공격 받는것을 최소화 할 수 있겠죠
리눅스의 경우
setup > Firewall.... 항목에서 방화벽 레벨을 high로 하시고 열어줄 port를 추가로 지정 해주시는게 좋습니다.
이때 포트는 기본 포트를 이용하시지 마시고 5자리 정도로 만들어 주세요!
예로 FTP의 경우 21포트 이지만 21포트는 막고 21123 처럼 5자리로 열어주시는게 좋습니다.
telnet 23 사용 하지 마시고 SSH 사용하시되 기본 포트인 22을 5자리로 변경해서 이용하세요.
기타 웹서비스를 하신다면 80포트는 기본 사용 하셔야겠죠.
외 DB를 이용하신다면 MySQL의 경우 3306 포트를 열어 두셔야겠죠.
물로 MySQL역시 포트를 변경 할 수 있습니다.
기본 포트를 그대로 이용하기 보다는 5자리 이상으로 변경해서 사용하시는게 좋습니다.
이유는 대부분 해킹 프로그램이 포트를 스켄할때 기본 포트 부터 스켄하며 높은 숫자로 갈수록 스켄하는 시간이 많이 걸리므로 그만큼 노출될 확률도 적어 집니다.

4. 라우팅테이블
라이우팅 테이블을 통해서 특정 공격 IP등을 차단하거나 허용하는 방식을 이용하세요!
만약 특정 서버에서만 접속을 하면 되는 서버라고 한다면 모든 IP를 다 막고 해당IP만 허용한다던지 하면 아주 좋겠죠.
글데 라우팅 테이블 관련된 건 자세히는 모르겠네요.
그냥 라우팅 관련해서 보안 할 필요가 있다고 들은적이 있어서 ^^;

5. 패턴분석차단
방어의 기본은 분석입니다.
분석을 위해선 로그를 쌓아야 분석하겠죠!
웹의 경우 아파치 로그, DB 의 DB로그 등등 서버는 여러가지의 로그들을 남기고 있습니다.
그리고, 프로그램을 추가로 설치하여 다양한 로그를 기록 하고 분석 할수 있습니다.

6. 웹로그 분석 차단
웹방화벽이 없다면 웹로그를 면밀히 분석해서 특정 스크립트를 웹소스에서 차단 하거나 특정 페이지를 특정IP가 지속적으로 요청하지 않는지 등 분석후 차단 적용 합니다.

7. 취약점 분석툴 설치 분석
서버의 취약점을 분석해주는 툴 프로그램을 설치 하셔서 내 서버의 어떤 취약점이 있는지 리포트를 통해서 점검 하셔서 보안 하시기 바랍니다.

8. 포토 50000~65000 사이로 설정
위에서 말한바 있듯이 포트 범위를 5만~6만5천 사이로 설정 해서 이용하세요.


이외에도 보안해야할 사항이 많고 많지만 제가 서버를 설치후 운영하면서 나름 보안하고 있는 사항입니다.
하지만, 위와 같이 힘들게 보안을 해도 뚤리게 마련입니다.
해커들은 나날이 발전하고 있으니깐요.
제생각엔 보안 담당자들 보다 해커들이 항상 우위를 차지 하고 있는 것 같습니다.
그러니, 언제든지 내가 관리하고 있는 서버는 뚤릴수 있다라는 생각으로 보안에 신경을 써야 겠습니다.
전 기획부터 개발까지 맡으면서도 서버 100여대를 혼자서 모두 관리 하고 있습니다.
그중에서도 가장 힘든게 서버 보안 인듯 하네요!
아무튼 보안 담당자님들 화이팅 입니다.

위 글은 세이박스에서 작성한 글이므로 마음껏 퍼가셔도 되지만 출처는 반드시 남겨 주세요!

웹방화벽 TuTELA T-2010

서버,보안
TUTELA WebFirewall

(주)토리넷 업체에서 만든 웹방화벽 제품

nis 국가정보원 - IT보안 인증 사무국 인증제품

http://www.kecs.go.kr/certify/detail.jsp?ci=GOOD&di=159

인증제품명 : TUTELA WebFirewall V1.3
인증일 : 20080424
제품유형 : 웹방화벽 
보증등급 : EAL4 
인증보고서번호 : CR-08-18 
인증번호 : NISS-0101-2008 
공통평가기준 버전 : 2.3 
준수 보호프로파일 : N/A 
평가기관 : KISA 
개발사/신청기관 : 토리넷

사용자 삽입 이미지


사용자 삽입 이미지


사용자 삽입 이미지

사용자 삽입 이미지

 [출처] 세이박스 - http://www.saybox.co.kr/bbs/board.php?bo_table=hserver&wr_id=4

[해킹] Cain & Abel 카인과아벨 스푸핑 프로그램 공격 유형 및 보안 방법

서버,보안

카인과 아벨이라 왠지 최근 인기 있는 드라마 제목 같다.
하지만 이름만 비슷할뿐 해킹 프로그램이다.
일종의 세션 하이재킹 과 IP스푸핑이 섞여 있는 형태라고 할 수 있습니다.

몇년 전 L전자 신입사원 시험에 떨어진 한 청년이
홧김에 L전자를 해킹을 했다 라는 보도가 있었는데
이또한 Cain & Abel 프로그램을 이용한 것 이었습니다.

적을 알아야 막든지 공격하던지 해야 할터
나를 공격한놈이 도대체 어떤 놈인지 여기 저기 자료를 찾아봤다
http://www.oxid.it/index.html
사이트에서 만든 프로그램인 듯했다 즉, 해당 설치 파일을 쉽게 구할 수 있는 것이었다.
다운받아 설치 해보니 역시나 네트워크상의 데이터를 수집하는 것이었다.

사용법은 http://www.oxid.it/ca_um/ 에 설명이 간략하게 되어 있습니다.
프로그램 이름이 카인과 아벨 즉, 좋은 용도와 나쁜 용도로 해당 프로그램을 이용할 수 있는데
메뉴얼을 보면 cain , abel 두개의 카테고리로 되어 있습니다.
abel 은 좋은 용도 순수하게 네트워크 패킷을 분석하는등에 대한 설명이며
cain 은 나쁜 용도로 사용하는 방법 스나이핑 등에 대해 그 용도를 설명 하고 있습니다.
성경에 나오는 착한 동생 아벨과 동생을 죽인 형 카인의 모습처럼 하나의 프로그램이 나쁜쪽과 좋은쪽의 용도로 사용할 수 있다는것을 보여 주는 것이죠.

간단하게 기능을 설명하자면 해당 프로그램을 실행하고서 기다려 보면 수백건의 스캔된 정보가 자신의 컴으로 들어와 있는것을 확인 할수 있습니다.
즉, 네트워크 상에 지나 다니는 모든 패킷을 캡쳐해서 보여주는 것으로 홈페이지 로그인 아이디 및 비번등을 모두 보여 줍니다.

보통 윈도우 서버를 취약점을 이용해 해당 서버에 카인과아벨 프로그램을 설치해
목적 서버를 수푸핑하는 형태입니다.

위와 같은 프로그램이 서버에 설치 되었다면 다음과 같이 처리 하세요!
일단 해당 프로그램을 일단 지우셔야 하겠죠.
보통 c:\windows\system32\server 폴더등 시스템 경로쪽에 설치가 되어 있습니다.
그외에 다른 프로그램들 설치 되어 있는지 꼭 확인하시구요
개정 정보에서 추가된 개정이나 불필요한 개정 모두 사용 정지하거나 삭제 해버리세요
그리고, 터미널 접속은 할 수없게 하세요.
만약 꼭 사용 해야 한다면 포트를 변경하세요.
포트 변경 방법은 유포유에 글이 있으니 참고 하세요!
윈도우 서버가 워낙 취약점이 많은지라 보안에 신경 많이 써 주셔야 할겁니다.
특히 사용하지 않는 포트는 모두 잠거 두시는게 좋습니다.

그리고, 로그인시 SSL 적용을 꼭 하시기 바랍니다.
SSL 관련해서 유포유에 자료 있으니 참고 하시구요.
SSL 적용시 로그인 정보를 암호화 해서 보내므로 그나마 회원들의 개정이나 기타 정보를 보호 해줄 수있습니다.

이외에도 보안할 사항을 저역시 찾아보구서 찾으면 추가적으로 글을남겨 놓겠습니다.

 

iframe 삽입 공격 보안

서버,보안

1. 사건 배경
평소 꾸준히 방문하던 쇼핑몰에 어느날 갑자기 뽀로록 소리가 나면서 상단 바에 노란줄이 생기며 경고가 뜬다 혹은 알약 등 백신에서 감시프로그램이 "치명적인 바이러스에 감염되었습니다."라고 뜬다. 너무나 당황한 A군 해당 쇼핑몰에 접속하기 겁이 난다 ㅜㅜ;

2. 사건 원인
해당 쇼핑몰은 iframe 삽입 공격을 받은것이다. DB인젝션 공격과는 좀 다른 유형으로써 윈도우 웹서버 개정관련 보안 취약점을 공격하는 방식이다.
원인은 홈페이지 폴더에 everyone 개정에 쓰기권환까지 줬기 때문에 생긴 문제이다.
폴더에 속성 > 보안 눌러보세요 분명 everyone 개정으로 설정되어 있을겁니다.
윈도우 2000서버 등 초기 IIS 서비스 당시 everyone으로 설정한 운영자가 더러 있었을 겁니다.
이유야 어찌 되었던 이제라도 발견 하셨다면 다행인거죠! ^^ 화이팅!

3. 보안 방법
홈페이지 폴더에 IUSR_서버명, IWAM_서버명 의 두 개정을 추가하고 everyone 개정은 삭제 합니다. 그리고, IUSR_, IWAM 권환에 읽기,실행 권환만 줍니다. 그리고, 게시판 첨부파일이 업로드될 폴더등 쓰기 권환이 꼭 필요한 곳에만 쓰기 권환을 줍니다.
저의 경우엔 웹서비스 디렉토리 바깥쪽에 폴더를 만들어 업로드 하도록 해놨습니다.


윈도우 서버 보안 취약점으로 인해 생기는 문제가 참 많군요 ^^;

mssql 전체 테이블 문자 검색 변경

데이타베이스
 
어느날 갑자기 DB에 "<script src=http://...></script>" 와 같은 내용이 삽입 된경우는 스크립트 삽입 공격을 받으신 겁니다.
 
참고로, 구글(http://www.google.co.kr) 에서 "<script src=http://...></script>" 내용을 검색해보세요.
국내 사이트중 어마어마 하게 많이 공격받은걸 확인 하실 수 있을겁니다.
 
MSSQL 을 사용중인 서버들이 공격 대상입니다.
항상 느끼는거지만 윈도우 관련 서버들이 취약점이 많다 보니 이런 문제가 생기는 것 같네요 저도 더 자세히 관련 공격 원인과 방어를 찾아봐야겠지마 끝이 없는듯 ㅡㅡ;
 
그럼, 테이블 마다 일일이 삽입된 스크립트를 일일이 지우는것도 끝이 없죠 그래서 다음과 같이 쿼리를 실행 해주시면 문제의 스크립트가 있는 테이블, 컬럼을 일일이 자동으로 찾아서 삭제 해줍니다.
 
 
DECLARE @T varchar(255), @C varchar(255);
DECLARE Table_Cursor CURSOR FOR
SELECT a.name, b.name
FROM sysobjects a, syscolumns b
WHERE a.id = b.id AND a.xtype = 'u' AND
(b.xtype = 99 OR
b.xtype = 35 OR
b.xtype = 231 OR
b.xtype = 167);
OPEN Table_Cursor;
FETCH NEXT FROM Table_Cursor INTO @T, @C;
WHILE (@@FETCH_STATUS = 0) BEGIN
  EXEC(
    'update ['+@T+'] set ['+@C+'] = left(
            convert(varchar(8000), ['+@C+']),
            len(convert(varchar(8000), ['+@C+'])) - 6 -
            patindex(''%tpircs<%'',
                      reverse(convert(varchar(8000), ['+@C+'])))
            )
      where ['+@C+'] like ''%<script src=http://...></script>'''
      );
  FETCH NEXT FROM Table_Cursor INTO @T, @C;
END;
CLOSE Table_Cursor;
DEALLOCATE Table_Cursor;
 
 
위 진하게 표시된 부분을 삽입된 스크립트 내용으로 넣어 주시면 됩니다.
만약 여러 종류의 스크립트가 삽입된경우 ''%<script%</script>''' 처럼 넣어 주셔도 됩니다. 하지만 정상적인 스크립트가 사라지는 경우가 발생하겠죠! 주의!
 
하지만, 안타깝게도 위 쿼리로 100% 복구 안될 가능성 있습니다.
가장 좋은 방법은 백업해두신거 복구하는게 가장 좋겠죠!
 
아무튼 행운을 빌며 해당 공격에 대해 더 자사한 정보 찾으면 올리겠습니다.

ASP 해킹 방지 보안 방법(injection, cross site scripting...)

웹프로그램
정리해서 올려야하는데..귀찮아서 일단 문서 일부분에서 발췌한것만 올린다.
참고로 이 보안관련 문서는 대외비라서 일부분만 올린것인데 이 문서에는
asp 뿐만 아니라 php, jsp 용도 있다.

혹 필요해서 요청하면...-_-;;;;;


<%
'////////////////////////////////////////////////////////////////////
'//가.  명령어 삽입(Command Injection) 가능성
'////////////////////////////////////////////////////////////////////
Dim title, str
title = "What's Up!!! <what happen> Oh my god!!!! & goodness"
str = ""
//변환을 수행할 함수
Sub ReplaceStr(content, byref str)
    content = replace(content, "'", """)
    content = replace(content, "&", "&")
    content = replace(content, "<", "<")
    content = replace(content, ">", ">")
   
    str = content
End Sub

ReplaceStr title, str
response.write str

%>

'////////////////////////////////////////////////////////////////////
'//나.  크로스 사이트 스크립팅 (XSS) 가능성
'////////////////////////////////////////////////////////////////////
/include/config.inc.asp
<%
atag = "p,br"       'XSS 허용할 태그 리스트
UploadedPath = "/Uploaded_Files/"   '업로드 기본 경로
fileext = "jpg,gif,png,pcx"     '허용할 확장자 리스트
%>


/include/secure.inc.asp
<%
'공격 위험성이 존재하는 문자들을 필터링
'문자열 입력값을 검증
'숫자형은 데이터 타입을 별도로 체크하도록 한다.
Function sqlFilter(search)
    Dim strSearch(5), strReplace(5), cnt, data
   
    'SQL Injection 특수문자 필터링
    '필수 필터링 문자 리스트
    strSearch(0)="'"
    strSearch(1)=""""
    strSearch(2)="\"
    strSearch(3)=null
    strSearch(4)="#"
    strSearch(5)="--"
    strSearch(6)=";"

    '변환될 필터 문자  
    strReplace(0)="''"
    strReplace(1)=""""""
    strReplace(2)="\\"
    strReplace(3)="\"&null
    strReplace(4)="\#"
    strReplace(5)="\--"
    strReplace(6)="\;"
   
    data = search
    For cnt = 0 to 6 '필터링 인덱스를 배열 크기와 맞춰준다.
        data = replace(data, LCASE(strSearch(cnt)), strReplace(cnt))
    Next

    sqlFilter = data
End Function

'XSS 출력 필터 함수
'XSS 필터 함수
'$str - 필터링할 출력값
'$avatag - 허용할 태그 리스트 예)  $avatag = "p,br"
Function clearXSS(strString, avatag)
    'XSS 필터링
    strString = replace(strString, "<", "<")
    strString = replace(strString, "\0", "")
   
    '허용할 태그 변환
    avatag = replace(avatag, " ", "")       '공백 제거
    If (avatag <> "") Then
        taglist = split(avatag, ",")
   
        for each p in taglist
            strString = replace(strString, "<"&p&" ", "<"&p&" ", 1, -1, 1)
            strString = replace(strString, "<"&p&">", "<"&p&">", 1, -1, 1)
            strString = replace(strString, "</"&p&" ", "</"&p&" ", 1, -1, 1)
        next
    End If
   
    clearXSS = strString
End Function

'확장자 검사
'$filename: 파일명
'$avaext: 허용할 확장자 예) $avaext = "jpg,gif,pdf"
'리턴값: true-"ok", false-"error"
Function Check_Ext(filename,avaext)
    Dim bad_file, FileStartName, FileEndName
   
    If instr(filename, "\0") Then
        Response.Write "허용하지 않는 입력값"
        Response.End
    End If
   
    '업로드 금지 확장자 체크
    bad_file = "asp,html,htm,asa,hta"
   
    filename = Replace(filename, " ", "")
    filename = Replace(filename, "%", "")

    FileStartName = Left(filename,InstrRev(filename,".")-1)
    FileEndName = Mid(filename, InstrRev(filename, ".")+1)
       
    bad_file = split(bad_file, ",")

    for each p in bad_file
        if instr(FileEndName, p)>0 then
            Check_Ext = "error"
            Exit Function
        end if
    next
   
    '허용할 확장자 체크
    if avaext <> "" Then
        ok_file = split(avaext, ",")
   
        for each p in ok_file
            if instr(FileEndName, p)>0 then
                Check_Ext = "ok"
                Exit Function
            End If
        next
    End If
   
    Check_Ext = "error"
End Function

'다운로드 경로 체크 함수
'$dn_dir - 다운로드 디렉토리 경로(path)
'$fname - 다운로드 파일명
'리턴 - true:파운로드 파일 경로, false: "error"
Function Check_Path(dn_dir, fname)
    '디렉토리 구분자를 하나로 통일
    dn_dir = Replace(dn_dir, "/", "\")
    fname = Replace(fname, "/", "\")
   
    strFile = Server.MapPath(dn_dir) & "\" & fname '서버 절대경로
   
    strFname = Mid(fname,InstrRev(fname,"\")+1) '파일 이름 추출, ..\ 등의 하위 경로 탐색은 제거 됨
    Response.Write strFname
   
    strFPath = Server.MapPath(dn_dir) & "\" & strFname '웹서버의 파일 다운로드 절대 경로

    If strFPath = strFile Then
        Check_Path = strFile '정상일 경우 파일 경로 리턴
    Else
        Check_Path = "error"
    End If
End Function

'IP 체크 함수
Function Check_IP(IP_Addr)
    If Request.Servervariables("REMOTE_ADDR") = IP_Addr Then
        Check_IP = "TRUE"
    Else
        Check_IP = "FALSE"
    End If
End Function
%>



/head.asp
<%
'페이지에서 에러가 발생하여도 페이지 오류를 외부로 출력하지 않기위해 사용
On Error Resume Next
'On Error GoTo 0도 가능하나 2003에서는 실행되지 않음
if err.number <> 0 then
    'Response.Write err.descript-xion & "<BR>" & err.source & "<BR>"
    err.clear
End if
%>


/content.asp
<!--#include virtual="/include/connection.inc.asp"-->   <% 'DB연결 헤더 %>
<!--#include virtual="/include/secure.inc.asp"-->   <% '보안관련라이브러리 %>
<!--#include virtual="/include/config.inc.asp"-->   <% '전역변수리스트 %>
<!--#include virtual="/head.asp"-->             <% '초기 설정 페이지(에러 메세지 미출력) %>
<%
Dim strSQL
Dim intSeq, strName, strEmail, strSubject, strContent, intCount, dtmReg_Date, intExist
Dim blnTag, strUserIP
Dim atag

'입력값이 숫자형인 경우 IsNumeric 함수를 사용한다.
If IsNumeric(seq) Then
    intSeq = Request.QueryString("seq")
Else
    Response.Write "허용하지 않는 입력값입니다."
    Reponse.End
End If

'문자(열)인 경우 sqlfilter 사용
'intSeq = sqlFilter(Request.QueryString("seq")) 'SQL Injection 필터링

'읽은 횟수 검색
strSQL = "SELECT count(*) FROM board WHERE intSeq='" & intSeq & "'"

objRs.Open strSQL, objDBConn

intExist = objRs(0)
objRs.Close

If intExist <> 1 Then
    Response.Write "해당글이 없습니다."
Else
    '읽은 횟수 증가
    strSQL = "UPDATE board SET intCount=intCount+1 WHERE intSeq='" & intSeq & "'"
    objRs.Open strSQL, objDBConn

    '게시물 SELECTZ
    strSQL = "SELECT strName,strEmail,strSubject,strContent,intCount,strUserIP,blnTag,dtmReg_Date FROM board WHERE intSeq='" & intSeq & "'"
    objRs.Open strSQL, objDBConn

    strName = objRs(0)
    strEmail = objRs(1)
    strSubject = objRs(2)
    strContent = objRs(3)
    intCount = objRs(4)
    strUserIP = objRs(5)
    blnTag = objRs(6)
    dtmReg_Date = objRs(7)

    objRs.Close
    Set objRs = Nothing

    objDBConn.Close
    Set objDBConn = Nothing

    '게시물 출력값에 XSS 필터링
    '사용자가 입력하는 출력되는 값은 strName, strEmail, strSubject, strContent으로 이 부분은 XSS 공격이 가능한 부분들이다.
    '일반적으로 본문만 선택적으로 HTML 태그 사용을 허용하며 나머지 부분들은 사용할 수 없도록 하는것이 바람직하다.
    strName = clearXSS(strName, atag)
    strEmail = clearXSS(strEmail, atag)
    strSubject = clearXSS(strSubject, atag)
    strContent = clearXSS(strContent, atag)
   
    '줄넘김 처리
    strContent = replace(strContent, vbLf, vbLf & "<br>")
%>
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=ks_c_5601-1987">
<title>내용보기</title>
</head>

<body>
<div align=center>
<table border=1>
<tr>
    <td>이름</td>
    <td><%=strName%></td>
    <td>등록일</td>
    <td><%=dtmReg_Date%></td>
</tr>
<tr>
    <td>이메일</td>
    <td><%=strEmail%></td>
    <td>조회</td>
    <td><%=intCount%></td>
</tr>
<tr>
    <td>제목</td>
    <td colspan=3><%=strSubject%></td>
</tr>
<tr>
    <td>내용</td>
    <td colspan=3><%=strContent%></td>
</tr>
<tr>
    <td colspan=4>
    <a href="list.asp">목록으로</a> <a href="edit.asp?seq=<%=intSeq%>">수정하기</a> <a href="delete.asp?seq=<%=intSeq%>">삭제하기</a>
    </td>
</tr>
</table>

</div>  
</body>
</html>
<%
End If
%>



'////////////////////////////////////////////////////////////////////
'//다.  SQL 구문 삽입 가능성
'////////////////////////////////////////////////////////////////////
SQL Injection은 쿼리문의 잘못 해석함에서 발생하는 문제이다. 이를 해결하기 위해서는 쿼리문을 생성시에 입력된 값에 대한 유효성 검사를 수행하면 된다. ‘, “ 문자를 \’, \”로 변경해 주거나 아예 공백으로 처리하는 방법이다.

삭제해야 할 프로시저
xp_cmdshell
xp_stratmail
xp_sendmail
xp_grantlogin
xp_makewebtask


'////////////////////////////////////////////////////////////////////
'//사.  다운로드 취약성
'////////////////////////////////////////////////////////////////////
<!--#include virtual="/include/connection.inc.asp"-->   <% 'DB연결 헤더 %>
<!--#include virtual="/include/secure.inc.asp"-->       <% '보안관련라이브러리 %>
<!--#include virtual="/include/config.inc.asp"-->       <% '전역변수리스트 %>
<!--#include virtual="/head.asp"-->         <% '초기 설정 페이지(에러 메세지 미출력) %>
<%
Dim dn_dir, fname, val_ok
Dim UploadedPath

dn_dir = Request("dir")
fname = Request("fname")    '파일 이름

' IE 5.01에서는 이 방식을 사용할때 메모리 관련 문제가 발생할 수 있다.
strUA = Request.ServerVariables("HTTP_USER_AGENT")
If Instr(strUA, "MSIE") Then
    intVersion = CDbl(mid(strUA, Instr(strUA, "MSIE")+5, 3))

    If intVersion < 5.01 Then
        Response.Write "error"
    End If
End If

if fname = "" Then
    Response.Write "<script-x language=javascript-x>"
    Response.Write "alert(""파일명을 입력해 주세요"");"
    Response.Write "history.back();"
    Response.Write "</script-x>"
End If

dn_dir = UploadedPath & dn_dir
val_ok = Check_Path(dn_dir, fname)

If  val_ok <> "error" Then  '사용자가 다운 받는 파일과 웹서버의 파일 다운로드 경로가 맞는지 비교
    Set objStream = Server.CreateObject("ADODB.Stream") 'Stream 이용

    Response.ContentType = "application/unknown"    'ContentType 선언
    Response.AddHeader "Content-Disposition","attachment; filename=" & fname
   
    objStream.Open
    objStream.Type = 1
    objStream.LoadFromFile val_ok

    download = objStream.Read
    Response.BinaryWrite download
End If

Set objstream = nothing '객체 초기화
%>