1. 코볼트 문제 풀이


<코볼트>



코볼트의 문제는 위와 같다.

쿼리문이 


$query "select id from prob_cobolt where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')"


이라고 되어있다.

우리가 값을 집어넣을 수 있는 변수는 id와 pw이다.

그리고 문제 해결 조건은


if($result['id'] == 'admin'solve("cobolt");


위와 같이 id가 admin이면 된다.


일단 변수를 아무 값이나 넣어보자.

id에 1과 pw에 1을 집어넣은 결과이다.

id는 정상적으로 들어가지만 pw에 집어넣은 값은 md5('') 함수 안에 들어가게된다.


우리는 1번 문제를 풀때 패스워드를 무조건 참으로 만드는 방법으로 풀었다.

하지만 이 같은 경우에는 우리가 무슨 값을 넣어도 입력 값이 md5함수에 의해 해쉬값으로 변하게 되므로 의미가 없다.

그럼 생각할 수 있는 방법은 md5함수를 무력화 시켜야 한다는 것이다.


우리가 pw에 ')를 집어넣으면 어떻게 될까?

결과는 이렇다.


')를 집어넣게 되면 md5함수가 닫히고, 그 뒤에 우리가 원하는 값을 집어넣을 수 있게된다.


그럼 이제 1번 문제처럼 id='1' and pw=md5('') 의 and좌우 모두 참일 리는 없으니까(설마 비밀번호가 md5('')의 결과일까..)

id='1' and pw=md5('')구문은 무시가 되고, 뒤에 우리가 새로운 조건을 만들면 된다.


1번과 같이 비밀번호가 무조건 참이되게끔 만들어보자.



자.... 일단 이렇게 되면 비밀번호가 무조건 참인 id가 추출이 된다. 하지만 맨 뒤의 ')가 거슬린다.


')때문에 문장에 오류가 생겨 결과가 나오지 않는것이다.


그럼 ')를 주석처리를 해보자.


오라클 기반에 주석처리는 #을 사용하면된다. (참고로 Mysql은 --이다.)

아, 그리고 입력할때 #라고 써주면 필터링에 의해 안되는 듯하다.

따라서 URL인코딩을 한 값인 %23을 넣어주면 #으로 인식된다. (URL인코딩도 필터링 우회 기법 중 하나이다.)


자, 문장의 뒤에 #를 붙여 그 뒤의 ')가 주석처리되어 무시된다.

그에 따른 결과는 위와 같이


안녕 루비야? 넌 어드민이 아니야...


....ㅎㅎ;;


누구세요;;


자, 우리가 pw의 값을 참으로 만들었지만 무조건 admin이 나오라는 의미는 아니다.

왜냐하면 id=admin이라고 지정해 주지 않았기 때문이다.

그렇기에 데이터베이스상에 존재하는 수많은 id중 하나가 나오게 되는것이다.

(어떠한 방식에 의해서인지는 잘 모르겠다. 데이터베이스마다 차이가 있을수도 있고..)


그럼 이제 id를 지정해주자.

id는 admin이고, pw는 무조건 참인 값을 가져오면 된다.



결과는 만족스럽다.



*참고로 이런식이 아닌 간단히 푸는 방법도 있다.


문제 해결 조건은 id=admin이다. 이번 문제를 해결할때에는 pw의 값은 중요하지 않다.

그렇다면 id에 admin을 넣어보고, 그 뒤의 값은 다 무시하게하면 어떻게될까? 


단순히 변수 id에 admin을 넣고 #을 붙인것 뿐이다. (pw에는 값을 넣지 않았다.)

그럼 where id='admin' 이라고만 판단하기 때문에 admin의 id를 SELECT 문에 의해 출력된다.


참고로 실무에서는 주석처리가 잘 먹히지 않는다고한다. 하지만.. 먹히는데는 먹히겠지..


자신이 알고있는 SQL 쿼리문을 잘 이용해 보다 쉽게 우회하는 방법을 찾는것이 SQL 인젝션을 학습하는 목적이 아닐까싶다.



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

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

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

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

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

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

온라인 범죄자들, 한 번에 수천 개 가짜 사이트 만들어
범죄 사이트 하나하나 삭제하는 건 거의 ‘아무런 소용없어’

[보안뉴스 문가용 기자] 악성 웹 사이트를 폐쇄하는 건 임시방편일 뿐이다. 범죄자들 입장에서는 그저 다른 주소를 하나 파서 새로운 사이트를 만들면 그만이기 때문이다. 이에 몇몇 전문가들이 DNS 분석을 통해 좀 더 ‘근본적인’ 소탕을 할 수 있도록 하는 방법을 연구했다. 이 전문가들은 파사이트 시큐리티(Farsight Security)의 CRO인 앤드류 류만(Andrew Lewman), 사이벨엔젤(CybelAngel)의 CTO인 스티븐 케로디(Stevan Keraudy)다.

이 연구에 대해 류만은 “온라인 범죄 네트워크를 적발하기 위해 네트워크 과학이라는 접근법을 활용해 본 시도”라고 설명한다. DNS 요청을 시각화하고 분석해 수상한 웹 사이트들의 공통 쓰레드를 발견해내고자 한 것으로, 두 사람은 수천 개의 가짜 웹 사이트를 DNS 캐시 미스 요청을 통해 걸러내고, 수백 개의 도메인 이름을 추려내 한 개의 범죄 조직을 발견하는 데에 성공했다고 한다.

“온라인 범죄 소탕의 가장 큰 문제점은, 범죄자들의 자원이 풍부하다는 겁니다. 그냥 웹 사이트 하나 둘 없어지는 건 그들에게 전혀 걸림돌이 되지 않습니다. 폐쇄를 예상하고 한 번에 몇 천 개씩 만들어냈다가 타이밍 맞춰 하나씩 온라인에 공개하는 게 그들의 공격 패턴입니다. 우리가 하나 찾아내서 닫았다고 축배를 들 때 그들은 미리 예비해둔 수천 개 웹 사이트 중 하나를 온라인으로 전환하면 끝입니다.” 케로디의 설명이다.

이 시스템이 사실이라면 웹 사이트를 하나하나 거둬내는 건 전혀 쓸모가 없는 방법이라고 볼 수 있다. 인터넷의 창시자이자 DNS 전문가인 폴 빅시(Paul Vixie)도 얼마 전 이 점을 깨닫고 ‘웹 사이트를 온라인화 시킬 때 유예 기간이 필요하다’고 주장한 바 있다. 웹 사이트를 온라인화 시키는 걸 누구나 할 수 있으니 범죄자들의 행위를 잡아낼 수가 없다는 것이 그 이유였다.

류만과 케로디는 파사이트에서 제공하는 패시브 DNS(Passive DNS) 서비스를 사용해 이 연구를 진행했다. 패시브 DNS 서비스를 가지고 실시간으로 응답 데이터를 수집했다고 한다. 또 사이벨앤젤의 웹 크롤링 기술과 데이터 분석 알고리즘을 활용해 가짜 도메인 이름들이 온라인화 될 때마다 잡아냈다. “패시브 DNS를 전환시켜 흔히 가짜 이름 생성에 활용되는 브랜드와 같은 것들을 시각화했습니다. 시각화란 한 마디로 말해 저희가 설정한 정보 검색 및 자료 수집을 한 기계가, 인간이 알아들을 수 있는 언어로 전환하는 것을 말합니다.”

이렇게 하니 악성 및 범죄에 활용되는 웹 사이트들이 뭉텅이로 ‘시각화’되었다. 그리고 이 뭉텅이 뭉텅이들을 추적해 그 뿌리가 되는 조직 자체에 다다를 수 있었다. “이 시점에서는 법적인 조치를 취할 수 있게 됩니다. 예를 들어 유명 브랜드의 웹 사이트인 것처럼 꾸며놓은 범죄 사이트를 오리지널 브랜드 보유 회사에서 고소할 수 있게 되죠. 범죄 조직을 정확히 겨냥해서요.”

수상한 웹 사이트들에는 크롤러를 작동시킨다. 적발보다는 가시화 작업 혹은 뿌리 추적을 위한 최대한의 정보를 수집하는 역할을 수행한다. “전화번호, 이메일, 후이즈 관련 정보들을 최대한 수집하는 것이죠.” 그렇지만 이 방법을 활성화시킨다고 해도 범죄 척결이 금방 이루어질 것이라고 보이지는 않는다고 두 전문가는 입을 모은다. “범죄와의 싸움은 오프라인이든 온라인이든 영원한 술래잡기거든요. DNS 분석을 통해 뿌리에 있는 범죄 조직을 밝혀내고 법적인 조치를 취해서 그들을 가둔다고 해도, 다음 범죄 집단이 나타나 이 방법을 무용지물로 만들 겁니다.”

두 전문가는 자신들이 직접 실험해본 이 ‘DNS 분석으로 범죄 집단 추적하기’를 블랙햇 유럽 행사에서 자세하게 공개할 예정이다. 본지도 후속기사가 공개되는 대로 전달할 예정이다.
Copyrighted 2015. UBM-Tech. 117153:0515BC
[국제부 문가용 기자(globoan@boannews.com)]

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

 

 

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

 

본 기사를 접하고 나서 굉장한 공감을 하였다.

범죄자들이 웹사이트를 이용하여 어떠한 범죄를 저지르고 있을때, 경찰측에서는 대부분 웹사이트를 막아버리겠다. 라고만 말한다.

사실 웹사이트를 막고 서버를 막는다고 하는게 무슨 소용이 있을까..

일반일들도 쉽게 서버를 운영하고 웹사이트를 운영할 수 있는데...

DNS와 웹 크롤링등을 이용해 범죄집단의 데이터를 긁어모아 그들의 웹사이트가 아니라 그들에게 접근한다면 얘기는 달라질 수 있을 것이다.

물론, 전문가들의 말처럼 범죄 집단들은 자신의 목적을 위해 얼마든지 발전할테니까 이 방법이 금방 막혀 버릴 수도 있다.

하지만 그렇다고 하더라도, 굉장히 흥미로운 접근 방법이라고 생각한다.

 

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

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

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

 

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

기사 원본 주소 : http://www.boannews.com/media/view.asp?idx=52231&page=1&kind=4

기사 저작권자 : 보안뉴스

 

1. LOS란??

- LOS는 SQL인젝션을 할 수 있는 Wargame이다.

- 총 25단계로 이루어져있으며 각 문제별로 다르게 설정된 php문을 보고 우회하여 원하는 값을 가져오면 문제는 해결된다.

 

- 1번 문제부터 25번 문제까지 문제별로 각각 하나의 몬스터가 있는데, 문제를 풀어 해당 몬스터를 처치하는 그런 시스템인 것 같다.

 

2. Gremlin 문제

 

 

문제화면은 이런식으로 나온다.

 

ID와 PW에 대한 쿼리문이 위에 나오고, 이 문제에 대한 php소스가 아래부분에 나온다. 소스를 보고 문제를 해결하기 위해 얻어야 하는 내용을 파악하고 sql 인젝션을 통해 공격을 하면 된다.

 

이 문제의 해결 방법은 10번 줄에 나와있다.

 

if ($result['id']) solve("gremlin");

 

참고로 나는 php소스에 대해 많이 알지 못한다. 따라서 추론한 결과

 

'id'변수의 결과가 있으면 gremlin이 해결된다.

 

라고 생각된다.

id가 값이 있으면 gremlin이 해결된다?? id만 넣어주면 된다는 의미인가?? 라고 생각할 수 있겠지만 7번째 줄, 쿼리문을보면

 

id = ' {$_get[id]}' and pw='{$_GET[pw]}'";

 

id는 내가 입력한 값이고, and pw는 내가 입력한 값이어야한다.

and는 왼쪽과 오른쪽이 모두 참이라는 뜻이니까 결국

 

내가 입력한 id가 참이고, 내가 입력한 pw도 참이어야한다.

 

라는 의미이다.

그러니 아무 id나 입력한다고 되는것이 아니라 그에 대한 패스워드도 맞춰줘야한다.

 

일단 아무 값이나 넣어보자.

 

값을 넣는 방법은

 

주소창의 끝에 ?를 쓰고 변수의 값을 넣어주면된다.(가운데에 파란펜으로 가린 이유는 ip주소이기 때문이다.)

예를들어 id에 1을 넣고 싶으면,

 

http://주소/폴더/파일이름.php?id=1

 

그럼 2개의 변수에 값을 넣고 싶으면 어떻게 해야할까?

 

예를들어 id에 1을 넣고, pw에 1을 넣고싶으면

 

http://주소/폴더/파일이름.php?id=1&pw=1

 

이런식으로 넣으면 된다.

 

php에 변수를 조작하고싶다 : ?사용

 

또 다른 변수를 조작하고싶다 : &사용

 

자, 그럼 id에 1을 넣고, pw에 1을 넣어보자.

 

 

편의상 주소를 뺐다.

이렇게 입력을 해주면 결과는

 

 

내가 입력한 변수가 적용된 쿼리문이 나온다.

그 이외에 변한게 없는 걸 보니 문제가 풀리진 않았나보다.(풀릴리가 없다.)

 

이제 제대로 문제를 풀어보자면,

이 문제는 id는 아무값이나 넣어주면 된다.

 

where절을 보면

 

where id='1' and pw='1'

 

id='1' 이 참이고, pw='1'이 참이어야 된다는 말인데 pw는 1이 아니기 때문에 풀리지 않았다고 보면 된다.

그럼 pw를 모르는 상태에서 pw를 참을 만들어야한다는 얘기인데, 이때는 sql의 가장 기본 구문을 써주면된다.

 

pw = '1' or '1'='1'

 

이렇게 입력해주면 pw는 '1' 이거나, '1' = '1' 이라는 얘기인데,

 

pw는 1이 아니라는건 알고있다, 그러나 뒤의 '1' = '1'은 1=1, 즉 무조건 참이다.

그렇기 때문에 pw는 무조건 참이되는것이다( A or B는 둘 중 하나만 참이어도 참이되기 때문이다.)

 

그러니,

 

where id='1' and pw='1' or '1'='1' 을 해석해보면

 

id = '1'과 pw='1' or '1' = '1'이 둘 다 참이어야 하는데, 그 중에서

 

pw='1'이나 pw='1' ='1' 둘 중 하나가 참이어야 pw부분이 참이 된다.

 

근데 '1' = '1'은 무조건 참이기 떄문에 pw부분은 무조건 참이다.

 

따라서 id = '1' 인 것의 pw는 무조건 참이다.

 

그러기 때문에 정확한 pw를 모르더라도 로그인이 가능해진다.

 

[*] 참고로 sql문의 연산자에 관한 내용은 본 블로그 Database 카테고리의 SQL Syntax(SQL 문법) - WHERE, Operator 글에서 확인할 수 있다.

 

입력한 결과를 보자

 

입력 값

참고로 pw=1' or '1'='1 이라고 적어준 이유는 php소스의 query 부분을 보면 get[id]와 get[pw]가 작은따옴표로 묶여져 나오기 때문에 따옴표를 맞춰주기 위해서 이렇게 적은것이다. 이해가 안된다면 직접 해보길 바란다.

 

결과 값

 

결과는 Clear이다.

 

지금 사용한 sql 쿼리문은 sql 인젝션의 가장 기본적인 내용이다.

실제 모의해킹을 할 때 sql 인젝션이 적용되는가 테스트할 때

1'or '1'='1 이라고 입력을 해서 확인하기도 한다.

 

이번 문제는 기본적인 문제 푸는 방법까지 설명하였지만 글이 너무 길어지기 때문에 이 후의 포스팅에는 그런 부분을 제외하고, 해당 문제의 풀이에 초점을 맞춰서 포스팅하려한다.

 

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

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

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

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

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

[LOS] 4. Orc 문제 풀이  (3) 2017.01.06
[LOS] 3. Goblin 문제 풀이  (0) 2016.11.10
[LOS] 2. Cobolt 문제 풀이  (0) 2016.11.09

+ Recent posts