SQL Injection 취약점
보통 사이트에서 쿼리문을 인식하여 데이터를 찾아 낼때 크게 두가지 방식을 이용해서 쿼리문을 돌린다.
SELECT * FROM 'table name' WHERE no=글로벌 변수 ㅁㄴㅇㄴ
위와 같은 방식으로 쿼리문을 돌리는 것을 numeric injection 이라고 칭한다 . 보통 no 뒤에 GET 방식의 변수를 넘겨
쿼리문을 찾아서 정보를 보여준다 하지만 이런방식은 큰 취약점을 가질 수도 있다 .
가장 큰 취약점은 추가적인 쿼리문을 작성하여 임의로 공격자가 넘기면 쿼리문이 실행 된다는 점이다.
이를 보완하는 방식이 string injection 이다.
SELECT * FROM anews WHERE no='글로벌 변수 ㅁㄴㅇㄴ'
그럼 각각의 차이점을 한번 살펴보자.
1. numeric injection
위와같이 변수에다가 and 1=1 , and 1=2 를 임의로 넘겨서 참과 거짓을 내가 만든다.
참과 거짓을 넘겼는대도 실행이 된다면 numeric 일 가능성이 높다. 이유는 numeric 은 띄어쓰기후 뒤에 나오는 문자를
쿼리문으로 받아 들이기 때문에 위와같은 참 거짓의 문구를 실행 시킨다는 점이다.
2. string injection
반대로 string 은 ' ' 를 만들어 놨기 때문에 쿼리문이 실행되지 않는다. 단지 값은 나오지만 뒤의 추가적인 쿼리문은 불가능하다는 소리!
그럼 어떤식으로 취약점을 찾을수 있을까?
-> 중간에 ' 표를 넣거다 " 를 넣어 강제로 쿼리문을 종료 시키는 방법이있다.
하지만 현재는 '," 등의 문구를 코딩과정에서 막기 때문에 우회하기 힘들다..
그럼 간단한 예제를 통해서 어떤식으로 취약점을 공격하는지 알아보자.
일단 간단하게 DB를 만들도록하자 . ( SQL 취약점이니깐)
대충 이런식으로 만듬.
그리고 numeric 으로 get변수를 넘기는 것으로 설정 ( 취약점 분석을 위해 )
완성된 사이트의 모습이다. 역시 글로벌 변수에 따라서 값이 달라지는 것을 확인 할 수있다.
위에서 말했듯이 한번 and 문을 넣어서 확인을 다시 해보자.
이제부터 공격기법인대 union 이라는 합집합 쿼리를 이용해서 공격을 할것이다.
이기법에는 몇가지 주의할 점이 있다.
1. union 에 이어지는 select문은 앞의 select문일때만 사용가능
2. select 문의 컬럼수가 같아야함 -> 만약 모른다면?
order by 를 이용해서 하나씩 대입하여 오류가나면 컬럼수를 알수있다.
ex ) order by 1 == 값이나옴
order by 2 == 값이나옴
order by 3 == 값 안나옴
컬럼이 2개인 것을 확인
또는 union 의 특징을 이용
union select 1 == 값안나옴
union select 1,2 == 값안나옴
union select 1,2,3 == 값이나옴
컬럼 3개 확인
위와 같은 방식으로 컬럼의 수를 알아낸다.
또 중요한 것! mysql 같은 경우는 위와같이 information_schema 라는 DB에
모든 DB의 정보를 가지고 있다. 이를 이용
( 다른 DBMS 라면 각각의 특징을 공부 취약점을 분석 해야함 )
no=1 union select 1, table_name,table_schema form information_schema.columns // . 을이용하면 해당 디비 테이블로 사용
의 내용을 같이 넘겨 내가 원하는 결과를 실행! 모든 DB 내용을 확인 할 수 있다.
'WEB_Security' 카테고리의 다른 글
19. Blind Injection (0) | 2017.06.08 |
---|---|
17. 파일 다운로드 취약점 ( PHP ) (0) | 2017.06.02 |
16. 파일 업로드 취약점 ( 원격 쉘 ) (0) | 2017.05.31 |
15. PHP 파일 업로드 취약점 (0) | 2017.05.31 |
14. CSRF (0) | 2017.05.30 |
댓글