view-source 클릭 !
$_POST['id'] = POST방식으로 전달되는 id
id에 "\\"가 포함되어있으면 공백으로 대체되고, " ' "는 " ' ' "로 대체된다.
그 후, id값 중 0~15번째 문자만 추출해서 저장한다.
추출된 문자열은 select문에 쓰이게 되고, select문이 성립하면 문제가 해결된다.
여기서 알아야 할 점 !
mySQL에서 'a' = 'a '의 결과는 1(TRUE)이다.
-> char에서는 문자열을 비교할 때 공백을 채워서 비교하는 방법을 사용한다. 공백 채우기 비교에서는 우선 짧은 쪽의 끝에 공백을 추가하여 2개의 데이터가 같은 길이가 되도록 한다. 그리고 앞에서부터 한 문자씩 비교한다. 그렇기 떄문에 끝의 공백만 다른 문자열은 같다고 판단된다.
-> 그에 반해 VARCHAR 유형에서는 맨 처음부터 한 문자씩 배교하고 공백도 하나의 문자로 취급하므로 끝의 공백이 다르면 다른 문자로 판단한다.
추가로, mySQL에서는 대소문자도 구별하지 않아 'a' = 'A'의 결과도 1(TRUE)이다.
( 나도 문제풀면서 이번에 처음알게된 사실.., ଘ(੭*ˊᵕˋ)੭ )
문제를 해결하기 위해 우리는 select문을 TRUE로 만들어줘야한다.
select문을 보면, $_POST['id'] 앞에 '가 붙어있는 것을 볼 수 있다. 그러므로 우리는 $_POST['id'] 입력 마지막에 '를 붙여줘야한다.
또한 substr함수를 통해 $_POST['id'] 중 0~15번째 문자만 추출하는데, select문의 length(id)<14를 만족해야하므로 $_POST['id']를 공백으로 채워줘야한다.
그러므로 aaa ' 를 입력하면 !
문제 해결 ㅎㅅㅎ
마지막에 쓴 '는 ' '로 대체되어도 15번째 문자까지만 추출하기 때문에 마지막 '는 사라지게 된다.
참고
>> https://woowabros.github.io/study/2018/02/26/mysql-char-comparison.html
'WEB > webhacking.kr (old)' 카테고리의 다른 글
webhacking.kr 41번 (0) | 2020.02.13 |
---|---|
webhacking.kr 37번 (0) | 2020.02.13 |
webhacking.kr 38번 (0) | 2020.02.12 |
webhacking.kr 36번 (0) | 2020.02.11 |
webhacking.kr 32번 (0) | 2020.02.11 |