[LOS] phantom 풀이 (st.29)
Wargame/LOS

[LOS] phantom 풀이 (st.29)

 

 

풀이

 

문제를 풀기 앞서, 풀이에 사용한 Query문이 정말정말정말 길다..

 

이번 문제는 코드 해석이 중요한 문제라고 생각한다.

코드를 보면, GET 방식으로 joinmail과 email 변수를 받는데, email에는 addslashes 함수가 적용되어 있어, 우회는 어려울 것으로 예상된다.

 

문제를 풀어보면 table을 시각화해주는 표가 주어진다.

 

 

표에 안 보이는 no값을 제외한 값, ip, email 값이 보인다.

이번 문제는 삽질도 정말 많이 하면서, SQL Query 문법을 공부하는데 정말 많은 도움이 된 문제이다.

 

먼저 다음 코드를 봐보도록 하자.

$query = "insert into prob_phantom values(0,'{$_SERVER[REMOTE_ADDR]}','{$_GET[joinmail]}')";

insert into <테이블 명> values(값 1, 값 2, 값 3)의 형태이다.

첫 번째 값에는 0, 두 번째 값에는 My ip address, 마지막 값에는 GET 방식으로 받은 joinmail값이 테이블에 들어간다.

 

SERVER[REMOTE_ADDR] 부분은 원하는 값으로 변조가 불가능하니, joinmail을 건드려보도록 하자.

다음과 같은 Query를 넣어보자.

 

Query:  ?joinmail=TEST')%23

의도했던 대로 TEST가 들어갔다.

 

insert into 문은 (1,2,3),(4,5,6) 이렇게 총 2개의 그룹을 넣어줄 수 있다.

원래 존재하는 (0,'IP',아무 값)은 버리는 카드로 사용하고, 다음 그룹인 (4,5,6) 부분을 이용해 Time Based + Blind SQLi 구문을 짜보자.

 

먼저 (4,5,6) 중 4,5도 마찬가지로 버리는 값이니, joinmail 부분 즉, 6에 if + sleep문을 추가하여 Query문을 완성해보자.

다음은 email의 길이를 알아오는 Query이다.

 

Query:  ?joinmail=1'),(0,'당신 IP',if(length((select email from prob_phantom as qwer where no=1))>4,'T','F'))%23

 

MySQL에서는 insert into문 안에 같은 table을 사용할 수 없기 때문에 as qwer 처럼 별칭을 사용해야 한다.

 

email 길이를 구하는 Query문은 테이블에 올라가는 T or F로만 구분하는게 훨씬 빠르다고 판단해 sleep 함수를 사용하지 않았다. 부등식의 숫자를 바꿔가면서 email의 길이를 알아내자.

 

흔한 email 길이를 구하기 위한 삽질.png

 

길이를 알아냈다면, 파이썬 코드를 통해 정확한 email 값을 알아내자.

 

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

[LOS] frankenstein 풀이 (st.28)  (0) 2020.06.04
[LOS] blue_dragon 풀이 (st.27)  (0) 2020.06.03
[LOS] red_dragon 풀이 (st.26)  (0) 2020.06.03
[LOS] hell_fire 풀이 (st.23)  (0) 2020.05.31
[LOS] evil_wizard 풀이 (st.24)  (0) 2020.05.31