티스토리 뷰
$_GET['id'] = strrev(addslashes($_GET['id']));
$_GET['pw'] = strrev(addslashes($_GET['pw']));
우선 id 와 pw 파라미터를 전부 addslashes 로 먼저 필터링을 해줍니다.
addslahes 에 대해서 잠시 복습해보자면, 인자 값으로 들어온 문자열에서 '(작은따옴표), "(큰 따옴표), \(백슬래시), NUL(널바이트) 와 같은 문자가 오게 되었을 때 해당 문자 바로 이전에 \(백슬래시)를 추가해주는 기능을 하는 함수입니다.
아래 예시는 '(작은 따옴표)가 addslashes 함수에 의해서 \(백슬래시)가 추가되어 이스케이핑 되는 모습입니다.
<?php
$str = "Is your name O'Reilly?";
// Outputs: Is your name O\'Reilly?
echo addslashes($str);
?>
아무튼 다시 문제의 코드로 돌아와서 addslahes 함수를 수행한 이후에 strrev 라는 함수를 다시 수행합니다.
strrev 함수는 함수 이름 그래도 문자열(string)을 뒤집습니다(reverse).
아래 예시를 보겠습니다. Hello world! 가 !dlrow olleH 가 되게 됩니다.
<?php
echo strrev("Hello world!"); // outputs "!dlrow olleH"
?>
계속 이어서 다음 코드를 보겠습니다.
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
이제 다시 id 와 pw 에 대한 필터링이 주어집니다. 여기서 id 와 pw 는 위 strrev 와 addslashes 함수에 의해 바뀐 값들에 대하여 필터링이 주어지는 것입니다. 필터링은 prob 이라는 단어가 포함되서는 안되고, _(언더바), .(온점), ()(괄호)가 포함되서는 안된다고 합니다.
$query = "select id from prob_zombie_assassin 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("zombie_assassin");
그리고 문제는 사용자가 입력한 id 와 pw 파라미터에 대한 최종 변조값을 query 문에 삽입하고 그 결과 값으로 prob_zombie_assassin 이라는 테이블의 id 값으로 존재할 경우 문제가 풀린다고 합니다.
이번 문제는 이전에 풀었던 succubus 문제와도 연관이 있다고 생각됩니다. 이번에도 결국에는 \(백슬래시)를 활용해서 풀 수 있을 것 같습니다. 왜냐하면 addslashes 함수로 인해서 백슬래시가 추가될 것이기 때문입니다.
한번 큰따옴표를 넣어보겠습니다.
select id from prob_zombie_assassin where id='"\' and pw='#'
큰 따옴표를 넣게 되면 addslahes 함수에 의해서 \(백슬래시)가 추가되겠죠. 그리고 strrev 함수에 의해서 반전될 것입니다. 그 과정을 나열해보겠습니다.
- " (id 파라미터 input 값)
- \" (addslashes)
- "\ (strrev)
위 같은 과정에 의해서 "\ 가 query 문에 삽입되어서 위와 같은 구문이 만들어집니다. 그리고 추가로 pw 에 # 값을 입력해줬습니다. succubus 문제와 똑같습니다. 이번에도 id 에 해당하는 값은 "\' and pw = 까지가 모두 id 값에 해당하게 됩니다.
그리고 동일하게 pw 에 query 구문이 True(참)이 될 수 있는 구문만 넣어주면 문제는 해결되겠습니다.
select id from prob_zombie_assassin where id='"\' and pw='||1#'
그리고 당연하겠지만 pw 파라미터의 값도 strrev 함수에 의해서 반전되니깐 반대로 써줘야합니다. URL 페이로드는 아래와 같습니다.
?id="&pw=%231||
(%23 은 # 을 URL 인코딩 해준 것입니다.)
위와 같이 URL을 입력하고 페이지를 전송하면 아래와 같이 문제가 풀린 것을 확인하실 수 있습니다.
'보안 > Wargame' 카테고리의 다른 글
[Hackthebox] - Under Construction Writeup(문제풀이) (0) | 2021.09.13 |
---|---|
[Lord of SQLi] nightmare Writeup/문제풀이 (0) | 2021.09.07 |
[Lord of SQLi] succubus Writeup/문제풀이 (0) | 2021.09.07 |
[Lord of SQLi] assassin Writeup/문제풀이 (0) | 2021.09.07 |
[Hackthebox] - wafwaf Writeup(문제풀이) (0) | 2021.09.06 |