1. Orc 문제 풀이

 

 

Orc이다.

 

 

 

문제를 보게되면 중간에 보이는 

 

$_GET[pw] = addslashes($_GET[pw]); 

을 기준으로 2번 검증을 하고 있다.

 

if($result['id']) echo "<h2>Hello admin</h2>"

 

를 통해서 입력한 id가 존재하면 Hello admin이라고 출력하고있으며 (admin이 아닌 데이터베이스에 존재하는 모든 id에 대해서)

 

if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc"); 

 

를 통해서 입력한 pw가 실제 데이터베이스의 값과 같으면 해결이 된다. ( 정확한 pw를 구하라는 의미 )

 

일단 입력되어있는 Query가 id='admin' and pw='{$_GET[pw]}'"이기 때문에 pw의 값을 무조건 참을 만들어야 Hello admin이라는 출력값이라도 받을 수 있을 것이다.

 

 

 

이미 입력되어있는 id='admin'은 그대로 놓고, pw에 'or '1'='1'# 라고 입력을 해서 pw값이 무조건 참이 되게 만들었다.

 

Hello admin이라는 답은 얻었다. 이제 pw를 구해야한다.

 

어떻게 구해야 할까?? 일단 비밀번호에 대한 아무런 자료가 없기 때문에 비밀번호의 길이부터 구해야 할 것이다.

 

LENGTH라는 함수를 사용할 수 있다. LENGTH 함수는 이름 그대로 특정 변수의 길이를 출력하는 함수이다.

 

사용법은 다음과 같다.

 

LENGTH(변수)

 

 

 

자, length함수를 사용해서 입력해 보았다. length(pw) > '1' 이라고 입력 했는데 그대로 Hello admin이라고 출력이 되었다는 것은 pw의 길이가 1보다 크다는 조건이 참이라는 것이다.

 

만약 조건이 참이 아니게 주면 어떻게 될까?

 

 

 

물론 Hello admin이 나오지 않는다. 이 결과 값을 이용하여 차근차근 pw를 유추해가면 되는 것이다.

 

아 당연히 length(pw)='1' 이런식으로 해도 된다. 그렇지만 만약, 만약에 pw의 길이가 200이라고 해보자. ㅎㅎ;;; 부등호로 범위를 줄여가기 위해서 부등호를 사용한 것이다.

 

 

이렇게 몇차례 시도를 해본 결과 비밀번호가 8자리라는 것을 알게 되었다.

 

이제 비밀번호의 길이는 알았고 정확히 무엇이냐를 알아야한다. 이럴 때 sql인젝션에서 많이 사용하는 함수가 substr 함수이다.

 

 

 

substr함수는 문자열이나 변수에서 특정번째 부터 특정 길이만큼 자르는 함수이다.

예를들어서

 

substr('HELLO',2,2)

 

라고 하게되면

 

HELLO라는 문자열의 2번째 E부터 2개 만큼 자르겠다. 라고 해서 결과는 "EL"이 된다.

 

자, 이제 이걸 어떻게 쓰느냐. 우리에겐 우리의 질의가 정답인지 아닌지 알려주는 HELLO ADMIN이라는 출력값이 있다.

 

substr(pw,1,1) = '1' 이라고 한다면 pw의 첫번째 글자가 '1'이 맞는지 알아 낼 수 있다는 것이다.

 

패스워드의 범위를 모르기 때문에 숫자만인지, 문자도 합쳐져있는지, 특수문자가 있지는 않는지, 알 방법이 없다.

 

내가 처음 풀었을 때에는 substr(pw,1,1) substr(pw,2,1) substr(pw,3,1) 등을 일일이 풀었다. 힘들었지만 해결은 했다.

 

풀 수는 있다. 비밀번호는 문제를 아직 풀지 않은 독자를 위해 가려놓겠다.

 

 

그리고나서 워낙 경우의 수가 많다보니까 파이썬을 이용해서 자동화로 입력하고 결과를 받는 짧은 소스를 만들었었다.

 

만약 파이썬과 같은 언어를 조금 해본 경험이 있다면 어떤식으로 만들어야할지 금방 생각날 것이다.

 

현재 내 개인서버에서 LOS를 돌리지 않고 있어서 보안상 접속이 잘 안되고있지만.. 후에 개인서버로 LOS를 돌리게 된다면 소스 검증을 통해 사용할 수 있게 업로드 할것이다.

 

 

--------------------------------------------------------------------------------------------------------------------------------------------------

본 게시물은 공부한 내용을 바탕으로 작성한 글로써, 점차 수정 및 추가를 통해 내용을 발전시킬 계획입니다.

따라서 오타 및 내용상의 오류, 추가할 내용 등이 있을 경우 주저 없이 알려주시면 감사하겠습니다.

궁금한점을 물어보시면 제가 아는 선에서 최대한으로 알려드리겠습니다.


 

'Wargame & CTF. > LOS(The Lord Of the SQL)' 카테고리의 다른 글

[LOS] 3. Goblin 문제 풀이  (0) 2016.11.10
[LOS] 2. Cobolt 문제 풀이  (0) 2016.11.09
[LOS] 1. Gremlin 문제 풀이  (2) 2016.11.03

한국사이버감시단(KCGA), 정보보안관제사 2급 제1회 필기시험 실시

[보안뉴스 원병철 기자] 전문화된 보안인력 양성이 시급한 이때 보안관제 전문 인력을 위한 관제사 시험이 개최되어 눈길을 끌고 있다. 한국사이버감시단은 지난 12일 정보보안관제사 2급 제1회 필기시험을 서울, 대전, 부산의 전국 3개 지역에서 동시에 실시했다고 밝혔다.

▲ 지난 11월 12일(토)에 정보보안관제사 2급 제1회 필기시험이 서울, 대전, 부산의 전국 3개 지역에서 동시에 실시되었다.


정보보안관제사는 지난 2016년 7일 7일 한국직업능력개발원으로부터 등록(제 2016-003176 호)된 민간자격증으로, 올해 처음 실시된 제1회 정보보안관제사 자격검증 2급 자격증을 취득하게 되면 ‘국가사이버안전관리규정 제10조의2에 따른 지정’된 14개 보안관제 전문업체와 정보보안 관련 업종에 취업하는 데 매우 유리하다.

한국사이버감시단 공병철 대표는 “정보보안관제사는 정보보안관제 분야 국내 최초의 민간자격증으로써 사물인터넷(IoT)과 드론 등 차세대 산업을 이끌어나갈 융합형 보안인력 양성을 목표로 하고 있다”면서 “특히 국내 정보보안 인력은 수요와 공급의 불균형이 심각한 상태로, 민간영역에서 정보보안관제사를 양성해 공공기관과 기업에게 숙련된 보안관제 인력이 유지 될 수 있도록 지원함으로써 안정적인 근무환경과 처우를 개선하는 데 정보보안관제사 자격증이 도움이 될 것”이라고 강조했다.


한편, 정보보안관제사 자격증은 1, 2, 3급과 필기시험과 실기시험으로 나누어진다. 응시자격은 1급은 4년제 대학 졸업, 2급은 전문대학 졸업, 3급은 제한이 없으며, 시험과목은 1급의 경우 이론 시험은 보안관제 일반, 보안관제 기술, 보안관제 운용, 취약점 진단 기술, 침해사고 분석 기술 등 5과목을 평가하고 실무시험으로 주관식 필답형, 기술실무를 평가한다. 2급은 이론시험의 4과목과 실무시험을 평가하고, 3급은 이론시험 3과목만을 평가한다.

정보보안관제사 자격검정 시험은 사단법인 한국사이버감시단(www.isc16.com)이 주최하고, 주식회사 에스링크가 시행한다. 자격검증 시험문의는 사단법인 한국사이버감시단으로 문의하면 된다.
[원병철 기자(boanone@boannews.com)]

<저작권자: 보안뉴스(www.boannews.com) 무단전재-재배포금지>



==================================================================================================


정보보안관제사 민간자격증이 새로 생겼다.

음... 난 잘 모르겠다..

아직 보안분야 실무자도 아니고, 자격증에 대해 많이 아는 부분은 없지만 이 자격증을 취득했다고 기업에서 "아, 이 사람은 관제업무를 수행할 수 있는 능력이 있는 사람이구나" 라고 생각을 할지가 의문이다.

IT나 보안이나 실력을 더 높게 평가하고 능력위주의 싸움인데, 이런 자격증을 만들기보다는 실무 관제 업무를 학습하고 경험해볼 수 있는 환경을 더 만드는 것이 효율적이지 않을까 생각이 든다.

비단 관제뿐만이 아닌 전체 보안분야에 통틀어서도 주변의 학생들과 현업에 종사하는 실무자들도 취업전에 배우는 내용과 취업후에 배우는 내용이 차이가 많다고 하고, 그럴 수 밖에 없다고 생각을 하는데, 그럼에도 불구하고 취업 후 업무에 응용할 수 있는 실무교육을 배울 수 있는 환경은 열악하다.

물론 이 자격증을 취득하기위해 공부하며 관제 업무에 대한 내용과 이론적인 이해는 가능할지 몰라도 시간이 지나 이 자격증이 안정화가 되고, 많은 관제관련 사람들이 취득하게 되어도 그냥 많은 양산형 자격증 중 일부가 되지 않을까 하는 생각이 조심스럽게 든다.


=====================================================================================

본 카테고리의 게시물은 보안과 관련된 인터넷 뉴스사이트에서 발췌한 글과 함께 저의 의견을 작성한 내용입니다.

무단으로 배포할 경우 저작권 법에 의해 처벌받을 수 있으니 조심하시기 바랍니다.

 

기사 출처 : 보안뉴스(www.baoannews.com)

기사 원본 주소 : http://www.boannews.com/media/view.asp?idx=52339&skind=O

기사 저작권자 : 보안뉴스



1. 고블린 문제 풀이

 

<고블린>

 

자, 이제 3번째 고블린이다.

 

 

 

고블린의 문제는 위와 같다.

 

if(preg_match('/prob|_|\.|\(\)/i'$_GET[no])) exit("No Hack ~_~"); 
if(
preg_match('/\'|\"|\`/i'$_GET[no])) exit("No Quotes ~_~"); 

이전문제들와 같이 [prob|_|.|\] 를 사용하는 쿼리문에 대해 필터링을하고,(문제 이외의 데이터베이스에 대한 접근을 막기 위해)

이번에 새롭게 나온 필터링이 있다. [ ' | " | ` ] 이러한 Quotes(따옴표) 문자들을 필터링한다.

그리고 쿼리문은

 

$query "select id from prob_goblin where id='guest' and no={$_GET[no]}";

 

위와 같이 id는 'guest'로 잡혀있고, 우리가 입력할 수 있는 변수는 no이다.

그리고 이 문제의 해결 조건은 id가 admin이 되어야 한다.

 

자, 일단 우리가 입력해야하는 id는 guest가 아니라 admin이므로 이전에 이용했던 방법들을 이용하여 id='guest' 부분을 무력화시키자.

 

no 변수에 1을 넣은 결과이다.

Hello guest라는 문장이 뜬것으로 봐서 guest의 no는 1이라는 것을 알 수 있다.

이렇게 되면 id='guest'를 무력화 시킨다는 의도는 실패한 것이다.

그럼 no에 1이 아닌 다른 값을 넣어야한다.

지금은 운이 좋아서 guest의 no가 1이라는 걸 알아서 1이 아닌 값을 집어넣으면 id='guest' and no={$_GET[no]} 부분을 무력화 시킬 수 있겠지만,

guest의 no가 1이라는걸 모르는 상태에서 쿼리문을 확실히 무력화시키기 위해서는 의미없는 값을 집어넣는게 좋다.

예를들어 no에 32948239라는 값을 집어넣으면, 그 데이터베이스에 no가 32948239라는 번호를 가지고 있을 확률이 얼마나 될까.. 거의 없을 것이다.

 

no에 임의의 값을 집어넣으니 Hello guest라는 말이 사라졌다.

id='guest' and no={$_GET[no]}"의 조건이 올바르지 않다는 것을 알 수 있다.

 

자, 이제 id에 admin을 넣어 문제를 해결해 보자.

 

id = admin을 입력해보았다.

참고로 이 문제에서는 따옴표에 필터링이 걸려있기 때문에 'admin'이 아니라 그냥 admin을 써보았다.

그랬더니 해결이 되지 않는다.

아마 'admin'은 문자열 스트링으로 받아들이는데 그냥 admin으로 쓰게되면 문자열이 아닌 변수명으로 인식해서 그러는 것 같다.

만약 따옴표를 사용한다면?


문제의 6번째 줄(따옴표 필터링)에 의해 위와 같은 글이 나오게된다.


이제 따옴표 필터링을 우회해보자.

일반적으로 어떠한 문자가 막혔을때 URL인코딩을 사용하여 우회한다.

예를들어 2번문제에서 사용한 #(주석처리)를 우회하기 위해서 %23이라는 URL 인코딩 값을 사용하였다.

이와같이 '를 URL 인코딩을하면 %27이다.

%27을 사용해서 입력해보자.



이렇게 입력을 하게되면?


결과는 같다... %27도 내부적으로 필터링이 되어있는 듯 하다.


다음방법은 admin이라는 문자를 hex(16진수) 값으로 입력하는 것이다.

이 방법은 스트링 우회법인데 내가 원하는 문자열이 필터링되었을 경우 사용하는 법이다.

데이터베이스마다 다를 수 있겠지만 0xXXXXXX 라는 값(헥사값)이 입력이 되면 '스트링'으로 인식을 하게 된다.

자 admin을 16진수 값으로 바꾸게되면 "0x61646d696e"이다. 이를 이용하여 입력해보자.




해결이 된 것을 볼 수 있다.

우리가 0x61646d696e에 따옴표를 붙이지 않았지만, 이 헥사값 자체를 변수로 인정하지 않고 문자열로 받아들이기 때문에 문제가 해결 된 것이다.


문제 하나하나 풀면서 필터링들을 어떻게 우회해야하는지 점점 알아가는 기분이다.


--------------------------------------------------------------------------------------------------------------------------------------------------

본 게시물은 공부한 내용을 바탕으로 작성한 글로써, 점차 수정 및 추가를 통해 내용을 발전시킬 계획입니다.

따라서 오타 및 내용상의 오류, 추가할 내용 등이 있을 경우 주저 없이 알려주시면 감사하겠습니다.

궁금한점을 물어보시면 제가 아는 선에서 최대한으로 알려드리겠습니다.



'Wargame & CTF. > LOS(The Lord Of the SQL)' 카테고리의 다른 글

[LOS] 4. Orc 문제 풀이  (3) 2017.01.06
[LOS] 2. Cobolt 문제 풀이  (0) 2016.11.09
[LOS] 1. Gremlin 문제 풀이  (2) 2016.11.03

+ Recent posts