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은 SQL INJECTION에 UNION 구문이 사용되는 경우입니다. 이 경우는 우선 당연히 SQL INJECTION을 사용할 수 있는 경우여야 하고, 또 데이터를 추출할 수 있도록 select문으로 검색한 정보를 화면에 보여주는 경우에 사용할 수 있습니다.
이것을 사용할 때 지키면 좋은 단계가 있는데, 이것은 실습하면서 알아보겠습니다.
사용할 사이트는 노말틱님이 제공해주신 사이트고, 게임의 이름을 검색하면 그것에 대한 정보가 나오는 사이트입니다. over이라고만 쳤는데 overwatch가 나온 것을 보아 like문을 사용한 것으로 보입니다.
select문 order by [컬럼 이름]의 형태로 사용되는데 여기서 컬럼 이름 부분을 숫자로 대체할 수 있습니다. 첫 번째 컬럼은 1, 두 번째는 2 등 숫자로 정할 수 있고, 여기서 만약 존재하지 않는 번째의 컬럼을 선택한다면 에러가 나옵니다. 즉 4개의 컬럼을 가진 테이블이 있는데 order by 5를 실행시키면 에러가 나오겠죠.select database()를 사용하면 DB의 이름을 알 수 있습니다. 그런데 UNION 이후 이것을 그냥 쓰면 컬럼 개수가 맞지 않아 에러가 날 테니 컬럼 개수에 맞게 넣어줘야합니다.select table_name from information_schema.tables where table_schema = 'DB이름'을 사용하면 찾을 수 있습니다.select column_name from information_schema.columns where table_name = '테이블 이름' 테이블의 경우와 비슷합니다.