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