제품 정보
SQL Power Injector 는 penetration test시 웹사이트에 대한 SQL injectioin을 탐지해 'exploit'하는 것을돕기 위해 .Net 1.1기반으로 개발된 프로그램입니다.
현재는 SQL Server, Oracle, MySQL, Sybase/Adaptive Server, DB2 compliant 에서 쓸 수 있지만 인라인 인젝션(normal mode)을 이용하면 어떤 DBMS에도 사용 가능합니다. Normal mode는 기본적으로 매개변수에 입력해 서버로 보내는 SQL 명령어이니 말입니다.
인라인 SQL injection의 양상이 그 자체로 효과적이라면 인젝션의 멀티스레드 자동화 기능은 주요한 강점이 될 것입니다. 지루하고 시간만 잡아먹는 쿼리들을 자동화 할 수 있을 뿐 아니라 필요한 사항만을 얻을 수 있게끔 쿼리를 수정할 수도 있습니다. SQL injection 취약점을 공격하는 다른 여러가지 방법들은 결과가 웹페이지에 보여질 때 훨씬 빠르고 멋져보이지만 이 방법은 blind SQL injection에서 단연 효과적입니다. (한 예로 HTML 테이블에서 union select하면 에러가 500개가 생깁니다.)
두가지 방법으로 자동화를 할 수 있습니다 : 예상 결과들을 서로 비교하거나 시간 지연을 이용하는 방법입니다. 첫번째 방법은 일반적으로 에러나 긍정적 조건과 부정적 조건 사이의 차이를 대조 확인하는 것입니다. 두번째 방법은 시간지연이 서버로 보내졌을 때 어플리케이션의 매개변수와 일치하면 긍정 신호를 보내는 것입니다.
가장 중점을 둔 부분은 브라우저를 사용하지 않고도 SQL injection 취약점을 찾아내고 공격하는 가장 쉬운 방법을 찾는 것이었습니다. 그것이 바로 인젝선 결과를 보여주는 통합 브라우저가 있는 이유인데 연관된 어떤 표준 SQL에러라도 페이지의 나머지 부분 없이 매개변수화 하여 보여줍니다. 물론 서버를 가능한 수다스럽게(응답을 많이 하도록)만들기 위해 매개변수화 하는 방법은 이것 말고도 있습니다.
또 다른 주요한 부분은 GET method로 하건 POST method로 하건 SQL injection을 테스트 하고자 하는 웹페이지에서 모든 매개변수를 얻어내는 힘입니다. 데이터를 가로채기 위해 어플리케이션이나 프록시를 이것저것 사용할 필요 없이 모든 것이 자동화 되어 있습니다! 뿐만 아니라 이제는 Firefox plugin에서 session context(매개변수와 쿠키들)를 포함한 현재 웹페이지의 모든 정보가 들어있는 SQL Power Injector를 불러올 수도 있습니다.
사용성을 높이기 위해 많은 노력을 기울였음에도 불구하고 프로그램을 처음 사용하게 되면 쉽지 않은 부분이 있을수도 있을 것 입니다. 그러나 몇가지 사항만 이해하고 나면 꽤 사용하기 쉬울 것이라고 자신있게 말할 수 있습니다. 초보자들의 기본적인 사항에 대한 이해를 돕기 위해 Tutorial을 만들었는데 이를 통해 고급 SQL injection 기술에 대해 배울수도 있을 것입니다. FAQ에서는 몇몇 유용한 트릭들도 볼 수 있을 것이며 help file(chm) version 1.2에는 많은 유용한 SQL injection 정보들을 담고 있습니다.
내가 직접 pen testing과 SQL injection을 하던 방식으로 이 프로그램을 디자인 했습니다. 여러 실제 웹사이트를 통해 성공적으로 테스트를 거쳤고(물론 합법적으로) 무언가 미흡한 점이 보일 때 마다 계속해서 추가하고 있습니다. 물론 지금은 보안 업계에서 공식적으로 사용가능한 만큼 좀 더 엄격한 기준을 가지고 새로운 버전이 나올 때 추가하도록 해야 할 것입니다. 이 작업은 이미 진행중이고 많은 새로운 기능들이 시간을 가지고 추가 될 것입니다.
마지막으로, 이 프로그램은 무료로 제공될
것이며 보안 전문가들의 보안 평가시 또는 사용하는 기술 지식을 발전하고자 할 때 도움이 되기를 바랍니다.
이 프로그램으로 SQL injection취약점을 찾지 못할 수도 있지만 하나를 찾으면 적당한 syntax를 찾아낼 수 있습니다. 가장 주요한 강점은 좀 더 쉽게 취약점을 찾아내는 것이고 일단 찾아내면 그것을 자동화 함으로써 blind 기술을 사용한 인젝션만 가능한 경우에 매번 인젝션을 할 필요가 없게 하는 것입니다.
이미 많은 프로그램들이 존재하기 때문에 데이터베이스 추출 프로그램을 만들고자 의도하지는 않았습니다. 대부분의 추출된 자료들은 유의미하지 않고 데이터를 추출하는데 시간이 많이 소요되기 때문에 시간이 낭비 되기 쉽상입니다. 데이터를 정제해서 꼭 필요한 것만을 얻는 것이 휠씬 현명한 선택입니다.
마지막으로, HTML 형태로 결과를 얻기위해 미니 브라우저를 추가했는데 이것은 전문적인 브라우저의 모든 기능을 포함하고 있지는 않습니다. Internet Explorer나 Mozilla 등의 여러 브라우저들은 정말로 복잡한 소프트웨어이고 그 모든 기능을 이 프로그램에서 구현하는 것은 거의 불가능에 가깝기 때문입니다. 그래서 비록 비슷한 형태와 느낌이더라도 이 프로그램을 일반적인 브라우저와 동일하게 사용하지는 못할 것입니다.
위로- Windows, Unix, Linux 운영체제를 지원함
- SQL Server, Oracle, MySQL, Sybase/Adaptive Server, DB2와 호환
- SSL 지원
- Form이나 웹페이지의 IFrame으로부터 변수를 자동으로 가져옴(GET 이나 POST)
- frameset을 감지하고 검색
- 웹사이트의 언어를 자동으로 감지하는 옵션
- Load Page process 중 사용된 쿠키를 감지해 추가(Cookie detection 설정)
- GET이나 POST method를 이용해 서로 다른 색상으로 표시되어 있는 제출된 페이지를 자동으로 찾아냄
- 호출된 문자열, 쿠키, 매개변수들을 Datagrid안에서 직접 생성/수정/삭제할 수 있음
- 단일 SQL injection
- Blind SQL injection
- 페이지의 true/false나 쿠키의 결과를 비교
- 시간 지연
- 사용자 정의 브라우저에서 SQL injection응답
- 리턴된 페이지의 HTML 소스코드를 HTML 문맥에 맞는 색상으로 표시해 보여주고 검색도 가능함
- 세부 조정된 매개변수들과 쿠키 인젝션
- 결과의 길이와 개수를 매개변수화하여 프로그램이 SQL injection을 하는데 걸리는 시간을 최적화
- ASCII 문자 프리셋을 생성/수정해서 blind SQL injection시 요구와 속도를 최적화
- 멀티스레드(50까지 설정 가능함)
- IDS 나 필터 검출에 대비해 빈칸을 빈 주석 /**/으로 대체하는 옵션
- 보내기 전에 특수문자를 자동으로 인코딩
- 응답 페이지에서 미리 정의된 SQL 에러를 자동으로 감지
- 응답 페이지에서 미리 정의된 단어나 문장을 자동으로 감지
- 실시간 결과
- XML file로 세션 저장, 불러오기
- Positive 응답이 온 페이지와 negative 응답이 온 페이지 사이의 차이점을 자동으로 찾아내는 기능
- blind SQL 인젝션 문자열 안의 변수 (<<@>>) 를 대체할 범위 목록 생성 가능
- 텍스트 파일에 미리 정의된 목록에서 자동으로 변수범위를 재설정
- Firefox plugin에서 세션 컨텍스트(매개변수와 쿠키)를 포함한 현재 웹페이지의 모든 정보와 함께 SQL Power Injector를 불러올 수 있음
- 두가지 통합된 도구 : Hex 그리고 Char 인코더와 MS SQL @options interpreter
- 참조자 편집 가능
- User-Agent 선택 가능( User-Agent XML file에서 새로 만드는 것도 가능)
- Setting창에서 프로그램 구성을 설정할 수 있음
- 설정가능한 proxy들을 지원
위로
솔직히 말해 다른 Tool들의 모든 세부사항들을 확인하지는 않았습니다. 단지 말하고자 하는 것은 그것들도 좋은 Tool이겠지만 SQL injections을 할 때 필요한 중요한 무언가가 항상 빠져 있었다는 것입니다.
어떤 프로그램은 가끔 잘못된 Positive결과를 도출하는SQL injection을 찾아주기도 합니다. 어떤 것들은 그냥 데이터베이스에서 데이터를 그대로 뽑아오기도 합니다. 그 중 몇몇은 좀 더 나아서 데이터베이스 목록을 뽑아냈을 때 필요한 것인지를 검토해 볼 수 있습니다. 아니면 현재 DB 사용자들이 하는 것 처럼 특정한 하드코드 데이터를 요청할 수도 있습니다.
하지만 제가 아는 한 그 누구도 원하는 것을 구체적으로 특정해서 요구할 능력은 갖고 있지 못합니다. 그런 능력을 갖추려면 대가가 필요합니다. SQL syntax를 알아야 하기 때문입니다. 하지만 한번 원리를 이해하게 되면 그렇게 많은 syntax가 필요하진 않다고 장담합니다.
또한 시간지연 특성을 적용한 프로그램을 본 기억도 없습니다. 시간지연 기술을 적용하지 않고 SQL injection 취약성을 exploit하기는 거의 불가능합니다. 수동으로하면 정말 지루하고 시간이 많이 걸려서 몇시간에 걸쳐 명령어를 복사, 붙여넣기 하다가 포기해 버리기 마련이지요.
또한 시간을 절약하는데 가장 중요한 멀티스레드를 사용한 사례도 보지 못했습니다. Blind SQL injection에서 25%의 시간절약 효과가 있는ASCII 문자 프리셋 기능도 마찬가지입니다.
SQL Power Injector를 배포하기 전해 이러한 방식들을 사용해 프로그램을 만들고 배포한 이가 있다면 미리 사과의 말씀을 드리는 바입니다. 연락을 주시면 해당 부분을 수정하도록 하겠습니다.
차이점 요약:
- 웹페이지 문자열과 쿠키 매개변수 자동 탐지
- 세부 조정된 매개변수 SQL injection 매개변수 SQL injection
- 시간지연 기능
- 멀티스레드 기능
- 사용자 정의 브라우저의 응답 결과
- positive/negative 조건 발견을 자동화
- Blind SQL injection 문자 프리셋 최적화기
이 프로그램에서 사용된 두 가지 기술을 보여주는 두개의 screenshot이 있습니다 : Normal 과 Blind.
Screen 1: SQL Power injector with Normal technique
Screen 2: SQL Power injector with Blind technique
어떠한 과학적인 방법을 사용한 것이 아니기에 이 통계치를 과학적인 사실로 받아들이기 보다 당신의 기대치를 가늠해 볼 수 있는 일반적인 것으로 생각해 주시길 바랍니다. 특히 누구도 인터넷을 통한 유출을 통제하지 않기에 어떠한 의미있는 과학적인 데이터를 제공하도록 압박을 받을 것 같습니다. 또한, 이 수치의 목적은 당신이 기대할 수 있는 근사치를 보여주는 데 있기에 진정한 통계학적인 표본을 갖기에 충분한 양의 테스트를 거치지는 않았습니다.(각 스레드 당 10회)
게다가, 우리가 찾는 데이터의 크기에 따라 달라질 것입니다. 때로 스레드 수가 많은 것보다 적은 것이 더 효과적일 때도 있습니다. 사실, 변수의 길이로 스레드의 수를 나눌 수 있다면 걸리는 시간이 최적화 될 것입니다. 길이가 24라면 3,4,6,8이 다른 수 보다 더욱 빠를 것입니다. 모든 스레드 사이의 더 큰 시간 차는 어림잡아 1에서 2입니다. 여기에서 보듯이 크다고 항상 좋은 것은 아닙니다. 아래의 통계치에서 몇가지 예를 볼 수 있을 겁니다.
스레드 개수를 50까지 올릴수는 있지만 10개 이상이 되면 에러가 발생하고 점점 더 느려지기 시작합니다. 다시 말하지만 스레드 수가 많다고 더 좋은 것은 아닙니다. 스레드 수가 많으면 웹어플리케이션과 충돌이 생길 가능성도 높아진다는 점을 경고해 두어야 겠습니다.(웹 서버나 데이터베이스)
자신의 웹 서버를 테스트 해 볼수 있게 허락해 준 Nathaniel Felsen에게 감사하다는 말을 전합니다.
테스트 시 사용된 컴퓨터 사양 :
- AMD Athlon (tm) 64 X2 Dual
- Core Processor 4200+ GHz
- 2GB RAM
- Windows XP SP 2
- ADSL 1 MB/s
- Ping 평균 응답시간 173 ms
positive 응답 옵션으로 실행
|
|
||||
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3초 타임 딜레이 시켰을 경우
|
|
||||
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Copyright © 2006-2014 Francois Larouche
