티스토리 뷰

웹 해킹/취약점

SQL injection

삼전동해커 2020. 7. 28. 14:25

Sql injection 개념

Sql 인젝션은 웹 애플리케이션이 데이터베이스와 연동하는 모델에서 발생한다.

이용자의 입력값이 sql구문의 일부로 사용될 경우, 악의적인 사용자에 의해 조작된 sql구문이 

데이터베이스에 그대로 전달되어 비정상적인 DB구문을 실행시키는 공격 기법이다.


Sql 인젝션 공격 목적 및 영향

sql인젝션은 db에 비정상적인 쿼리가 실행되도록하여 개발자의 의도와는 다른 목적을 달성한다. 


1.인증 우회

sql인젝션의 대표적인 경우로, 로그인 폼을 대상으로 공격을 수행한다. 

정상적인 계정 정보 없이도 로그인을 우회하여 인증을 획득한다.


2.DB데이터 조작 및 유출

조작된 쿼리가 실행하도록 하여,DB내에 저장되어 있는 정보를 탈취한다. 

또한 데이터 값을 변경하거나 테이블을 삭제 할 수도 있다.


3.시스템 명령어 실행

일부 데이터베이스의 경우 원격으로 시스템 명령어를 수행할 수 있도록 한다.

이럴 경우 해당 서버의 모든 자원에 접근 가능하고, 데이터 유출,삭제가 가능하다.


Sql 인젝션 공격 원리와 유형

Sql 인젝션은 sql쿼리문을 기반으로 공격을 수행한다.

공격에 수행되는 쿼리문은 정상적이지만 그 내용은 개발자의 의도와는 전혀 다른 결과를 도출한다.


Sql 인젝션은 다음 조건을 만족해야한다.

1.웹 애플리케이션이 DB와 연동하고 있다.

2.외부 입력값이 DB쿼리문으로 사용된다.


sql인젝션 공격 유형과 공격기법

일반적인 sql인젝션

(1)쿼리 조건 무력화(where 구문 우회)


sql구문에서 WHERE은 바로 뒤에 구술되는 조건이 참일 경우만 결과를 반환한다. 악의적인 사용자는 WHERE조건이 참이 되도록 쿼리를 조작하여 WHERE조건을 우회한다.


$sql = “SELECT * FROM tables WHERE id=‘$_POST[id]’ && pw=‘$_POST[pw]’


위 구문은 사용자가 입력한 id와 pw를 받아 구문을 작성한다. 

WHERE조건으로 id와pw가 참일 때,즉 테이블에 존재할 때만 결과를 반환한다. 이를 우회 해보자.


입력값

Id: admin’—

Pw:아무거나 or 아무것도 안적음.


이렇게 id에 admin’—을 적게 되면 구문은 WHERE id=‘admin’— && pw=‘ ’이 된다. 이 때 주석처리(—)를 해주었기 때문에 &&부터는 모두 주석으로 인식된다. 그럼 비밀번호 없이도 WHERE구문은 참이 되어 로그인에 성공이 된다.


#이때 id에 ‘을 붙이는 이유는 쿼리문에서 id를 받아주는 부분의 시작이 ‘으로 시작했기 때문에 닫아주는 ‘를 붙여줘야 짝이 맞는다.


(2)or 조건문 이용\


다음과 같이 password 값에 거짓 값과 참 값을 or로 연결하여 무조건 참이 되는 조건을 만든다.

Id:test

Pw:1234’ or ‘1’=‘1


이렇게 입력 하면 쿼리문은


WHERE id=‘test’ && pw=‘1234’ or ‘1’=‘1


이 된다.


 앞에 1234부분은 거짓이지만 뒤의 ‘1’=‘1’부분은 참이 되므로 로그인에 성공한다.


(3);(세미콜론)이용해 구문 재작성


세미콜론은 두 개 이상의 명령어를 이용할 때 사용된다. 이를 이용하여 구문을 삭제하거나 내용을 바꿀 수 있다.


입력값

Id:admin’; delete * from tables—

Pw:아무거나 or 아무것도


위와 같이 입력하면 쿼리문은


WHERE id=‘admin’; delete * from tables— && pw=‘ ’


와 같이 작성된다.


그럼 id 값이 참이므로 실행된 후 delete문이 실행되게 된다.


고의적 에러 유발 후 정보 획득

또 다른 기법으로 의도적으로 sql구문 에러를 유발하여 웹 애플리케이션이내뱉는 오류 정보를 기반하여 쓸만한 정보를 얻는 것이다.

기본적으로 웹 애플리케이션은 쿼리 수행 중 오류가 발생하면 DB오류를 그대로 브라우저에 출력한다. 

다음은 두 테이블의 결과를 합치는 명령어인 union을 이용해 오류를 발생시키는 방법이다. 원래 union은 두 테이블의 컬램 개수가 일치해야한 가능한데 컬럼 개수가 다른 테이블을 이용해보자.


입력값

Id:test’ union select 1 —

Pw:아무거나


위와 같이 입력하면 쿼리문은


WHERE id=‘test’ union select 1 — && pw=‘ ’


 와 같이 작성된다.

tables는 4개의 컬럼으로 구성되어 있는데 1개의 컬럼만 추가하게 되면 다음과 같은 에러가 출력된다.

"UNION, INTERSECT 또는 EXCEPT 연산자를 사용하여 결합된 모든 쿼리의 대상 목록에는 동일한 개수의 식이 있어야 합니다. 


악의적인 사용자는 에러가 출력되지 않을 때까지 컬럼수를 늘립니다.

입력값

Id:test’ union select 1,1 —


이렇게 알아낸 컬럼 개수를 기반으로 다음과 같이 시스템 테이블의 정보를 조회해 볼 수 있다. 다음 쿼리를 통해 현재 데이터베이스에 존재하는 모든 테이블 목록을 볼 수 있다.


Select * from tables where id=‘test’ union select name, object,1,1 from sys.tables  && pw=‘ ’


위와 같이 테이블 리스트 조회에 성공했다면 , 테이블 목록중 정보가 담겨있을 만한 테이블에 저장된 정보를 가져오면 된다.

예를 들어

Select * from tables where id=‘test’ union select userid, CardNo,1,1 from PaymentLog — && pw=‘ ’


위와 같이 입력하면 PaymentLog 테이블의 userid와 CardNo 유출을 시도한다.



'웹 해킹 > 취약점' 카테고리의 다른 글

eval 함수  (0) 2020.09.15
php include, wrapper 취약점  (0) 2020.09.14
serialize()함수 취약점(2) python  (0) 2020.09.14
serialize()함수 취약점(1) php  (0) 2020.09.14
strcmp 취약점  (0) 2020.09.09
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함