SQL Injection/SQL Injection

Union SQLi 실습

ragdo11 2024. 6. 13. 03:37
 

Union Based SQLi

SQL 질의문 결과가 화면에 보이는지 안보이는지에 따라 SQL 인젝션 공격 기법이 달라진다. 주소 검색, 게시글 리스트 등 화면에 결과가 보이는 경우와 로그인, 아이디 중복 체크 등 화면에 나오지

ragdo11.tistory.com

이론은 위에 요 녀석

 

위와 같은 게시판 사이트가 대표적인 union based sqli를 하기 좋은 환경이라 할 수 있다!

우선 바로 항상 SQLi를 하기 전에 해야 할 것은 이 사이트에 취약점이 있는지부터 확인해보기

먼저 평범하게 제목을 검색해보고

게시판%'# 로도 검색해보면서 사용자의 입력을 받는 부분에서 사용자의 입력이 SQL문으로 처리가 되는지 확인해본다. 위의 경우 특수문자를 집어넣었음에도 게시판이 검색되므로 SQL문으로 처리가 됨을 확인할 수 있다.

 

그런데 저 %는 무슨 의미일까?? 결론적으로 %는 와일드카드 문자이며 검색을 조금 더 유용하게 하기 위해 사용한다.

select * from ~ where category = '___'

검색을 위한 간단한 SQL문 예시이다. 위와 같은 형태를 떠올리기 쉽지만 위와 같은 형태는 특정 문자에 해당하는 문자가 오지 않으면 결과값이 나오지 않는다. 예를 들어 제목이 '게시판' 인 글을 검색하기 위해서는 꼭 게시판이라는 문자열을 검색해야하며 게시, 시판 등 부분적으로 검색하면 검색이 되지 않는다.

 

select * from ~ where category like '___'

검색의 유용성을 위해 =을 사용하지 않고 LIKE절을 사용하게 되는데 LIKE절을 사용하면 와일드카드 문자를 사용할 수 있어 훨씬 유연하게 검색이 가능하다.

와일드카드 문자 중 %는 글자수를 정하지 않는 방식으로 예를 들면 '김%' 라고 작성하면 김으로 시작되는 모든 문자열을 검색하고, '%김'은 마지막 문자가 김으로 끝나는 모든 문자열을 의미한다. 그러면 '%김%' 이면?? 문자열 중간에 김이라는 글자가 들어가는 모든 문자열을 검색하게 될 것이다! 훨씬 유연한 방식!

 

select * from ~ where category like '%___%'

그러면 위와 같은 형태가 될텐데 이제는 아까 SQLi 취약점이 있는지 확인하면서 집어넣은 게시판%'# 이라는 문자열이 이제는 이해가 될 것이다!!

 

다음으로 취약점이 있는지 확인했으니 참/거짓에 따른 반응 변화를 볼 차례이다.

거짓인 구문을 넣었더니 갑작스레 게시물이 조회되지 않는 모습을 볼 수 있다. 이제 이를 이용해 본격적인 공격을 하면 된다.

먼저 컬럼 개수를 참/거짓 반응 변화로 확인해 준 후(컬럼의 개수는 7개)

확인된 컬럼의 개수를 이용해 화면에 출력되는 컬럼은 몇 번째인지 확인하는 구문을 작성한다.

1,2,3,5,6 번째 컬럼이 화면에 출력되는 컬럼임을 확인했다!

화면에 출력되는 컬럼의 위치를 이용해 데이터베이스를 알아내는 구문을 대입.

데이터베이스의 이름이 userdb인 것을 확인했다!

으억 짤렸다

x%' union select table_name,2,3,4,5,6,7 from information_schema.tables where table_schema='userdb'#

사용한 구문은 위와 같다! userdb 데이터베이스에 해당하는 테이블의 이름이 쭉 나왔다. 여기서 공격자의 관점으로 보자면 users 테이블이 사용자들의 정보가 있을 것만 같아 이 테이블을 공격 목표로 삼는다.

사용한 구문은 아래와 같다

x%' union select 1,2,column_name,4,5,6,7 from information_schema.columns where table_name='userdb' and '1%='1

이번엔 살짝 변화를 줘서 작성해봤다. 먼저 3번째 컬럼도 화면에 출력되는 컬럼이니 저런 식으로 위치를 바꿔서 써도 상관이 없다. 그리고 마지막에 보면 주석을 사용하지 않고 and '1%'='1로 끝냈는데 이는 SQL문이 어떤 식으로 작성되있을지 생각을 해보면서 작성하면 알 수 있을 것이다.

username과 password만 공격해보면 이제 될 것 같다!

너무 이쁘게 성공했다.

혹시 이해가 잘 안되거나 힘들면 위의 이론을 좀 더 보면 될 듯하다.