LOS(The Lord of the SQLI) 8 - TROLL

2021. 1. 16. 19:55정보보안/웹 해킹

8번 문제 TROLL

 

이 문제는 보자마자 뭔가 앞서 풀었던 문제들보다 코드의 Line 수가 적다는걸 알 수 있다.

 

8번 문제는 if(preg_match('/\' /i), $_GET[id]) 필터식을 통해 id 파라미터의 싱글쿼터(')를 필터링하며,

if(preg_match("/admin/"), $_GET[id]) 필터식을 통해 id 파라미터의 "admin" 이라는 문자열을 필터링한다.

 

if($result['id'] == 'admin')을 보아 문제를 해결하기 위해서는, id 파라미터가 'admin' 이어야 한다는 점을 알 수 있다.

 

 

select id from prob_troll where id=''

 

 

?id = admin 을 입력하면 분명 두번째 필터식으로 인해 안될것이므로 패스하고,

이를 우회하기 위해서 3번 문제에서 이용했던 hex값 혹은 char 함수를 이용하는 방법을 떠올렸다.

 

'admin' 은 char(97,100,109,105,110) 과 같으므로

?id=char(97,100,109,105,110) 를 입력해본다.

 

하지만 문제가 Clear 되지 않는다.

이는 id 파라미터에 싱글쿼터 쌍이 있으므로 char(97,100,109,105,110)가 admin으로 들어가는것이 아닌,

문자열 그대로 id 파라미터로 들어가기 때문이다.

 

원래 같으면 ?id=' and 1=2 or id = char(97,100,109,105,110)와 같은 방법으로 문제를 해결하겠지만,

첫번째 필터식에 의해 싱글쿼터가 필터링 되므로 다른 방법을 이용해야 한다.

 

다시한번 두번째 필터식을 보자.

 

if(preg_match("/admin/"), $_GET[id]) 

뭔가 여태까지 봐왔던 preg_match 필터식과 다르지 않은가 ?

 

바로 대소문자를 구분하지 않음을 설정하는 i가 빠져있다.

필터식이 if(preg_match("/admin/i"), $_GET[id]) 일 경우엔 admin, ADMIN 둘 다 필터식에 막히지만

현재 필터식은 i가 없기 때문에 대소문자를 구분하게 되어

?id = ADMIN 을 입력하면 바로 문제를 해결할 수 있다.

 

 

8번 TROLL Clear !