39번 문제에 들어가보니까 text 입력창이 나왔다.



코드를 보니 주석으로 index.phps 라고 적혀있었고, 그곳으로 들어가보니 소스가 있었다.



대충 해석을 해보니 id 입력값에 \\가 있으면 없애주고 '를 ''로 바꿔준다.

바꾼 값을 처음부터 15글자를 잘라 쿼리문에 붙여서 실행했을때의 결과를 배열로 저장해서,

배열의 첫번째 값이 good 이면 문제는 풀리게 된다.


mysql_query() 는 지정한 DB 에 하나의 질의를 해서 성공한다면 결과값을 오류시 false 값을 반환하는 함수이다.

mysql_fetch_array() 는 mysql_query() 를 통한 결과값을 배열로 저장하는 함수이다.

substr() 은 문자열을 잘라 반환하는 함수이다.


text field 에 아무거나 써봐도 ' 로 닫혀있지 않아 아래와 같은 오류가 나온다.



그래서 good' 과 같은 형식으로 써야하는데 '를 쓰면 ''가 되어 ' 개수가 또 맞지 않게 된다.

그런데 코드를 잘 살펴보며 15번째까지 자른다고 나왔있다.

다른 관점에서 생각해보면 16번째부터 읽지 않는다는 소리이므로 15번째에 '를 넣으면 ''로 바뀌어도 '까지만 읽어서 ' 개수가 맞게 된다.

따라서 아래와 같이 입력해보았다.




성공!



\\ 는 왜 없애는 건지 모르겠다. 특수문자 처리 못하게 하려고 없애는거면 \ 를 없애야하지 않나?

아무튼 다른 방식으로 몇번 해봤는데 일단 id 에 입력되는게 good 이 아니더라도 풀리긴 풀렸다.


특수문자 처리에 대해 알아보니 ' 는 DB 에 ' 가 들어가게 되어서 오류가 발생할 수 있으니 \' 를 통해 ' 를 문자열 처리하는 거라고 했다.

입력할 때는 \' 로 입력이 되지만 DB 에서 보이는 내용은 ' 라고 한다.


그래서 다음과 같이 시도해봤다.


처음으로는 마찬가지로 15번째에 ' 를 입력하는데 14번째에 \ 를 입력해서 특수문자 처리가 되도록 해봤다.


안 된다. good         \' 가 good         \''가 되지만 15번째에서 잘려 good         \'가 되고,

DB 에는 ' 가 문자열 처리되어 good         ' 로 입력되지만 닫는 ' 가 없어서 안 된다고 생각했다.



그렇다면 14번째에 ' 를 입력하고 13번째에 \ 를 입력한다면 어떻게 될까?



솔직히 나는 될 거라고 생각했지만 안 됬다. good        \' 가 good        \'' 가 되고 15번째에서 잘려도 그대로이기에

DB 에는 good        ' 로 입력되고, 닫는 문자열 ' 도 있어서 성공할 줄 알았지만 실패했다. 


'Hacking > Web Hacking' 카테고리의 다른 글

Webhacking.kr 10번 문제  (0) 2018.09.26
Webhacking.kr 24번 문제  (0) 2018.09.21
Webhacking.kr 5번 문제  (0) 2018.09.21
Suninatas 23번 문제  (0) 2018.09.20
Suninatas 22번 문제  (0) 2018.09.20