6번째 줄에 preg_match를 보면', ", `를 사용하지 못하게 설정되어 있다.
7번째 줄에 id값에 guest가 들어가있고, no의 값을 받는다.
10번째 줄에 id가 admin이면 문제가 해결된다.
따라서 싱글쿼터(')를 사용하지 않고 id값에 admin을 넘겨주는 것이 목적이다.
no값에 1을 삽입해보니 Hello guest라고 출력되는 것을 보니 guest의 no값은 1인것 같다.
※운이 좋아서 guest의 no값이 1이라는 것을 알아서 id='guest' and no={$_GET[no]}부분을 무력화 시킬 수 있겠지만,
no의 값을 모르는 상태에서 쿼리문을 확실하게 무력화시키기위해서는 의미없는 값을 집어넣는 것이 가장 좋다
MySQL의 문자열 함수
MySQL에서 SQL Injection을 수행할때 많이 사용하는 문자열 함수들이 존재한다.
ord()함수를 통해서 문자열의 가장 왼쪽의 문자를 ASCII의 10진수로 변환합니다.
※ORD(str)함수 : 문자열 str의 가장 왼쪽에 있는 문장의 아스키 코드값을 가져온다. 특히 한글과 같이 2Byte이상으로 이루어진 문자에 대해서도 비트연상을 통해 값을 가져올 수 있다. 따라서 한글과 같은 문자의 아스키 값을 가져올 때 사용할 수 있다.
admin이라는 값을 ord()함수에 넣게 되면 가장 왼쪽에 있는 문자인 a의 10진수 ASCII코드 '97'을 사용합니다.
ord(id)=97 : id에서 가장 왼쪽 값이 'a'인 값
id 값은 : guest & no=0 or ord(id)=97를 삽입했다.
이와 동일하게 생각했을 때
id=guest & no=0 or id=0x61646D696E를 삽입해도 동일하게 문제가 해결될 것 같아 삽입해보니 역시나 풀렸다!
SQL 문으로 풀어보자면,
select id from prob_goblin where id='guest' and no=0 or ord(id)=97
select id from prob_goblin where id='guest' and no=0 or id='admin'
이와 동일한 것이며, 결과적으로는 두 쿼리가 동일한 것이다.
'Webhacking' 카테고리의 다른 글
[LOS] Level 6 darkelf 문제풀이 (0) | 2019.05.31 |
---|---|
[LOS] Level 5 wolfman 문제풀이 (0) | 2019.05.31 |
[LOS] Level 4 Orc 문제풀이 (0) | 2019.05.31 |
[LOS] Level 2 Cobolt 문제풀이 (0) | 2019.05.24 |
[LOS]Level1 gremlin 문제풀이 (0) | 2019.05.24 |