2022. 4. 13. 16:17ㆍSite/LOS
이번시간에는 dragon을 풀어보겠습니다
공부하는 입장이니 틀린것이 있더라도 양해부탁드리겠습니다
소스코드를 확인해 보겠습니다
preg_match 함수로 prob _ . ( ) 를 필터링
$query = "select id from prob_dragon where id='guest'# and pw='{$_GET[pw]}'"
$result['id'] 가 있다면 Hello $result['id'] 값을 출력
$result['id'] 가 admin과 일치한다면 클리어
그런데 쿼리부분을 보니깐 id='guest'# 에 주석처리가 되어있어서 and pw='{$_GET[pw]}'" 를 다 무시해버리기 때문에 pw에 어떠한 값을 넣어주어도 Hello guest 밖에 안나올 것 같습니다.
접근방법
pw에 값을 인식하게 시켜주기 위해선 줄바꿈문자를 사용하면 클리어 될 것 같습니다.
#나 -- 은 한줄로 밖에 주석처리를 안해줍니다.
따라서 줄만 바꾼다면 #가 있는 해당 라인만 주석처리가 될 것이고 줄이 바뀐 부분에 새로운 쿼리문을 작성해주면 될 것 같습니다. [\n -> %0a]
"select id from prob_dragon where id='guest'# and pw='%0a or id='admin
이렇게 되면 # and pw=' 부분만 주석처리되고 줄바꿈[%0a] 부터 새로운 쿼리문을 삽입이 가능해집니다.
?pw='%0a or id='admin 형태로 넣어주겠습니다.
해당 쿼리문을 넣어주니 그대로 Hello guest 가 출력되었습니다.
아마 or 앞에 까지 false값을 만들어주지 않아서 그런것 같습니다.
앞부분을 false 로 만들어 주기 위하여 0=1을 넣어주겠습니다 -> ?pw='%0a and 0=1 or id='admin
"select id from prob_dragon where id='guest'# and pw='%0a and 0=1 or id='admin[빨간색:false값 파란색:줄바꿈문자 초록색:true값]
위 쿼리문을 넣어주니 클리어 되었습니다