level39[old]

2022. 3. 23. 16:51Site/Webhacking.kr

이번시간에는 level39를 풀어보겠습니다

공부하는 입장이니 틀린 것 이있더라도 양해부탁드리겠습니다


 

일단 level39를 클릭하니 위 화면이 뜹니다

어떠한 값을 입력하도 그대로 리셋되네요...

view-source를 클릭해서 소스코드를 확인했습니다

 

한번 차근히 보겠습니다

<?php
  $db 
dbconnect(); // db연결
  if(
$_POST['id']){ // 만약 POST로 id값이 전달되면
    
$_POST['id'] = str_replace("\\","",$_POST['id']); //id값에있는 \\를 ""으로 치환

cf) str_replace(타겟문자열, 바꿀문자열, 문자열이 담겨있는변수)
    
$_POST['id'] = str_replace("'","''",$_POST['id']); //id값에있는 '를 "으로 치환
    
$_POST['id'] = substr($_POST['id'],0,15); //id값에서 0번째부터 15째값까지 추출

cf) substr(추출할값이담긴문자열, 추출시작index, 추출끝index)
  
$result mysqli_fetch_array(mysqli_query($db,"select 1 from member where length(id)<14 and id='{$_POST['id']}"));

// member 테이블에서 id값길이가 14미만이고 POST로 받은 id값이 일치하면은 1을 변수 result에다가 저장함
    if(
$result[0] == 1){ // 만약 result의 0번째값이 1이라면
      
solve(39); // 클리어
    }
  }
?>

 

위코드에서 중요한것을 생각해보면은

1. \\->"", '->"으로 입력하면 치환

2. 입력한 15번째까지의 값이 출력

3. result의 첫번째값이 1이어야 클리어

 

일단 무조건 앞에는 1이어야 되므로 쿼리문 테스트를 위해

1을 15번을 넘게 입력하고 그 이후부터는 써지질 않는걸 확인...

코드를 자세히 보니까 이상한 점을 찾았는데요

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

위 쿼리문에서 id의 싱글쿼터가 뒤쪽에 하나 빠져있는것을 발견했습니다

이 싱글쿼터도 해결을 해야될것같습니다

 

substr으로 입력값 15개의 문자열을 받으므로

마지막 부분에 싱글쿼터를 넣어주게되면은 더블쿼터로 치환되어 총 문자는 16개가 됩니다

하지만 다시 substr은 15개의 문자열만 받게 되니깐 16번째에 있는 더블쿼터중 마지막 쿼터를 없애야 되니

" -> ' 으로 변경될것같습니다 

 

앞에는 무조건 1이고 뒤에는 무조건 '이 와야되니 10000000000000' [0 = 공백]처럼 작성면 클리어 될것같습니다

 

 

cf) 

mysql에서는 'a'='a     ' -> true   

'a' like 'a    ' ->  false

 

'Site > Webhacking.kr' 카테고리의 다른 글

level38[old]  (0) 2022.03.24
level23[old]  (0) 2022.03.23
level27[old]  (0) 2022.03.23
level25[old]  (0) 2022.03.21
level1[old]  (0) 2022.03.21