R136A1

[webhacking.kr] Challenge old-39 :: SI 본문

WEB SECURITY/SQL Injection

[webhacking.kr] Challenge old-39 :: SI

r136a1x27 2022. 2. 23. 04:35

폼 확인해보면 input 태그의 name이 id → $_POST['id'] 로 전달됨

 

<?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가 있으면 \를 없애고, '를 ''으로 교체하고 길이 16까지만 자른다.(인덱스는 15) 

 

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

 

묘하게 끝맺음이 제대로 안되어 있는 건 내 기분탓인가? => 의도된 것. 닫혀있었으면 못풀었다.

아무튼 쿼리의 결과값 $result[0] 이 1이면 풀린다.

 

이런 비슷한 류의 문제가 있었던 것 같은데,

현재 ' 를 두 개의 ' 로 교체하고 있고 그 후에 15개만 자르는 거니까

①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭' 를 전달하면

①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭'' 가 되고

①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭' 결과적으로는 다시 이렇게 된다.

id값에 15글자를 맞춰서 쿼리를 짜라는 뜻이다.
 

근데 $result[0] == 1 이 무슨 뜻인지...보면 select 1 이라고 되어있으므로

일단 값만 있으면 뽑아낸다는 것이므로, 조건을 만족시키는 게 하나라도 있으면 클리어다.

admin은 무조건 있겠지 라는 게싱으로... 풀면 된다고 한다. (이정도 게싱은 기본으로 치는 것 같다)

select 1 from member where length(id)<14 and id='admin         '
admin(5) + 공백(9) + 작은따옴표(1)

 

Comments