13번째로 푼 문제이다. :)
인젝션 문제이다.

문제 이름! SimpleBoard




(SimpleBoard)



문제 페이지이다.



(문제 페이지)



게시판 형식의 페이지이다.

소스코드를 확인 해보자!




(소스코드)



소스코드를 보니 완전한 소스코드가 아니라 클래스 부분만 따로 때어낸 코드를 주었다.

코드 안에서는 우리가 공략할 수 있는 쿼리문을 보여준다.
여기에 사용된 쿼리는 update와 select 쿼리가 사용되었다. update 쿼리는 조회수 정보를 저장할 때 사용되었고 select 쿼리는 게시글을 클릭하였을 때 게시물을 보여주기 위해 사용되었다.

그렇다면 이러한 쿼리들은 어떤 인자를 받아들여 쿼리를 실행할까?
게시글 아무거나 클릭해보았다.



(게시글 클릭)



클릭해보니 GET방식으로 idx를 넘겨주고 있다.

또 소스코드를 보면 idx를 통해 select를 하고 update를 한다.
정확히 GET으로 받은 idx를 사용하는지는 안나왔지만 클래스 코드를 보고 유추하자면 그렇다.

그렇다면 idx 변수에 injection을 담아 보내보자!
4 and 1 을 보내본다.



(4 and 1)



4번 글이 실행되었다.
이와 비교해서
4 and 0
을 Injection해보았다.




(4 and 0)



화면에 아무것도 나오지 않는다.
즉 이말은 4 and 0의 쿼리가 잘 전달되어 게시글을 가져오지 못했다는 것이다.

그렇다면 제일먼저 이 테이블의 컬럼수를 알아보기 위해
order by를 이용할 것이다.




(order by 1)



쿼리 에러

여기서 당황했지만 코드를 다시 잘 살펴보게 되는 계기가 되었다.




(소스코드)



여기서 idx값이 전달되면 쿼리가 2개가 실행되는데
update 쿼리를 잘보면 우리가 보낸 4 and 1 order by 1을 하게 되면 여기서 에러가 난다는 것을 알 수 있다. 즉 update 쿼리가 실행되지 않게 해야하는데 쿠키값으로 view를 관리하는 것을 볼 수 있다.
이 값에 봤다고 설정이 되있다면 update쿼리는 실행되지 않는다.

매번 쿠키를 설정해서 보내기 귀찮으므로 파이썬을 이용해 코드를 작성해보겠다.



(작성한 코드)



이 코드를 보면 4 or 1 order by 1 를 보낸다.



(결과)



결과를 보니 잘 나오는 듯했다.
하지만 잘나온것은 아니다 왜냐! 4번글이 출력되었기 때문에
정상적이라면 1번글이 나왔어야한다.

이유를 헤메다 보니 쿠키에 저장되는 값을 url 인코딩으로 해줘야한다.!
그렇기에 url 인코딩해서 보내주면



(url 인코딩 injection)



(실행결과)



실행 결과를 보면 1번 글이 출력된 것을 확인 할 수 있다.

이제 order by를 이용해 컬럼의 수를 찾아보겠다.



(order by 5 injection)




(쿼리 에러)



1,2,3 이렇게 늘려가다보니 5에서 에러가 났다.
컬럼의 수는 4개라는 것을 알 수 있었다.

이젠 4개의 컬럼이 맞는지 union select 를 이용해 확인해 보겠다.
원래 안에 글의 개수가 4개이므로 출력해줘야하는 글의 위치는 4 (0부터시작하므로)
limit 4,1 을 붙여주었다.




(확인 injection)




(실행결과)



실행결과를 보니 1,2,3,4 가 출력되는 것을 확인 할 수 있었다.

이제 테이블 이름을 알아야했다.
테이블 이름을 알기위해
select table_name,2,3,4 from information_schema.tables 를 이용할 것이다.



(테이블 이름 injection)



(실행결과)



실행 결과를 보니 CHARACTER_SETS이 나왔다.
나는 이게 지금 내가 검색하고 있는 테이블 이름인줄 착각했었다.. 하지만 여러 테이블 이름 중 하나였다.

즉 테이블 이름을 쭉 전부 검색해서 확인할 필요가 있었다.



(테이블 이름 injection)




(실행결과)



실행결과 쭉 보니 의심갈만한 테이블 이름이 있었다.
SimpleBoard 와 README 였다.

SimpleBoard을 살펴보니 우리가 문제 페이지에서 확인할 수 있는 페이지가 전부였다.

남은건 README!

하지만 컬럼 이름은 모르는데.. 컬럼이름을 찾을까 하다가
그래도 flag라는 컬럼이 있지 않겠어? 라는 심정으로 찍어봤는데



(flag injection)




(실행 결과)


flag가 정말 나왔다...
문제해결..!! :)


'WarGame > 500 Project' 카테고리의 다른 글

(15/500) Wargame.kr - lonely guys  (0) 2017.04.18
(14/500) Wargame.kr - strcmp  (0) 2017.04.16
(12/500) Wargame.kr - tmitter  (0) 2017.04.15
(11/500) Wargame.kr - type confusion  (0) 2017.04.15
(10/500) Wargame.kr - md5 password  (0) 2017.04.14

+ Recent posts