Python 침투 테스트-SQLi 웹 공격

SQL 삽입은 웹 애플리케이션과 연결된 데이터베이스에서 원하는 응답을 검색하기 위해 URL 문자열 또는 데이터 구조에 배치되는 SQL 명령 세트입니다. 이러한 유형의 공격 k는 일반적으로 PHP 또는 ASP.NET을 사용하여 개발 된 웹 페이지에서 발생합니다.

SQL 주입 공격은 다음과 같은 의도로 수행 할 수 있습니다.

  • 데이터베이스의 내용을 수정하려면

  • 데이터베이스의 내용을 수정하려면

  • 응용 프로그램에서 허용하지 않는 다른 쿼리를 수행하려면

이러한 유형의 공격은 애플리케이션이 입력을 SQL 문으로 전달하기 전에 입력을 올바르게 검증하지 않을 때 작동합니다. 삽입은 일반적으로 주소 표시 줄, 검색 필드 또는 데이터 필드에 배치됩니다.

웹 응용 프로그램이 SQL 주입 공격에 취약한 지 감지하는 가장 쉬운 방법은 문자열에 " '"문자를 사용하여 오류가 발생하는지 확인하는 것입니다.

SQLi 공격 유형

이 섹션에서는 다양한 유형의 SQLi 공격에 대해 알아 봅니다. 공격은 다음 두 가지 유형으로 분류 할 수 있습니다.

  • 대역 내 SQL 주입 (Simple SQLi)

  • 추론 SQL 주입 (Blind SQLi)

대역 내 SQL 주입 (Simple SQLi)

가장 일반적인 SQL 주입입니다. 이러한 종류의 SQL 주입은 주로 공격자가 동일한 통신 채널을 사용하여 공격을 시작하고 결과를 수집 할 수있을 때 발생합니다. 대역 내 SQL 주입은 두 가지 유형으로 더 나뉩니다.

  • Error-based SQL injection − 오류 기반 SQL 인젝션 기법은 데이터베이스의 구조에 대한 정보를 얻기 위해 데이터베이스 서버에서 발생하는 오류 메시지에 의존합니다.

  • Union-based SQL injection − UNION SQL 연산자를 활용하여 두 개 이상의 SELECT 문의 결과를 단일 결과로 결합한 다음 HTTP 응답의 일부로 반환하는 또 다른 인 밴드 SQL 주입 기술입니다.

추론 SQL 주입 (Blind SQLi)

이러한 종류의 SQL 인젝션 공격에서 공격자는 웹 애플리케이션을 통해 전송되는 데이터가 없기 때문에 대역 내 공격의 결과를 볼 수 없습니다. 이것이 Blind SQLi라고도 불리는 이유입니다. 추론 SQL 주입은 두 가지 유형이 더 있습니다.

  • Boolean-based blind SQLi − 이러한 종류의 기술은 SQL 쿼리를 데이터베이스로 보내는 데 의존하며, 쿼리가 TRUE 또는 FALSE 결과를 반환하는지 여부에 따라 응용 프로그램이 다른 결과를 반환하도록합니다.

  • Time-based blind SQLi− 이러한 종류의 기술은 데이터베이스에 SQL 쿼리를 전송하여 데이터베이스가 응답하기 전에 지정된 시간 (초) 동안 대기하도록합니다. 응답 시간은 쿼리 결과가 참인지 거짓인지를 공격자에게 알려줍니다.

모든 유형의 SQLi는 애플리케이션에 대한 입력 데이터를 조작하여 구현할 수 있습니다. 다음 예제에서는 공격 벡터를 애플리케이션에 주입하고 출력을 분석하여 공격 가능성을 확인하는 Python 스크립트를 작성합니다. 여기서는 python 모듈을 사용할 것입니다.mechanize, 웹 페이지에서 웹 양식을 얻는 기능을 제공하고 입력 값의 제출도 용이하게합니다. 또한이 모듈을 클라이언트 측 유효성 검사에 사용했습니다.

다음 Python 스크립트는 다음을 사용하여 양식을 제출하고 응답을 분석하는 데 도움이됩니다. mechanize

우선 우리는 mechanize 기준 치수.

import mechanize

이제 양식을 제출 한 후 응답을 얻기위한 URL 이름을 제공하십시오.

url = input("Enter the full url")

다음 코드 줄은 URL을 엽니 다.

request = mechanize.Browser()
request.open(url)

이제 양식을 선택해야합니다.

request.select_form(nr = 0)

여기서는 열 이름 'id'를 설정합니다.

request["id"] = "1 OR 1 = 1"

이제 양식을 제출해야합니다.

response = request.submit()
content = response.read()
print content

위 스크립트는 POST 요청에 대한 응답을 인쇄합니다. SQL 쿼리를 중단하고 한 행 대신 테이블의 모든 데이터를 인쇄하기 위해 공격 벡터를 제출했습니다. 모든 공격 벡터는 vectors.txt라는 텍스트 파일에 저장됩니다. 이제 아래 주어진 Python 스크립트는 파일에서 공격 벡터를 가져 와서 하나씩 서버로 보냅니다. 또한 출력을 파일에 저장합니다.

먼저 기계화 모듈을 가져 오겠습니다.

import mechanize

이제 양식을 제출 한 후 응답을 얻기위한 URL 이름을 제공하십시오.

url = input("Enter the full url")
   attack_no = 1

파일에서 공격 벡터를 읽어야합니다.

With open (‘vectors.txt’) as v:

이제 각 arrack 벡터와 함께 요청을 보냅니다.

For line in v:
   browser.open(url)
   browser.select_form(nr = 0)
   browser[“id”] = line
   res = browser.submit()
content = res.read()

이제 다음 코드 줄이 출력 파일에 대한 응답을 작성합니다.

output = open(‘response/’ + str(attack_no) + ’.txt’, ’w’)
output.write(content)
output.close()
print attack_no
attack_no += 1

대응을 확인하고 분석하여 가능한 공격을 식별 할 수 있습니다. 예를 들어, 문장이 포함 된 응답을 제공하는 경우You have an error in your SQL syntax 그러면 양식이 SQL 주입의 영향을받을 수 있음을 의미합니다.