LOS(The Lord of the SQLI) 17 - Zombie Assassin

2021. 2. 18. 02:33정보보안/웹 해킹

BOB 3차 경연이 끝나 다시 블로그 시작

 

17번 문제 ZOMBIE ASSASSIN

 

17번 문제인 ZOMBIE ASSASSIN이다.

 

필터식을 먼저 확인해보자.

 

$_GET['id'] = strrev(addslashes($_GET['id']));
$_GET['pw'] = strrev(addslashes($_GET['pw']));

 if(preg_match('/prob|_|\.|\(\)/i'$_GET[id])) exit("No Hack ~_~"); 
 if(
preg_match('/prob|_|\.|\(\)/i'$_GET[pw])) exit("No Hack ~_~"); 

 

총 코드 네 줄의 필터식이 존재하는데,

처음 두 줄의 strrev함수는 string reverse, 즉 문자열을 거꾸로 뒤집는 함수다.

addslashes 함수는 파라미터 앞에 ', ", \, NULL 값 앞에 백슬래쉬를 붙여 특수문자가 아닌 일반 문자로 인식하게 한다.

 

 

이 두 함수를 우회해야 문제를 해결할 수 있는데,

 

id 파라미터에 싱글쿼터하나와 더블쿼터 하나를 입력해보자.

 

id 파라미터에 싱글쿼터 + 더블쿼터 입력

 

쿼리문이 다음과 같이 id = '"\'\' and pw ='' 로 완성이 될 것이다.

where 절을 분석해보면 ,

맨 처음 싱글쿼터부터, pw=' << 싱글쿼터 까지를 id 파라미터로 인식한다.

id = '"\'\' and pw =''   (빨간색이 id 파라미터 값)

왜냐하면 역슬래쉬(\) 때문에 앞에 있는 싱글쿼터들이 특수문자가 아닌 일반 문자로 인식되기 때문이다.

 

여기에 pw 파라미터로 ?을 입력해 주면,

id 파라미터에는 싱글쿼터 + 더블쿼터 입력, pw 파라미터에는 ? 입력

 

id = '"\'\' and pw ='?'라는 쿼리문이 완성되는데 이 ? 문자가 있는 위치에

이 쿼리문을 참으로 만드는 || 1=1 # 을 넣어주면 된다.

하지만 현재 코드는 strrev 함수에 의해 입력값이 거꾸로 출력되니 이 점을 고려해

# 1=1 || 으로 거꾸로 입력해주면 된다.

 

 

 

 

 

 

 

 

17번 문제 ZOMBIE_ASSASSIN Clear !