출처:https://systemweakness.com/lab-blind-sql-injection-with-time-delays-and-information-retrieval-2468e1cd81d0

SQL injection이란 구동중이 앱이나 웹 내에서 저장된 데이터베이스와 질의하는 과정에 사용되는 SQL 쿼리를 조작하여 데이터베이스의 정보를 빼가거나 공격자가 해당 서버의 root 권한을 습득하는 공격 방식이다.

취약점 1순위로 가장 많이 사용되는 취약점이다.

 

SQL이  발생하는 이유

입력된 값과 데이터베이스가 소통을 할 때 필터링을 제대로 하지 않는 경우에 발생한다.

input문을 통해 데이터를 받고 그 데이터를 비교하기 위해서는 비교문이 들어갈 수 밖에 없다. 이 비교문도 일반 코드이기 때문에 만약 입력된 값이 코드형태로 입력되어 앞에 있는 비교문을 주석으로 만들어버리고 권한을 습득하도록 해버린다면 자동으로 권한이 뺏겨버리는 것이다.

예시를 하나 들자면 만약 로그인을 위해 아이디와 비밀번호를 입력하는 로그인 페이지가 있다면 웹에서는 입력된 아이디와 비밀번호를 계정 정보가 있는 데이터베이스와 비교하여 로그인을 승인시켜줄 것이다. 이때 대게 참거짓이 들어가게 되는데 이 부분에서 무조건 참으로 만들게 된다면 웹에서 로그인을 승인시켜줄 수 밖에 없는것이다.

select * from client where name='anjinma' and password='1234'

select * from client where name='anjinma' and password=' or '1'='1

위와 같이 or를 삽입하고 '1'='1이라는 문구를 사용하게 된다면 1=1은 무조건 참이기 때문에 비밀번호가 틀리더라도 1=1은 참이기 때문에 or문을 통해 전체가 참이되는 것이다. 이렇게 되면 바로 로그인이 되어버리게 된다.

 

SQL injection으로 할 수 있는 일

가장 대표적으로 하는 일은 데이터베이스에서 내가 원하는 데이터를 가져올 수 있다는 것이다. 그 데이터의 형태가 계좌명 아니면 비밀번호가 될 수 있지만 최고권한 아이디 비밀번호를 알아낼 수 있다면 그 서버를 마음대로 주무를 수 있기 때문이다. 이런 최고 권한을 가져오게 되면 내가 들어온 log 기록 과 같은 꼬리가 잡힐만한 것들을 쉽게 없앨 수 있기 때문에 매우 위험하다.

 

SQL injection을 막는 방법

아래 코드는 아까 위에서 사용했던 코드이다.  이 코드 중 공격코드는 ' or '1'='1 이다. 즉 '라는 특수문자가 앞의 코드를 중간에 끊어버리고 새로운 코드와 연결시켜줬기 때문에 이러한 공격이 가능했던 것이다.

그렇다면 이 특수문자를 입력하지 못하게 한다면 SQL injection은 어려움을 겪을 것이다. 그렇기 때문에 특수문자를 막는것이다.

대표적인 코드로 mysqli_real_escape_string()이 있는데 이코드는 sql에서 특별한 의미를 갖는 문자들을 만나면 escape를 통해 sql 삽입을 방지하는 방법이다.

select * from client where name='anjinma' and password=' or '1'='1

다른 방법으로는 javascript가 브라우저에서 임의로 끌 수 있기 때문에 서버에서 한번 더 체크를 해 특수문자가 입력되지 못하도록 해야한다.

3번째로 에러 문을 발생시키지 않도록하는 것이다. 에러문을 통해 대략적인 DB의 형태를 알 아 낼 수 있기때문에 오류문구를 뜨지 않게 해야한다.

+ Recent posts