본문 바로가기

Web Hacking/Lord of SQLInjection

[Lord of SQLInjection] 1번 gremlin write up

 

get 방식으로 id와 pw를 입력받고 있다. 정규표현식 필터링으론 

 

"prob", "_", ".", "(", ")"

을 id와 pw 동일하게 필터링 중이다. 

 

select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'

 

👆 위와 같은 쿼리문이 참이 될경우 문제는 해결되기 때문에 위 조건식을 참으로 만들면 된다.

 

a' or 1=1 #

 

👆 위 문자열을 id에게 넘겨주어 조건식을 항상 참으로 만든 후 뒷 부분을 주석처리 하였지만 풀리지 않았다. 

 

 

주석을 #말고 --%09를 이용하여 해봤다. (--이후에는 공백이 나와야 주석처리가 된다.)

 

 

클리어!

 


#이 안풀린 이유는 URL Encoding을 안해주었기 때문

 

 

위 사진은 URL Encoding을 하지 않은채 #을 그대로 넣었을 때이다. #이 패킷에서 사라진걸 볼 수 있다.

 

 

위 사진은 #을 %23으로 인코딩하여 넣었을 때이며, 패킷에 제대로 들어간 걸 볼수 있다.

 

이유로는 #은 URL에서 고유의 역할이 있기 때문에 # 자체로 써줄 경우 그 역할을 수행하게 되는 것이다. #은 URL에서 주석과 같은 역할을하며 실제 내용과는 관련이 없게 된다. 

 

#은 URL에서 앵커로 요청을 보내는 리소스의 특정 부분을 가리키는 역할을한다. 따라서 #의 뒷 부분은 요청과 함께 서버로 전송되지 않는다.