A ship in harbor is safe, but that is not what ships are built for.

STUDY/WEB_Hacking

Webhacking.kr 39번 문제(old)

플리피나리 2019. 12. 20. 08:56
반응형

 

문제의 메인화면은 위와 같다. 

뭐.. 이런저런 값을 넣어봤는데 아무런 반응이 없다.... 소스코드를 확인해보자.

 

 

중요한 부분만 살펴보자.

 

<?php
  $db 
dbconnect();        //db연결
  if(
$_POST['id']){            //post방식으로 얻어온 id값이 있다면
    
$_POST['id'] = str_replace("\\","",$_POST['id']);    //id 값 중 '\\'를 공백으로 대체
    
$_POST['id'] = str_replace("'","''",$_POST['id']);      //id 값 중  ' 문자를  ''로 대체
    
$_POST['id'] = substr($_POST['id'],0,15);    //id에서 인덱스 0에서 15까지의 문자열을 추출해 재저장
    
$result mysqli_fetch_array(mysqli_query($db,"select 1 from member where length(id)<14 and id='{$_POST['id']}"));       //db에서 member 테이블의 id의 길이가 14이하이고 입력한 id와 일치한 값이 있다면 1 반환
    if(
$result[0] == 1){    //반환된 값이 1이라면
      
solve(39);    //문제해결
    }
  }
?>

 

select 1 from table : 해당 table의 행의 개수만큼 1 반환

select 1 from table where ( ) : 해당 table에서 조건을 만족시키는 행이 있다면 1 반환

 

핵심은 id='{$_POST['id']}" 이다.  ' 가 제대로 닫히지 않았다. 

그렇다면 값을 입력하고 ' 만 닫아주면 된다. 하지만 str_replace로 ' 은 '' 로 대체되고 역슬래시로 나타내줄까 했더니 \\은 공백으로 대체되기 때문에 단순히 값을 입력할 수는 없다.

 

답은 바로 밑에 있는 substr 부분이다. 인덱스가 0에서 15까지의 문자열만을 추출하기 때문에 인덱스가 15인 값에 '가 들어가 ''로 대체되어도 잘려 '만 남는 것이다.

 

따라서 길이가 14이하인 문자열 아무거나 입력하고 공백 문자로 인덱스 14까지 채운 뒤 마지막 인덱스 15자리에 '을 입력하면 문제가 해결된다.  ex) admin          '

 

반응형

'STUDY > WEB_Hacking' 카테고리의 다른 글

Webhacking.kr 54번 문제(old)  (0) 2021.01.25
Webhacking.kr 26번 문제(old)  (0) 2019.12.18
Webhacking.kr 24번 문제(old)  (1) 2019.12.17
Webhacking.kr 18번 문제(old)  (0) 2019.12.03
Webhacking.kr 17번 문제(old)  (0) 2019.11.30