이번 문제는 굉장히 빨리 풀 수 있었다.
운이 좋게도 강의의 내용을 잘 응용할 수 있었기 때문이다.
아래를 보자
먼저 위처럼 전 블라인드 인젝션과 크게 다르지 않아 보이는 웹페이지였다.
허나 참인 값을 입력해도 exists 문구는 나타나지 않았다.
에러로 푸는 것을 알았기에 extractvalue함수를 이용했다.
첫번째 인자에는 1을 넣었고 두번째 인자에 버전 함수를 사용했다.
concat함수는 문자열을 합치는 함수이다.
당연히 1이라는 인자에 version의 문자열을 찾을 수는 없는 것이고 오류가 날 것이다.
하지만 extractvalue함수는 version()함수를 실행한 값을 오류 메세지에 출력한다.
아래 쿼리를 주입했다.
union을 이용하여 두번째 쿼리로 실행시켰다.
' union SELECT extractvalue(1,concat(0x3a,version()));
결과는 아래처럼 에러가 났다.
그럼 이제 대충 감을 잡았기에 version()대신 내가 구하고자 하는 upw를 구하는 서브쿼리를 대입하면 될 것 같다.
아래와 같이 코드를 주입했다
' union SELECT extractvalue(1,concat(0x3a,(select upw from user where uid = 'admin'))); --
결과는 아래와 같았다.
하지만 플래그가 짤려있는 것을 볼 수 있다.
이것에 대한 생각도 운 좋게 바로 떠올랐다.
바로 구하려고 하는 upw에 substr을 사용하여 원하는 부분만 보여지게 하는 방법이다.
아래와 같은 쿼리를 삽입했다.
대충 20 부터 넉넉잡아 20을 기준으로 50번째 이후 까지 확인하게 했다.
' union SELECT extractvalue(1,concat(0x3a,(select substr(upw,20,50) from user where uid = 'admin'))); --
그렇게 했더니 아래처럼 flag마저 출력이 되는 것을 볼 수 있었다.