하늘높이의 프로그래밍 이야기

항목

HTTP 모듈(HttpModule)

HTTP처리기(HttpHandler, HttpAsyncHandler(비동기))

요청 반응

모든 요청을 프로세싱

특정 확장자(*.ext)에 대해서 프로세싱

사용가능개체

인증,캐쉬,콘텍스트,권한,프로세스,매핑등 모든 작업을 관리

Request, Response, Session, Server 개체 사용가능

이벤트

접근->보안->캐쉬->실행(핸들로)->로깅 등 19가지 이벤트를 후킹

모듈의 HandlerExecute 이벤트에 ProcessRequest 실행

사례

보안,

특정확장자로 제공하는 RSS 피드

통계, 로깅(중앙 집중식 처리 가능)

전용 콘텐츠의 내용을 실시간으로 변경하는 특정 처리기 작성 가능

모니터링 및 제어,

해석기

전역 문자열 치환 등 프로그램을 개발(페이지 파싱후 변경)

  

설정

IIS 관리 메뉴-> 모듈

IIS 관리 메뉴-> 처리기 매핑

설치 경로

/BIN(DLL)

/BIN(DLL)

/APP_CODE(SOURCE CODE)

/APP_CODE(SOURCE CODE)

IIS 6.0 유사기능

ISAPI FILTER(네이티브 코드로만 작성가능)

ISAPI EXTENTION(네이티브 코드로만 작성가능)

사용 예

인증, 압축 모듈 등

.aspx 파일을 해석하는 ASP.NET 페이지 처리기

호출 개체

리퀘스트 발생시 Init 함수 호출

IHttpHandlerFactory
(인스턴스의 수 제한 가능 , DB POOL 작성시 유효)

HTTP 모듈의 요청 처리

  1. BeginRequest - 요청을 만들었음을 신호로 알립니다
  2. AuthenticateRequest - 구성된 인증 메커니즘에서 현재 요청을 인증했음을 신호로 알립니다.
  3. PostAuthenticateRequest - AuthenticateRequest 이벤트 다음에 발생합니다.
  4. AuthorizeRequest - 이벤트는 IIS에서 현재 요청에 권한을 부여했음을 신호로 알립니다.
  5. PostAuthorizeRequest - AuthorizeRequest 이벤트 다음에 발생합니다.
  6. ResolveRequestCache - 인증 이벤트를 완료하여 이벤트 처리기(: 페이지 또는 XML Web services) 실행을 무시하고 캐싱 모듈이 캐시 요청을 처리하도록 하는 경우 발생합니다.
  7. PostResolveRequestCache 이벤트 다음과 PostMapRequestHandler 이벤트 전에 이벤트 처리기(요청 URL 해당하는 페이지) 만들어집니다. 서버에서 통합 모드로 IIS 7.0 실행되고 있으며 .NET Framework 버전 3.0 이상이 있는 경우 MapRequestHandler 이벤트가 발생합니다. 하지만 서버에서 클래식 모드로 IIS 7.0 또는 이전 버전의 IIS 실행되고 있으면 이벤트를 처리할 없습니다.

  8. PostMapRequestHandler - 현재 요청을 적절한 이벤트 처리기에 매핑한 경우 발생합니다.
  9. AcquireRequestState - 현재 요청과 관련된 현재 상태를 가져오는 경우 발생합니다.
  10. PostAcquireRequestState AcquireRequestState 이벤트 다음에 발생합니다.
  11. PreRequestHandlerExecute - 페이지 또는 XML Web services 같은 이벤트 처리기의 실행을 시작하기 바로 전에 발생합니다.
  12. PostRequestHandlerExecute - ASP.NET 이벤트 처리기가 실행을 완료하는 경우 발생합니다.
  13. ReleaseRequestState - 이벤트 처리기 실행을 완료한 발생합니다.현재 상태를 저장 있습니다.
  14. PostReleaseRequestState - 이벤트 처리기의 실행을 완료하고 요청 상태 데이터가 저장된 경우 발생합니다.
  15. UpdateRequestCache - 캐싱 모듈이 캐시의 다음 요청을 처리하는 사용할 응답을 저장하도록 하는 경우 발생합니다.
  16. PostUpdateRequestCache - 캐싱 모듈의 업데이트 캐시의 다음 요청을 처리하는 사용되는 응답의 저장을 완료하는 경우 발생합니다.
  17. LogRequest. - ASP.NET에서 현재 요청에 대한 로깅을 수행하기 직전에 발생합니다.

    이벤트는 IIS 7.0 통합 모드 .NET Framework 3.0 이상에서 지원됩니다.

  18. 이벤트는 IIS 7.0 통합 모드 .NET Framework 3.0 이상에서 지원됩니다.

  19. EndRequest - 요청에 응답할 실행의 HTTP 파이프라인 체인에서 마지막 이벤트로 발생합니다.

    출저: MSDN http://msdn.microsoft.com/ko-kr/library/system.web.httpapplication_events.aspx

 

SQL Injection 처리 이 글을 작성한 지 한 일주일 정도가 흘렀는데…

블로그에 이 키워드로 방문하시는 분이 꽤 많으신 듯…

 

해당 키워드를 다시 찾아보니…

구글에 찾아보니 검색된 사이트가 28300여 개로 늘었다. (허걱 4배나…)

 

구글 검색

 

음 “빵빵용용”님의 새 글(http://saybox.tistory.com/546 )을 읽어 보면 이 공격의 원인도 보이고 해결 방법도 보인다.

 

하지만…

Request 를 받는 모든 소스를 수정한다는 것은…만만한 작업은 아니더라...

지금 사이트도 Request를 검색해보니 4~500개

하지만 이 사이트는 1년에 글 한 개 올라오기 힘든 회사 소개 홈페이지 인데…

그것을 위해 게시판 소스를 다 뒤집자니 시간이 아깝고… 검색된 리퀘스트 문장은 4~500개에 가깝고…

 

그래서 어떻게 편하게 할까 고민해 봤다.

그리고 생각해 난 방법이

이렇게 커넥션 문장 아래에… GET과 POST를 모두 조사해서 DB 문장이 들어오면 에러메시지를 뿌리고 Response.end !!

(사이트 성격에 따라 이렇게 처리해도 무관한 사이트도 있을 것 같아서 올려 봅니다. 참고하세요.!~)

<% 
    Set pConn = Server.CreateObject("ADODB.Connection")

sConnStr = "Provider=SQLOLEDB.1;User ID=" & DB_user_id &

";password=" & DB_user_pass & ";Initial Catalog=" & DB_name &

";Data Source=" & DB_server_name

    pConn.Open sConnStr
    
    	Function DBStringCheck(strRequest,strCompare)
	    if instr(Lcase(strRequest),strCompare) > 0 then

response.Write("오류:입력되지 않아야 할 특수 문자[" &

strCompare &"] 입니다.<BR>관리자에게 문의 바랍니다.")

	    	response.end
	    end if
	End Function
	
	For Each item1 in Request.QueryString
		'//차단할 단어를 입력
		call DBStringCheck(Request.QueryString(item1),chr(39))
		call DBStringCheck(Request.QueryString(item1),"exec")
		call DBStringCheck(Request.QueryString(item1),"select")
		call DBStringCheck(Request.QueryString(item1),"xp_")
		call DBStringCheck(Request.QueryString(item1),"char")
		call DBStringCheck(Request.QueryString(item1),";")

	Next
	For Each item1 in Request.Form
		'//차단할 단어를 입력
		call DBStringCheck(Request.Form(item1),chr(39))
		call DBStringCheck(Request.Form(item1),"exec")
		call DBStringCheck(Request.Form(item1),"select")
		call DBStringCheck(Request.Form(item1),"xp_")
		call DBStringCheck(Request.Form(item1),"char")
          	call DBStringCheck(Request.Form(item1),";")

	Next	 
%>

꼭 바쁜 날 문제가 터지더라~
어쨌든 회사의 홈페이지에 DB를 조회하는 페이지들 스크립트 오류(?)를 내길래 확인해보니
<script src=http://s.ardoshanghai.com/s.js></script> 이런 짱깨의 필이 나는 주소가 잔뜩 들어있더라…...
그래서 구글에 검색해보니…. 헉 7720개….

http://www.google.co.kr/search?complete=1&hl=ko&newwindow=1&q=http%3A%2F%2Fs.ardoshanghai.com%2Fs.js&lr=&aq=f&oq=

(흑 홈페이지 내가 만든 것 아닌데 T.T)
그리하여 찾아보니 http://saybox.tistory.com/453 이렇게 좋은 글이 ^^

저 7720개의 사이트들도 빨리 고쳐져야 할텐데…..

<%

'//Writer: SkyLimit
'//Language: ASP

'파일 경로
TextFilePath = "c:\InetPub\test.ini"'//요부분만 수정하세요.

'//파일 시스템 개체 생성
Set FSO = Server.CreateObject("Scripting.FileSystemObject")
 '//파일 존재 검사
 if fso.FileExists(TextFilePath) then

    '//파일 오픈
    Set f = fso.OpenTextFile(TextFilePath, 1,false,0) '(fname,mode 1:forReading,create,format 0:ASCII)
    Do Until f.AtEndOfLine '파일의 4096 라인까지 읽는다.
   buffer= buffer & f.read(4096)
       loop
    f.close
    Set f = Nothing

    '//문자열 비교
    strArray = Split(buffer,vbcr & vblf)
    For i = 0 To UBound(strArray) - 1
     if InStr(strArray(i),"AAA") > 0 Then
    response.write strArray(i)
     End If
    Next
 else
  '//파일 없음
  response.write TextFilePath & "이 지정된 경로에 없습니다."
 end If
 
Set FSO = Nothing
%>

'Web Tech > ASP.NET,ASP' 카테고리의 다른 글

IIS7 - HTTP 모듈과 HTTP 처리기 비교  (0) 2009.05.07
IIS7 - HTTP 모듈 이벤트 순서  (0) 2009.05.07
SQL Injection 처리 2  (2) 2008.11.13
SQL Injection 처리  (2) 2008.11.06