본문 바로가기
webhacking.kr

[Webhacking.kr] old - 39 풀이

by jwcs 2023. 7. 14.
728x90

https://webhacking.kr/challenge/bonus-10/

 

Chellenge 39

 

webhacking.kr

/

초기 화면이다. 입력창이 하나 보인다. 소스코드를 보면서 파악해보자.

<?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);
    }
  }
?>

php부분만 뽑아왔다.

 

필터링 부분부터 살펴보겠다.

문자 '\'가 공백으로 치환된다.

싱글쿼터(')가 싱글쿼터 두 개로 치환된다.

 

우리가 입력한 값을 15글자로 자른다.

 

sql문으로 우리가 입력한 값과 같은 id를 찾는다. 그런데 자세히 보면 id='{$_POST['id']}에서 싱글쿼터로 닫히는 부분이 없다. 따라서 우리가 싱글쿼터를 입력해서 닫아줘야한다. 그런데 싱글쿼터는 필터링되어 두 개로 치환된다. 어떻게 해야할까?

 

소스 코드의 substr()함수를 이용하면 된다. admin(5글자)+아무 문자(9글자)+싱글쿼터(2글자)를 입력하면 16글자이다. 하지만 15글자까지만 잘라서 저장하니 마지막 싱글쿼터는 잘리게 된다.

 

admin은 5글자인데, 싱글쿼터로 닫기 위해 우리는 15글자를 필수적으로 입력해야 한다. 그럼 어떻게 해야할까?

 

mysql에서 varchar와 char 문자형은 정의되지 않은 문자열과 비교할 때 길이가 짧은 쪽에서 긴 쪽과 같은 길이로 맞추기 위해 공백을 padding하는 방식을 취한다. 관련자료 첨부하겠다.

https://techblog.woowahan.com/2559/

 

MySQL에서 ‘a’ = ‘a ‘가 true로 평가된다? | 우아한형제들 기술블로그

{{item.name}} DB 알못의 어떤 리서치 개요 안녕하세요 기계인간 이종립입니다. FC플랫폼개발팀에서 배민찬 백엔드를 개발하고 있습니다. DB알못인 저는 업무 중에 우연히 MySQL에서 'a' = 'a '의 결과가

techblog.woowahan.com

이 분께서 정리를 잘해주셨다. 따라서 우리가 입력한 문자열과 비교할 때 빈 부분만큼 공백을 추가해주기 때문에 우리가 입력한 문자열과 같아진다.

admin         '

이걸 입력해주자.

짜자잔

 

요약)

데이터베이스에서 취하는 문자열 비교 방식에 대해서 알고있는가

728x90
반응형

'webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] old - 24 풀이  (0) 2023.08.03
[webhacking.kr] old - 61 풀이  (0) 2023.07.20
[webhacking.kr] Challenge 16 풀이  (0) 2023.07.14
[webhacking.kr] old - 26 풀이  (0) 2023.06.27
[webhacking.kr] old-15 풀이  (0) 2023.06.27