27번 문제를 접속하면 아래와 같이 SQL Injection하는 문제임을 알 수 있다.


SQL Injection 문제의 경우 소스를 주어지는 경우도 있으니 HTML 소스보기를 해보자.



역시나 index.phps가 주어진다.


따라서 php의 소스코드를 확인해 볼 수 있다.



보면 간단한 SQL 인젝션 문제이다.


no의 경우 int형 변수이기 때문에 쿼터를 사용하지 않고 인젝션이 가능하다는 의도 같다.


쿼터를 사용하지 못하며 0x가 필터링 되어 있으므로 webhacking.kr 18번 문제와 똑같이 풀어주면 된다.

(확인 해보니 18번 문제에서 괄호만 추가 되었다)



0) or id=('admin' 이라는 값을 넣어주면 전체 쿼리는


select id from challenge27_table where id='guest' and no=(0) or id=('admin')


으로 id가 admin인 row가 리턴될 것 이다.



하지만 여기서  쿼터를 사용할 수 없다는 문제가 있다.

(admin을 hex값으로 encodeing하여 mysql 쿼리문으로 넘겨주는 방법으로 우회가 가능하다)




하지만 0x를 필터링 하기 때문에 다른 방법을 사용해야한다.


admin을 hex값이 아닌 bin값으로 표현 하는 것이다.



위와 같이 admin을 한글자씩 bin값을 구해서 이어 붙이면 0110000101100100011011010110100101101110값이 나온다.



mysql에서도 정상적으로 bin값들을 문자열으로 인식한다.


따라서 아래와 같이 no값을 0) or id=(0b0110000101100100011011010110100101101110 로 보내주면 문제를 풀 수 있다.


뚜둥!! 아니다 안풀린다! nohack이라고 뜬다!


필터링을 다시 살펴보니 여는 괄호를 못쓴다.


따라서 주석처리를 통하여 뒤에 마지막 괄호를 날려버려야겠다.


0) or id='admin'-- 을 입력하면 전체 쿼리는


select id from challenge27_table where id='guest' and no=(0) or id='admin'-- )


가 됨으로 똑같이 id가 admin인 row를 리턴 할 것 이다.


mysql에서의 주석 사용은 --%20, #, /**/, ;%00 총 4가지 방법이 있다.



따라서 진짜 문제를 풀기 위해선 no 값을 0) or id=0b0110000101100100011011010110100101101110--%20 을 입력하면 된다.


문제가 안풀린다! 알고보니깐 =도 필터링을 한다.


=은 like로 대체하여 가볍게 필터링을 우회할 수 있다.


따라서 진짜진짜 문제를 풀기 위해선 no 값을 0)%20or%20id%20like%200b0110000101100100011011010110100101101110--%20로 해주면 된다.


'Wargame > webhacking.kr' 카테고리의 다른 글

webhacking.kr 28번  (0) 2016.11.21
webhacking.kr 27번  (0) 2016.11.21
webhacking.kr 26번  (0) 2016.11.20
webhacking.kr 25번  (0) 2016.11.20
webhacking.kr 24번  (0) 2016.11.19
webhacking.kr 23번  (0) 2016.11.19

+ Recent posts