본문 바로가기

드림핵

[드림핵 워게임] error based sql injection

위의 문제를 다음과 같은 과정으로 풀어보았다.

 

 

1. 탐색하기

사이트에 접속하면 처음 뜨는 화면이다.

 

 

admind을 입력해서 전송해보니 완성된 쿼리문이 뜬다. 쿼리 실행 결과에 대해서는 출력되는 내용이 없다.

이 문제의 이름이 error based sql injection이라는 것을 생각해보았다.

error based sql injection은 고의로 에러를 발생시켜 출력되는 에러 메시지를 통해 원하는 정보를 노출시키는 공격이다.

 

 

에러를 발생시키기 위해 admin' and i=1-- 이라는 값을 입력해보았다.

 

 

에러 메시지가 뜬다. 하지만 원하는 정보는 뜨지 않는다. 원하는 정보가 에러 메시지에 보이도록 하기 위해서 적당한 입력값을 찾아야한다.

 

 

 

2. 익스플로잇 코드 작성하기

구글링을 하다가 extractvalue() 함수를 찾았다.

extractvalue(xml_frag, xpath_expr) 함수는 xml 마크업과 xpath 식을 인수로 받아서 xpath 표기법으로 xml 문자열에서 값을 추출하는 함수이다. extractvalue() 함수에 논리적 에러가 포함된 인수를 포함시켜 쿼리문을 작성하면 출력되는 에러 메시지에 원하는 정보가 뜨도록 할 수 있다.

 

admin' AND extractvalue(1,concat(0x3a,(SELECT upw FROM user)))--

위와 같은 입력값을 작성해보았다.

concat() 함수는 문자열을 이어주는 함수이다.

0x3a는 ':' 문자를 의미하는 16진수이다.

 

 

서브쿼리가 1줄 이상 리턴된다는 에러 메시지가 뜬다.

 

 

admin' AND extractvalue(1,concat(0x3a,(SELECT upw FROM user LIMIT 1)))--

서브쿼리가 한 줄만 출력되도록 LIMIT 1 (위에서부터 1 줄의 정보만 출력) 쿼리문을 고쳤다.

 

 

플래그가 출력되긴 하는데 뒷부분이 잘려있다.

 

 

admin' AND extractvalue(1,concat(0x3a,(SELECT substr(upw,20,30) FROM user LIMIT 1)))--

뒷부분도 출력되도록 substr() 함수를 써서 쿼리문을 작성하였다.

substr() 함수는 인수로 문자열, 시작위치, 길이를 받아 문자열을 시작위치부터 원하는 길이만큼 출력하는 함수이다.

위의 쿼리문에서는 upw 값을 20번째부터 30만큼의 길이로 출력하도록 했다.

 

 

플래그의 뒷부분이 출력되었다.

 

 

 

3. 플래그 획득하기

조각난 플래그를 합쳐서 플래그를 완성한다.