UNION SQL INJECTION 해보기

이정민·2023년 11월 29일
0

웹 해킹 공부 정리

목록 보기
4/18

UNION이란?

UNION은 SQL select 쿼리문에서 쿼리문을 하나 더 붙여줄 수 있는 것을 의미합니다. 그런데 select문 하나를 더 써서 뭐가 좋은걸까요? 그건 바로 다른 테이블의 값을 가져올 수 있기 때문입니다. 게시판이나 우리가 볼 수 있는 데이터들은 보여주기 위한 테이블에서 가져오기때문에 그다지 중요한 정보가 아닐 수 있습니다. 하지만 UNION을 사용하면 다른 중요한 테이블에 있는 정보를 추출할 수 있는 것입니다.
우선 union의 문법은 select문 union select [컬럼] from [테이블]입니다.
사용하는 예를 들면 select id, pass from member where id='doldol'이라는 쿼리문이 있다면 id가 doldol인 쿼리문의 id와 pass 컬럼을 가져오겠죠. 여기에 union을 붙여서 select id, pass from member where id='doldol' union pass, id from member라는 쿼리문을 실행하면 어떻게 될까요? doldol의 한 줄 아래에 pass와 id 항목이 쭉 나오는 것입니다. 순서는 어떻게 나올까요? 첫 select문에서 컬럼을 id, pass로 했기 때문에 첫 줄은 id, pass 순이지만 두 번째 select문은 pass, id 순이기 때문에 아래에는 pass, id 순서로 나온다는 것입니다.
여기서 핵심 부분이 있는데 그것은 컬럼 수가 다르면 에러가 나온다라는 것입니다.
여기에 추가로 다르게도 사용할 수 있는데 union select 1, 2로 사용하면 어떻게 될까요? 답은 원래 출력되는 부분 아래에 1, 2의 값을 가진 한 줄이 더 출력되는 것입니다. 이렇게 원하는 값을 출력시키는 것도 가능합니다.

UNION SQL INJECTION을 통한 데이터 추출

UNION SQL INJECTION은 SQL INJECTION에 UNION 구문이 사용되는 경우입니다. 이 경우는 우선 당연히 SQL INJECTION을 사용할 수 있는 경우여야 하고, 또 데이터를 추출할 수 있도록 select문으로 검색한 정보를 화면에 보여주는 경우에 사용할 수 있습니다.
이것을 사용할 때 지키면 좋은 단계가 있는데, 이것은 실습하면서 알아보겠습니다.

사용할 사이트는 노말틱님이 제공해주신 사이트고, 게임의 이름을 검색하면 그것에 대한 정보가 나오는 사이트입니다. over이라고만 쳤는데 overwatch가 나온 것을 보아 like문을 사용한 것으로 보입니다.

  1. SQL 포인트 찾기
    SQL 포인트 찾기는 SQL문이 실행되는지 안되는지를 확인하는 단계입니다. '나 #등 다양한 SQL INJECTION이 실행되는지를 확인하고, 데이터 추출에 필요한 쿼리를 찾아내야합니다.

    like 구문이 사용되었다는 것을 알고 있으니, over 뒤에 %'를 해주고, and 구문을 사용해봤더니 문제없이 실행됩니다. 즉 SQL INJECTION이 실행된다는 것을 알았습니다.
  2. 컬럼 개수 찾기
    컬럼의 개수를 찾기 위해서는 order by 구문을 사용하면 좋습니다. order by 구문은 원래는 정렬을 위한 구문으로 select문 order by [컬럼 이름]의 형태로 사용되는데 여기서 컬럼 이름 부분을 숫자로 대체할 수 있습니다. 첫 번째 컬럼은 1, 두 번째는 2 등 숫자로 정할 수 있고, 여기서 만약 존재하지 않는 번째의 컬럼을 선택한다면 에러가 나옵니다. 즉 4개의 컬럼을 가진 테이블이 있는데 order by 5를 실행시키면 에러가 나오겠죠.

    order by 4까지는 문제 없이 실행되나 order by 5부터는 에러가 나오는 것으로 보아 컬럼이 4개라는 것을 확인했습니다. #을 넣은것은 뒷부분의 sql문이 실행되면 에러가 날 수도 있으니 그냥 주석처리 해버린것입니다.
  3. 출력되는 컬럼의 위치 찾기
    화면에 컬럼값이 출력되는 것은 알겠으나 이것이 모든 컬럼이라고는 확인할 수 없고, 이 순서가 맞는지도 확실하지 않습니다. 이 때 union을 이용해 원하는 서로 다른 값을 출력하는 것입니다. 그러면 순서를 알 수 있습니다.

    위에서 컬럼 개수가 4개라는 것을 알았으니, 순서대로 1, 2, 3, 4를 넣었습니다. 1은 화면에 나오지 않는 컬럼이고, 화면에는 2, 3, 4번 컬럼이 나온다는 것을 알았습니다.
  4. 해당 DB의 이름 확인
    UNION으로 다른 테이블의 정보를 찾으려면 DB의 이름을 알아야합니다. DB의 이름을 찾으려면
    select database()를 사용하면 DB의 이름을 알 수 있습니다. 그런데 UNION 이후 이것을 그냥 쓰면 컬럼 개수가 맞지 않아 에러가 날 테니 컬럼 개수에 맞게 넣어줘야합니다.

    보여지는 컬럼인 2 부분에 database()문을 사용해서 DB의 이름이 segfault_sql이라는 정보를 얻었습니다.
  5. 테이블 이름 확인
    이제 테이블의 이름을 알아야합니다. DB에는 모든 테이블의 이름이 저장되어있는 DB가 존재하는데 이것을 이용해서 찾을 수 있습니다.
    select table_name from information_schema.tables where table_schema = 'DB이름'을 사용하면 찾을 수 있습니다.

    문법에 맞게 사용해보니 game, member, secret, secret_member라는 테이블이 존재하는 것을 확인했습니다.
  6. 컬럼 이름 확인
    다음은 컬럼 이름을 확인해야 합니다. 테이블의 경우와 동일하게 컬럼의 이름이 저장된 DB가 있는데 그것을 이용해 찾을 수 있습니다.
    select column_name from information_schema.columns where table_name = '테이블 이름' 테이블의 경우와 비슷합니다.

    중요한 정보가 있을 것 같은 member 테이블의 컬럼을 알아냈습니다.
  7. 데이터 추출
    이제 원하는 데이터를 순서에 맞게 사용해서 데이터를 추출해주면 됩니다.

    member 테이블에서 id와 pass 컬럼을 추출했습니다.
profile
공부중

0개의 댓글