수색…
소개
SQL 삽입은 SQL을 양식 필드에 삽입하여 웹 사이트의 데이터베이스 테이블에 액세스하려는 시도입니다. 웹 서버가 SQL 주입 공격으로부터 보호하지 못하면 해커는 데이터베이스를 속여 추가 SQL 코드를 실행할 수 있습니다. 해커는 자신의 SQL 코드를 실행하여 계정 액세스를 업그레이드하거나 다른 사람의 개인 정보를 보거나 데이터베이스를 수정할 수 있습니다.
SQL 인젝션 샘플
웹 애플리케이션의 로그인 핸들러 호출을 다음과 같이 가정합니다.
https://somepage.com/ajax/login.ashx?username=admin&password=123
이제 login.ashx에서 다음 값을 읽습니다.
strUserName = getHttpsRequestParameterString("username");
strPassword = getHttpsRequestParameterString("password");
데이터베이스를 조회하여 암호가있는 사용자가 존재하는지 판별하십시오.
그래서 당신은 SQL 쿼리 문자열을 생성합니다 :
txtSQL = "SELECT * FROM Users WHERE username = '" + strUserName + "' AND password = '"+ strPassword +"'";
이것은 사용자 이름과 암호에 따옴표가 포함되어 있지 않은 경우 작동합니다.
그러나 매개 변수 중 하나에 견적이 포함되어 있으면 데이터베이스로 보내지는 SQL은 다음과 같습니다.
-- strUserName = "d'Alambert";
txtSQL = "SELECT * FROM Users WHERE username = 'd'Alambert' AND password = '123'";
d
d'Alambert
뒤에 따옴표가 SQL 문자열을 d'Alambert
때문에 구문 오류가 발생합니다.
사용자 이름과 비밀번호의 따옴표를 이스케이프 처리하여이를 수정할 수 있습니다 (예 :
strUserName = strUserName.Replace("'", "''");
strPassword = strPassword.Replace("'", "''");
그러나 매개 변수를 사용하는 것이 더 적합합니다.
cmd.CommandText = "SELECT * FROM Users WHERE username = @username AND password = @password";
cmd.Parameters.Add("@username", strUserName);
cmd.Parameters.Add("@password", strPassword);
매개 변수를 사용하지 않고 값 중 하나라도 따옴표를 바꾸지 않으면 악의적 인 사용자 (해커라고도 함)가 데이터베이스에서 SQL 명령을 실행하는 데 사용할 수 있습니다.
예를 들어, 공격자가 악의적 인 경우 암호를 다음과 같이 설정합니다.
lol'; DROP DATABASE master; --
그리고 나서 SQL은 다음과 같이 보일 것입니다 :
"SELECT * FROM Users WHERE username = 'somebody' AND password = 'lol'; DROP DATABASE master; --'";
불행히도 이것은 유효한 SQL이며 DB가이를 실행합니다!
이러한 유형의 공격은 SQL 주입이라고합니다.
모든 사용자의 전자 메일 주소를 도용하거나, 모든 사람의 암호를 훔치거나, 신용 카드 번호를 도용하거나, 데이터베이스의 모든 데이터를 도용하는 등의 악의적 인 사용자가 수행 할 수있는 많은 작업이 있습니다.
이런 이유로 당신은 항상 당신의 끈을 도주해야합니다.
그리고 조만간 그렇게하는 것을 잊지 않을 것이라는 사실은 매개 변수를 사용해야하는 이유입니다. 매개 변수를 사용하면 프로그래밍 언어 프레임 워크가 필요한 이스케이프 처리를 수행하기 때문입니다.
간단한 사출 샘플
SQL 문이 다음과 같이 구성되어있는 경우
SQL = "SELECT * FROM Users WHERE username = '" + user + "' AND password ='" + pw + "'";
db.execute(SQL);
그런 다음 해커가 pw' or '1'='1
과 같은 암호를 제공하여 데이터를 검색 할 수 있습니다. 결과 SQL 문은 다음과 같습니다.
SELECT * FROM Users WHERE username = 'somebody' AND password ='pw' or '1'='1'
'1'='1'
이 항상 참이기 때문에이 테이블은 Users
테이블의 모든 행에 대해 암호 확인을 통과합니다.
이를 방지하려면 SQL 매개 변수를 사용하십시오.
SQL = "SELECT * FROM Users WHERE username = ? AND password = ?";
db.execute(SQL, [user, pw]);