syurhia 님의 블로그
PortSwigger SQL injection attack, querying the database type and version on MySQL and Microsoft 본문
PortSwigger SQL injection attack, querying the database type and version on MySQL and Microsoft
syurhia 2026. 4. 24. 19:22이번에는 테이블 이름을 모르는 경우 어떻게 해야 하는가이다.
지금까지 푼 문제?라고 할까, 학습한 내용들은 테이블 이름과 열의 이름을 알고 있으며, 취약점이 존재한다는게 전제였다.
다만, 실제로는 내가 상대방의 서버의 테이블 이름을 알 리가 없지 않은가. 누가 알려주지 않는 한은.
따라서 SQL injection 취약점이 존재할 때, 상대방의 데이터베이스 타입, 버젼, 테이블 명 등을 알아내야 한다.
그 중에서 이번에는 상대방의 데이터베이스 타입과 버전에 대해 알아본다.
표의 표시가 많이 짜치지만.. 일단 표1과 같이 데이터베이스에 따라 버전을 출력하는 쿼리문이 다르다고 한다. 당연하다면 당연하긴 하다.
| 표1 | 데이터베이스 출력 쿼리 |
| Microsoft SQL Server , MySQL | SELECT @@version |
| PostgreSQL | SELECT version() |
| Oracle Database | SELECT * FROM v$version |
위의 내용과 UNION을 이용해서 데이터베이스의 타입에 대해 알아볼 것이다. 단 중요한 것은 버전의 내용들은 문자열이다.
예를 들면 ' UNION SELECT @@version --과 같은 문장을 임의 쿼리문에 추가하는 것으로 버전을 볼 수 있다.(물론 열이 한 개여야 하고, 문자열이어야 한다. 이 쿼리는)
그래서 자신만만하게 시작했는데 바로 벽에 부딪혔다.
일단 쿼리에서 반환하는 열이 몇 개인지 확인하려고 URL에 category = Lifestyle'+ORDER+BY+1--를 입력했다.

자신만만하게 입력했는데...엥?
그림 1과 같이 Internal Server Error가 떴다. 쿼리에서 뭔가 문제가 생겼다는 뜻이다.
생각해보면 ORDER BY 1로 작성했고, 쿼리의 반환 열은 적어도 1개 이상일 것이기에 이 에러는 뭔가 이상하다.
그래서 생각도 해보고, 쿼리도 이것저것 넣어봤는데 전부 그림 1과 같이 에러가 뜨더라.
따옴표 「'」가 잘못된건가 싶어서 쌍따옴표 「"」 를 넣어봤다.
category = Lifestyle" ORDER BY 1-- 이렇게 했더니 출력은 되는데 아무것도 출력이 안 됐다.
ORDER BY는 정렬을 하는거라 안 뜰리가 없다. 즉, 쌍따옴표를 입력하는건 애초에 잘못된거라는 뜻이다.
SELECT * FROM users WHERE category='Lifestyle'이 맞을텐데 여기다가 쌍따옴표를 넣으면 SELECT * FROM users WHERE category='Lifestyle" ORDER BY 1--' 과 같이 되어서 category가 Lifestyle" ORDER BY 1--인 것을 출력하라는 것과 같은 거라 아무것도 안 뜬 것 같다.
결과는 그림 2와 같다.

그래서 주석인 --가 혹시 뭔가 잘못된건가 싶어서 #을 써보기도 하고, 지금까지 풀어봤던 문제들의 주석도 확인해봤다...만
전부 Internal Error가 떴다.
그래서 GPT한테 물어봤더니, 주석인 '--'의 뒤에 띄어쓰기를 해줘야 주석으로서 작동을 한다고 했다.
지금까지 푼 문제에서는 이런 일이 없었어서 아마 MySQL만 이러는 것 같다. 즉, 지금까지 풀었던 문제들은 MySQL이 아니었던 것 같다. 아... 어느 문법을 쓰는가가 상당히 중요하구나.
확인이 되어서 category = Pets' UNION SELECT NULL,NULL --를 입력했다.

열 개수가 2개인 거는 확인이 됐다. 그리고 캡처를 안 했지만 첫 번째 열이 문자열인 것도 확인했다.
확인이 됐으니 이제 버전을 확인해보자.
category = Pets'+UNION+SELECT+@@version,NULL+--+를 입력했다.
+가 URL에서는 띄어쓰기와 같다. 예전이었으면 +를 안 썼을건데, --이후에 띄어쓰기는 자동으로 삭제처리가 되어버려서 이번에는 +로 처리를 했다.
그랬더니..

드디어 MySQL의 버전과 서버의 버전을 확인할 수 있게 되었다.
MySQL버전이 8.0.42이고 서버로는 ubuntu0.20.04를 쓰고 있는 것 같다.
처음에 문제를 봤을때 microsoft라고 써져있어서 Microsoft SQL Server인 줄 알았는데, 주석처리도 그렇고 서버 버전도 그렇고 Microsoft서버가 아니었나보다. 좀 당황스러웠다. 결과를 봤더니. Microsoft SQL Server면은 Microsoft SQL Server라고 떠야하기 때문이다.
뭐 어쨌든 좀 우당탕탕이기도 했고, 당황스러운 것도 있었지만 해결했다.
주석처리도 하나 배웠다.
그런데, 정답을 봤더니 burp suite를 써서 상품의 카테고리 필터를 설정하는 요청을 가로채고 수정하라고 한다.
URL에 입력해도 되는 GET형태의 통신을 통해서 쿼리를 완성하는거라 생각해서 그냥 했는데...다음부터는 Burp Suite를 좀 써봐야 겠다.