SQL 주입 공격 흔 한 방식 및 테스트 방법

4299 단어 웹 보안 테스트
본 고 는 주로 SQL 주입 의 의미 와 SQL 주입 을 어떻게 하 는 지, 그리고 SQL 주입 을 어떻게 예방 하 는 지 에 대해 파트너 에 게 알 리 고자 한다.적 용 된 사람들 은 주로 테스트 인원 입 니 다. SQL 주입 을 어떻게 하 는 지 알 고 로그 인, 발표 등 모듈 의 SQL 공격 구멍 을 테스트 하 는 데 도움 을 줄 수 있 습 니 다. SQL 주입 을 어떻게 예방 하 는 지 에 대해 서 는 이치대로라면 알 아야 할 일 을 개발 하 는 것 이 어야 합 니 다. 하지만 훌륭 한 테스트 로 서 원리 가 bug 의 발생 원인 을 더욱 투철 하 게 이해 할 수 있 는 지 알 수 있 습 니 다. 좋 습 니 다. 말 이 많 지 않 습 니 다.본론 으로 들 어 갑 니 다.
SQL 주입 (공격) 을 어떻게 이해 합 니까?
SQL 주입 은 입력 매개 변수 에 SQL 코드 를 추가 하여 서버 에 전달 하여 분석 하고 실행 하 는 공격 기법 이다.
SQL 주입 공격 은 입력 매개 변수 가 여과 되 지 않 은 다음 에 SQL 구문 에 직접 연결 하여 분석 하고 예상 치 못 한 행 위 를 실행 하 는 것 을 SQL 주입 공격 이 라 고 합 니 다.
SQL 주입 은 어떻게 생 성 됩 니까?
1) WEB 개발 자 는 모든 입력 이 걸 러 졌 다 고 장담 할 수 없다.
2) 공격 자 는 SQL 서버 에 보 내 는 입력 매개 변수 구 조 를 이용 하여 실행 가능 한 SQL 코드 (get 요청, post 요청, http 헤더 정보, 쿠키 에 추가 가능)
3) 데이터베이스 에 해당 하 는 보안 설정 을 하지 않 음
어떻게 SQL 주입 공격 을 진행 합 니까?
php 프로 그래 밍 언어, my sql 데이터 베 이 스 를 예 로 들 어 SQL 주입 공격 의 구조 기법, 구조 방법 을 소개 합 니 다.
1. 숫자 주입
브 라 우 저 주소 표시 줄 에 입력: learn. me / sql / article. php? id = 1, 이것 은 get 형 인터페이스 입 니 다. 이 요청 을 보 내 는 것 은 검색 어 를 호출 하 는 것 과 같 습 니 다.
$sql = "SELECT * FROM article WHERE id =",$id

정상 적 인 상황 에서 id = 1 의 글 정 보 를 되 돌려 야 합 니 다.그러면 브 라 우 저 주소 표시 줄 에: learn. me / sql / article. php? id = - 1 OR 1 = 1 을 입력 하면 SQL 주입 공격 입 니 다. 모든 글 의 관련 정 보 를 되 돌려 줄 수 있 습 니 다.왜 이러 지?
이것 은 id = - 1 은 영원히 false, 1 = 1 은 영원히 true 이 고 모든 where 문 구 는 영원히 ture 이기 때문에 where 조건 은 where 조건 을 추가 하지 않 은 것 과 같 습 니 다. 그러면 조회 결 과 는 전체 표 의 내용 에 해당 합 니 다.
2. 문자열 주입
이러한 사용자 로그 인 장면 이 있 습 니 다. 로그 인 화면 은 사용자 이름과 비밀번호 입력 상자, 그리고 제출 단 추 를 포함 합 니 다.사용자 이름과 비밀 번 호 를 입력 하여 제출 하 십시오.
이것 은 post 요청 입 니 다. 로그 인 할 때 인터페이스 learn. me / sql / login. html 를 호출 합 니 다. 먼저 데이터 베 이 스 를 연결 한 다음 에 배경 에서 post 요청 매개 변수 에 지 니 고 있 는 사용자 이름, 비밀 번 호 를 매개 변수 검사 합 니 다. 즉, sql 의 조회 과정 입 니 다.정확 한 사용자 이름과 비밀 번 호 를 user 와 pwd 123 이 라 고 가정 하고 정확 한 사용자 이름과 비밀 번 호 를 입력 하고 제출 하면 다음 과 같은 SQL 문 구 를 호출 한 것 과 같 습 니 다.
SELECT * FROM user WHERE username = 'user' ADN password = 'pwd123'

사용자 이름과 비밀 번 호 는 모두 문자열 이기 때문에 SQL 주입 방법 은 매개 변수 가 가지 고 있 는 데 이 터 를 my sql 에서 설명 하 는 문자열 로 바 꾸 는 것 입 니 다.my sql 에는 두 가지 주석 방법 이 있 습 니 다.
1) '\ #': '\ #' 이후 모든 문자열 은 주석 으로 처 리 됩 니 다.
사용자 이름 입력: user '\ # (작은 따옴표 닫 기 user 왼쪽 에 있 는 작은 따옴표), 비밀 번 호 는 마음대로 입력 합 니 다. 예 를 들 어 111, 그리고 제출 단 추 를 누 르 십시오.SQL 구문 과 같은 값:
SELECT * FROM user WHERE username = 'user'#'ADN password = '111'

'\ #' 뒤에 주석 이 떨 어 졌 습 니 다. 다음 과 같 습 니 다.
SELECT * FROM user WHERE username = 'user' 

2) '-' (- 뒤에 빈 칸 이 있 음): '-' 뒤의 문자열 은 모두 주석 으로 처 리 됩 니 다.
사용자 이름 입력: user '-- (주의 - 뒤에 빈 칸 이 있 습 니 다. 작은 따옴표 가 user 왼쪽 에 있 는 작은 따옴표) 비밀 번 호 를 임의로 입력 합 니 다. 예 를 들 어 111, 그리고 제출 단 추 를 누 르 십시오.SQL 구문 과 같은 값:
SELECT * FROM user WHERE username = 'user'-- 'AND password = '111'
SELECT * FROM user WHERE username = 'user'-- 'AND password = '1111'
'-' 뒤에 주석 이 다 떨 어 진 것 은:
SELECT * FROM user WHERE username = 'user'

따라서 상기 두 가지 상황 은 잘못된 비밀 번 호 를 입력 하거나 비밀 번 호 를 입력 하지 않 으 면 'user' 라 는 계 정 에 로그 인 할 수 있다 는 것 은 매우 위험한 일이 다.
어떻게 SQL 주입 을 예방 합 니까?
개발 자 들 이 생각해 야 할 문제 입 니 다. 테스트 요원 으로서 SQL 주입 을 어떻게 예방 하 는 지 알 고 공격 bug 를 주입 할 때 bug 발생 원인 을 포 지 셔 닝 할 수 있 습 니 다.
1) 입력 변수의 종류 와 형식 을 엄 격 히 검사한다.
정수 매개 변수 에 대해 판단 조건 을 추가 합 니 다. 비어 있 으 면 안 되 고 매개 변수 유형 은 숫자 여야 합 니 다.
문자열 매개 변 수 는 정규 표현 식 으로 걸 러 낼 수 있 습 니 다. 예 를 들 어 [0 - 9a - zA - Z] 범위 내의 문자열 이 어야 합 니 다.
2) 필터 와 전의 특수 문자
username 이라는 변 수 를 사용 하기 전에 ',', ', \ \ 등 특수 문 자 를 전의 합 니 다. 예 를 들 어 phop 의 addslashes () 함수 가 username 매개 변 수 를 전의 합 니 다.
3) mysql 의 사전 컴 파일 메커니즘 이용
sql 문장의 템 플 릿 (변 수 는 자리 차지 문자 로 자리 차지)my sql 서버 에 보 내 고 my sql 서버 는 sql 문장의 템 플 릿 을 컴 파일 합 니 다. 컴 파일 한 후에 문장의 최적화 분석 에 따라 해당 하 는 색인 을 최적화 시 킵 니 다. 최종 바 인 딩 매개 변 수 를 my sql 서버 에 전송 하여 직접 실행 하고 sql 조회 시간 과 my sql 서버 의 자원 을 절약 하여 한 번 의 컴 파일, 여러 번 의 실행 목적 을 달성 합 니 다. 이 를 제외 하고또한 SQL 주입 도 방지 할 수 있 습 니 다. 구체 적 으로 SQL 주입 을 어떻게 방지 합 니까? 실제로 바 인 딩 된 매개 변 수 를 my sql 서버 에 전달 하고 my sql 서버 는 매개 변 수 를 컴 파일 합 니 다. 즉, 해당 하 는 자리 표시 자 를 채 우 는 과정 에서 전의 작업 을 했 습 니 다.

좋은 웹페이지 즐겨찾기