Web Hacking/Webhacking.kr

Webhacking.kr old-55 풀이

프레딕 2024. 2. 6. 01:49
728x90

요상한 게임이 나온다. rank페이지로 접속하면은

insert문으로 점수를 매긴다는 걸 알 수 있다.

* trim 함수는 앞과 뒤 공백을 삭제시킴

 

일단 insert문이여서 할 수 있는게 제한적이다. 

score 점수를 클릭하면 저렇게 뜨는데 score인자에 다르게 값을 줘서 injection이 되는지 확인해 보겠다.

and 1=1
and 1=2

각각 score 뒤에 true와 false값을 줘보니 결과값이 달랐다. 

그러면 flag확인을 위해 blind sql injection 정도 사용해볼 수 있긴한데 flag의 테이블 필드명을 모르니

필드명을 뽑아보겠다.

 

limit 0,1 procedure analyse()

sql절 뒤에는 limit를 사용할 수 있는데 원래 limit는 아이템 수 제한을 위해 사용되지만 뒤에 procedure analyse()함수를 붙이면은 DB명, 테이블명, 컬럼명 등의 획득이 가능하다.

참고로 

limit 0,1은 첫째필드

1,1은 둘째필드

2,1은 셋째필드....

이렇게 각각의 필드를 확인할 수 있다.

flag는 아까 insert문에서 셋째필드였는데 limit 2,1 procedure analyse()를 붙여주면

 db명, 테이블명, 그리고 필드명을 확인할 수 있다.

필드명은 p4ssw0rd_1123581321이다.

 

참고로 이번 문제에선 blind sql injection에 ascii, substr 등의 함수와 따옴표 등을 사용하지 못했다. 

각 함수를 사용하면 no hack이라고 뜬다. 

이를 위해 

ascii, 따옴표 => ord, chr 함수로 대체

substr => mid, left, right 함수로 대

ord, chr은 유니코드 정수로 변환하는 함수이고

mid, left, right는 각각 문자의 중앙 왼쪽 오른쪽을 몇글자씩 가져온다.

자세히 볼 부분은

ord(right(left(p4ssw0rd_1123581321,{i}),1))={s}

요 부분이다.

p4ssw0rd_1123581321필드의 왼쪽에서 i번째까지 글자를 가져오고 그 글자들의 맨 오른쪽 글자가 flag와 동일한지 확인한다.

score=1일때 Piterpan이 출력되므로 위와 같이 코딩했다.

그러면은 flag를 획득 가능하다. 

참고로 글자 수 체크하는 코드를 안짜서 저렇게 뒤에 대괄호가 여러번 나오는데 글자수 체크 코드는 단순히

length( p4ssw0rd_1123581321) = 글자수 ? 인지를 blind sql injection으로 여러번 돌려 체크하면 된다.

728x90
반응형