원래대로라면, if() 등으로 복수 행 에러를 발생시켜서 풀어야 하는 문제.

갑자기, error based sql injection을 사용하고 싶어졌다..


출처 - https://hyunmini.tistory.com/59

원래 여기가 아닌데, 여기가 급한대로 찾아져서, 뭐 어쨌든.

원리는 그룹 함수를 사용하는 과정에서 duplicate key가 발생하기 때문인데, 자세한 원리는 알지 못했다. 다만 sum, count 등의 그룹 함수와 floor(rand(0)*2) 를 함께 사용하고 이것을 group by로 정렬해야 한다는 점이다.

또한 이 문제에서는 dababase를 터는 것이 아니라, pw를 구하는 것이 목적이라 pw를 살려야 했다.

그러기 위해서는 union을 사용해서는 안됐다.

—> wargame.kr dbms335 참고.

union을 사용하지 않고, 해당 error based sql injection을 사용하기 위해 다음과 같은 방법을 이용했다.

  1. row(1,1) 로 등호 비교해주기.

    원래 쿼리에서는 1개의 항목을 요구하기 때문에, 2개 이상의 항목을 select하는 원본 쿼리를 union할 수 없다. (또 union은 사용 불가)

    따라서 row(1,1) 를 통해 형식적으로 비교 구문으로 만들어주자.

  2. union을 통해 가상의 데이터베이스 만들어주기

    information_schema.tables와 같은 테이블을 호출할 수 없기 때문에 (select 1,2 union select 2,3)과 같이 가상의 테이블을 만들어주었다. 2개 이상의 열이 있어야 해당 에러가 발생한다.

성공한 쿼리