본문 바로가기
정보보안/wargame

[webhacking.kr] challenge(old). old-09

by 민-Zero 2020. 3. 21.

9번 문제에 접근하면 볼 수 있는 화면이다. 각각 1, 2, 3이라는 숫자를 눌러보면

위처럼 url에 no라는 변수에 해당 번호가 들어가며 각각의 화면이 출력된다. 

1~3 이외의 숫자가 no에 들어가게 되면 아무것도 보이지않는다. 이때 column은 id, no로 이루어져 있고 no=3 값이 들어가면 no 3's id is password라는 글로 보아 no=3의 id를 찾아내어 password에 입력하면 되는 것 같다.

그렇다면 이때 적용되는 쿼리문은 no의 값에 따라 출력의 변화가 생기므로 select id from table where no=~~ 로 적용된다고 생각할 수 있다.

 

1' or '1'='1', union 등을 입력한 결과 Access Denied라는 문구가 출력이 된다. 따라서 특수문자나 명령어를 입력하면 필터링이 적용되고 있는것을 알 수 있다.

 

그렇다면 no에 필터링에 걸리지 않는 쿼리문을 전달하여 문구가 출력될 때와 안될 때를 참 거짓으로 나누어 blind sql injection을 수행하면 된다.

 

우선 공백이나 ', = 와 같은 특수문자를 피하기 위해 length함수와 like함수를 사용하였다. like 함수는 =과 같이 값이 일치한다면 참을 반환하고 아니라면 거짓을 반환한다. 따라서 0~100까지 숫자에서 차례로 id의 길이로 반환되는 값과 비교하여 참이라면 if를 통해 3을 반환하고 아니라면 0을 반환하여 password를 입력하는 칸만 페이지에 출력되로록 하였다. 참일 경우 no=3가 입력되어 Secret이라는 문구가 출력되므로 웹페이지에서 Secret이라는 문구가 있을 때의 값을 저장하여 길이를 알아낼 수 있었다. 또한 no=3 와 일치까지 해야하므로 찾고자 하는 3의 id의 길이만 출력된다.

이번에는 찾아낸 길이만큼 반복문을 수행해 id의 문자열이 참인지 거짓인지 같은 방법으로 알아내어 저장하면 된다. substr()함수를 사용하여 id의 첫 번째 글자부터 마지막 글자까지 확인하며 문자는 아스키코드를 활용하여 비교한다.

따라서 alsrkswhaql 라는 id를 확인할 수 있다.

 

얻어낸 비밀번호를 입력하면 해당 문제를 완료할 수 있다.

댓글