본문 바로가기

Wargame(hacking)/webhacking.kr

Webhacking.kr : old-39

< 문제 해결 >

 

- php 코드 -

 

<?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의 전달 값 부분을 보면 '(쿼리)가 닫혀 있지 않는 것을 볼 수 있다. 해당 쿼리( ' )를 써, id 인자 값을 무사히 전달하기 위해 POST 입력 값의 마지막에 ' ( 쿼리 )를 입력해 str_replace 함수를 우회함과 동시에 문제를 해결할 수 있게 된다. 

 

그림 1

 

아래는 db 서버에서 sql 구문을 사용한 예시

 

그림 2

 

그림 3

 

그림 4

 

그림4에서 where 조건절의 칼럼값 user_login과 'guest1 <공백>'이 같다 하고 있으며, 이는 참이 되어 1이 select 되는 것을 볼 수 있다. 이는 뒤에 공백이 존재해도, 데이터베이스가 레코드 값에 guest1과 매치되는지 검색하기 때문이다. 

 

그림 5

 

그림 5는 앞에 공백이 존재하는 경우이다. 이 때는 데이터베이스가 해당 값과 매치되는 레코드를 찾지 못한다. 

 

그림 6

 

그림 6에서 앞의 공백을 입력 값에 주었을 때, 매칭되는 값이 없어 solved 되지 않는 것을 보았다.

 

 

 

한줄 평 : DB...뭐가 문제일까?

 

 

 

 

< 참고 >

 

https://mozi.tistory.com/229

 

[DBA] 데이터타입 CHAR 와 VARCHAR 중 어느것을 써야할까?

CHAR 와 VARCHAR CHAR 고정길이 문자열 타입으로 만약 타입의 크기만큼의 데이터가 들어오지 않은경우 이후의 공간을 스페이스로 채워넣습니다.고정길이 문자열이기 때문에 헤더에는 레코드의 길이

mozi.tistory.com