문제에 들어가면 간단한 입력 폼과, 소스코드를 볼 수 있는 버튼이 나타나있다.

 

소스를 보면 기존 webhacking.kr에서 약간 달라진 부분이 length(id)<14라는 부분이 추가되었다.

 

sql 쿼리에서 where 구문이 true가 되어서 1이 리턴되면 문제가 풀린다.

 

그런데 쿼리를 잘 보면 where구문에서 id=' 부분에 여는 싱글 쿼터는 있는데, 닫는 싱글 쿼터가 없다.

 

그리고 싱글 쿼터를 입력값으로 주면, 2개의 싱글쿼터로 치환되게 되는데, substr 함수에서 앞의 15개만 잘라내는 부분이있다.

 

따라서 싱글 쿼터를 $_POST['id']의 15번째 자리의 글자에 위치시키면 2개의 싱글 쿼터가 되더라도, substr에 의해 두번째 싱글 쿼터는 잘려서 1개만 들어가게 된다.

 

따라서 입력값은 //(admin         '//)라고 입력하면 풀리게 된다.

admin + 공백9개 + 싱글쿼터

이런 조합인데, 마지막 싱글쿼터가 2개가 되지만, substr로 잘려서 1개의 싱글쿼터만 들어가게 된다.

 

 

그리고 여기서 //('admin' = 'admin         '//)는 true값을 갖는다.

 

http://woowabros.github.io/study/2018/02/26/mysql-char-comparison.html

 

MySQL에서 'a' = 'a '가 true로 평가된다? - 우아한형제들 기술 블로그

DB 알못의 어떤 리서치

woowabros.github.io

왜 그런지는 위 블로그에 잘 설명되어 있다.

 

요약하자면, VARCHAR(15) 이런 데이터 타입이면, 길이가 15미만인 문자열을 저장할때 뒤에 공백으로 패딩을 다 채워서 저장한다고 한다.

 

따라서 문자열간의 =를 확인할 때, 뒤에 공백 패딩을 붙여서 비교를 한다고 한다. ㅎㄷㄷ한 신기한 사실이다.

37번 문제도 31번 문제처럼 서버가 필요하다.

 

소스코드를 보면 7777번 포트로 우리가 올려준 파일에 써잇는 host로 접근해서 flag를 쏴준다.

 

파일에 우리 서버의 host나 public ip를 박아서 업로드를 하고, 파일 명은 서버 time stamp 에 맞게 타이밍 맞게 쏴주면 된다.

 

일단 그러면 우리 서버의 7777번 포트를 포트포워딩을 해서 데이터를 받을 준비를 해주자.

그리고 $ nc -lvp 7777 커맨트로 포트를 열고 기다린다.

 

그리고 타이밍에 맞게 파일을 업로드해야하니깐, 버프슈트로 파일업로드하는 패킷을 잡아 놓는다.

아무리 해도 패킷이 안오길래, 테스트를 해보니, 외부 아이피에서는 접근이 안된다.

 

방화벽 문제인듯 하니 방화벽에 예외 룰을 추가해준다.

방화벽 인바운드 규칙을 추가해주니, 드디어 접속이 된다. 이제 문제를 풀어보자!

타이밍 맞춰서 보내면!

FLAG{well...is_it_funny?_i_dont_think_so...}

 

플래그를 Auth에다가 박아주자!

Clear!

문제 페이지로 들어가면 위와 같은 화면이 나타난다.

 

10000 ~ 10100의 랜덤한 포트로 접속을 시도하는데, 아마 저기 접속을 맺도록 해주어야 할 것 같다.

 

일단 저 서버에서 접속하게 하도록 하기 위해서는 public ip가 필요하다.

 

지금 문제를 푸는 우리집 환경은 무선 공유기 아래에 노트북이 연결되어 있기 때문에, 포트포워딩을 설정 해 주어야 한다.

 

일단 gateway ip로 접속하면 무선공유기 설정 페이지로 갈 수 있다.

 

포트포워딩 설정을 해 준다. 내부포트 9999번 포트로 바인딩하기로 했다.

 

근데 공유기가 좀 구대기라서, 외부 포트 범위와 내부 포트 범위를 같게 해주어야한다 ㅠ

(iptime에서는 됬던거같은데...하)

 

그래서 일단 아래와 같이 설정했다.

이제 iptables 설정으로 10001 ~ 10100 로 들어온 연결들을 죄다 10000번 포트로 모아줄것이다.

https://blog.outsider.ne.kr/580

 

iptables로 80포트 리다이렉트 하기 :: Outsider's Dev Story

리눅스나 OSX같은 UNIX계열의 OS에서 1024포트 아래의 포트는 privileged 포트로 root계정이 아니면 사용할 수 없습니다.(Windows계열에서는 상관없습니다.) Apache같은 웹서버를 앞에 두고 있다면 상관없지만 To...

blog.outsider.ne.kr

 

여기 블로그를 참조해서 커맨드를 설정해보았다.

 

iptables -A PREROUTING -t nat -p tcp --dport 10001 -j REDIRECT --to-port 10000

 

#!/bin/sh

for i in $(seq 10001 1 10100)
do
	iptables -A PREROUTING -t nat -p tcp --dport $i -j REDIRECT --to-port 10000
done

 

iptables로 포트포워딩 셋팅을 끝냈다.

 

어마무시한 엔트리들...

 

그리고 webkr에서 내 서버 ip를 박아주면..!

 

플래그가 나온다.

 

그리고 iptables -tnat -F로 설정한 값들을 다 지워주면 된다.

 

Clear~

+ Recent posts