본문 바로가기

Penetration/WEB

[주요정보통신기반시설] 5. SQL 인젝션 - 이론편

사실 이 부분에 대해서는 이론보다 실전이 훨씬 깊기 때문에 간단하게 주정통 내용만 살펴보고 가려고 합니다.

에러기반, 블라인드기반 및 여러가지 기반의 SQL 인젝션이 존재하며

반응을 확인한 후에 알아야 될 것들이 많기 때문에 취약점 진단 정도로 작성하려고 합니다.

본격적인 쿼리나 직접적인 DB명 알아내기, table명 알아내기 및 중요정보 탈취 등은 워게임이나 다른 방법으로 추후에 다뤄볼려고 합니다.

기본적인 점검방법은 입력가능한 부분에 '(싱글 쿼터)를 집어넣어서 에러반응이 나오는지 확인해봅니다.

이후 다른 반응이 없다면 검색창이나 게시판 필드 부분에 특정 검색을 유도한 후 블라인드 테스트를 진행합니다.

test'and 1 like 1-- (참인경우)

test'and 1 like 2-- (거짓인경우)

이렇게 입력하였을때 참에서는 사이트에서 특정 반응이 나타나고 거짓일때는 나타나지 않습니다.(정말 단순한 예시)

이렇게 관찰이 가능한 경우 취약으로 판단합니다. 

 

최근에 일을 하면서 만나게 된 SQLi의 경우

오류를 내는 방법만 알고있다면 오류를 통한 SQLi를 이용해서 데이터를 탈취할 수 있고

또는 Time based를 이용해서 데이터를 탈취할 수 있는 경우를 만날 수 있었습니다.

 

최근에 성공해본 사례

 

desc,(select+sleep(7)where+1=1+and+length(database())=8)

위의 케이스는 오름차순 내림차순 부분에 SLEEP을 걸어서 반응 시간을 통해 참 거짓을 확인할 수 있는 쿼리입니다. 위의 사례는 DB명의 길이가 8글자임을 순차적으로 알아내었습니다.

 

desc,extractvalue(rand(),concat(0x3a,database()))--+

위의 케이스는 오름차순 내림차순 부분에 의도적으로 에러를 일으켜서 에러 내용을 통해 DB명을 알려주는 쿼리입니다.