[los] 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 ~_~");
1) prob
2) _
3) .
4) ()
5) addslashes() 함수는 싱글쿼터('), 더블쿼터("), \, NULL 문자 입력 시 문자 앞에 \를 붙여 일반 문자로 만든다.
6) strrev() 는 인자로 받은 문자열 순서를 반대로 리턴한다. 예를 들면, 'abc'를 넣으면 'cba' 리턴.
- 목표
strrev(addslashes()) 함수를 적절하게 우회하여 쿼리 결과가 존재하도록 만들면 해결.
#확인사항
- 어쨌든 싱글쿼터(')를 탈출해서 구문을 입력해야 할텐데, strrev() 함수는 문자열을 뒤집는다고 했다. 그런데 그 문자열로 addslashes()를 적용한 문자열을 넣는다고 하니... 어떤 구멍이 생길 것 같다. (우회하는 걸 방지하려고 했더니 뒤집고 앉았다.)
- 우선 쿼리 값을 참으로 만들기 위해서는 아래 쿼리가 필요하다. (목표 구문)
id='"\' and pw='or id in (0x61646D696E)#
- 입력 값에 따라 함수를 거쳤을 때의 변화를 살펴보자. 쿼리 결과에는 문자열로 취급되는 문자열을 빨간색으로 표시했다.
- 그 중 쿼리문을 원하는 방향으로 조작할 수 있는 입력 값은 더블쿼터(")가 되겠다.
- 더블쿼터(")를 사용해서 목표 구문을 만들기 위해선 아래와 같이 변수를 입력해면 된다.
id="&pw=%23)E696D64616x0( ni di ro
- 풀고 보니, addslashes() 함수와 strrev() 함수를 동시에 쓰는 사람이 있을까 싶다.