이젠 뭐 익숙한 화면이네요. 바로 소스 코드부터 보겠습니다.

 

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Chellenge 39</title>
</head>
<body>
<?php
  $db = dbconnect();
  if($_POST['id']){
    $_POST['id'] = str_replace("\\","",$_POST['id']);
    $_POST['id'] = str_replace("'","''",$_POST['id']);
    $_POST['id'] = substr($_POST['id'],0,15);
    $result = mysqli_fetch_array(mysqli_query($db,"select 1 from member where length(id)<14 and id='{$_POST['id']}"));
    if($result[0] == 1){
      solve(39);
    }
  }
?>
<form method=post action=index.php>
<input type=text name=id maxlength=15 size=30>
<input type=submit>
</form>
<a href=?view_source=1>view-source</a>
</body>
</html>

 

슬쩍만 봐도 SQL 인젝션 관련 문제라는걸 알 수 있었습니다.

자세히 보니 필터링 관련 구문도 있는데 차근차근 보겠습니다.

 

<?php
  $db = dbconnect();
  if($_POST['id']){
    $_POST['id'] = str_replace("\\","",$_POST['id']);
    $_POST['id'] = str_replace("'","''",$_POST['id']);
    $_POST['id'] = substr($_POST['id'],0,15);
    $result = mysqli_fetch_array(mysqli_query($db,"select 1 from member where length(id)<14 and id='{$_POST['id']}"));
    if($result[0] == 1){
      solve(39);
    }
  }
?>

 

우리가 입력폼에 입력한다면 id 라는 객체에 값이 입력이 되고, \\는 공백으로, ' 는 ''으로 변환이 된다고합니다.

또한 입력 글자수가 0 ~ 15, 즉 15글자가 넘어가면 잘라버린다네요.

바로 아래엔 SQL 구문이 전부 적혀있습니다.

구문을 보니 id가 14자보다 적고 입력받은 id가 맞으면 1을, 아니면 0을 return한다네요.

 

ㅓ... 이렇게만 보면 감이 잘 안 잡혔습니다.

일단 '가 ''로 전부 치환되기에 ' or 1=1 -- 같은 가장 흔한 문구가 '' or 1=1이 됩니다.

위에 쿼리문에 넣으면 and id=' '' or 1=1 이런식이 되겠죠.

즉 흔한 SQL인젝션문으론 안된다는걸 알 수 있었습니다....

 

그럼 저 쿼리문에 만족하는 id를 찾아야한다고 생각해서 블라인드 SQL 공격을 떠올렸지만,

입력이 맞는지 틀렸는지 반응조차 없었고 무엇보다 15글자로 입력을 제한 받기 때문에 불가능 하다는걸 깨달았습니다.

 

진짜 막막하게 시간을 보내며 고민만 하던 중....... 요상한걸 발견했습니다.

select 1 from member where length(id)<14 and id='{$_POST['id']} 

이게 지금 쿼리문인데 뒤를 잘 보면..!

 

id='{$_POST['id']}

 

싱글쿼터가 하나 없습니다! post로 받는 id값 자리를 지워보면

 

id=

 

이 상태라는거죠! 

즉 어떤 값을 넣어도 쿼리문이 비정상적이게 되어버린다는거죠.

이제 어떤 방법으로 싱글쿼터 하나를 넣어준다면 진전이 있을 것 같습니다!

근데 싱글쿼터( ' )는 필터링되서 더블쿼터( " )로 바뀌니....

 

이럴때 이용할 것이 있습니다.

바로 위에 코드에서 걸렸던 글자수 제한입니다.

15글자가 넘어갈 시 잘라버리는 방식이던데.. 그럼 마지막 문자를 싱글쿼터로 넣으면 그게 필터링되서 더블쿼터가 되더라도 글자수 제한 때문에 뒤에 쿼터 하나가 잘려나가서 싱글쿼터가 되지않을까요?

 

바로 이용해봤습니다.

12345678901234' 이런식은 안되길래 공백문자를 좀 채워넣어서

1234          ' 이렇게 입력을 해보면..

 

 

 

짠! 문제해결입니다!

다른방법으로 admin, guest, 123 등등 문자열을 적고 공백문자로 14글자를 채운뒤 마지막에 싱글쿼터만 입력해주면

전부 문제가 풀렸습니다.

눈썰미가 좋았다면 더 금방 풀었겠네요.

'보안 > 워게임 (웹 해킹)' 카테고리의 다른 글

Challenge - old-54 write up  (0) 2025.04.05
Challenge - old-38 write up  (0) 2025.04.05
Challenge - old-10 write up  (0) 2025.03.31
Challenge - old-03 write up  (0) 2025.03.31
Challenge - old-24 write up  (0) 2025.03.24

+ Recent posts