.htaccess 파일 업로드를 통해


php_flag engine off

php_value engine 0


하여 php가 실행 안되고 text로 출력되게 하는 문제였던 것 같다.


서버가 복구되고 나서 보안 설정으로 인해 업로드하면 406 Not Acceptable을 뱉는다.


고처지면 자세하게 작성 할 예정이다!


'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

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

26번 문제를 접속하면 아래와 같이 index.phps를 통해 php의 소스를 확인 할 수 있다는 것을 알려준다.



php 소스코드를 확인해보면 상당히 간단하다.



GET 메소드를 통해서 id 파라미터를 받고 urldecode를 진행한 상태에서 id가 admin이면 문제가 풀린다.


하지만 admin이라는 단어를 정규식으로 검사하기 때문에 urldecode를 이용해야한다.


즉 admin이라는 단어를 urlencode 하여 id 파라미터의 값으로 보내주면 문제가 풀릴 것 같다.


urlencode는 16진수로 표현하여 %를 붙여주는 것과 같다.



admin은 61646d696e 이므로 urlencode 한 것은 %61%64%6d%69%6e가 될 것이다.


아래와 같이 id로 넘겨주면 문제가 풀리게 된다.


이상하다. 안풀린다!



분명 urlencode하여 정답을 보냈는데 요청하고 나면 아래와 같이 admin으로 요청한 것과 같아진다.



이유는 서버의 php로 전달하기전에 브라우저 단에서 미리 urldecode를 처리한 값을 보내기 때문이다.


그렇다면 어떻게 해야할까?



브라우저의 urldecode, 서버의 php에서 urldecode 총 2번 하기 때문에 우리도 2번 urlencode해서 보내주면 된다.


결론적으로는  %61%64%6d%69%6e에서 각각의 %만 urlencode 해서 보내주면 된다.

(영어는 브라우저단에서 어짜피 urldecode 해주니깐 하나마나 똑같다)


따라서 %2561%2564%256d%2569%256e 값을 보내주면 문제를 풀 수 있다.

(%는 hex값으로 0x25이다)



끝!



'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

티스토리 툴바