티스토리 뷰

LOS 포스팅에 앞서 내용이 틀릴 수도 있으며, 해당 부분 지적은 감사히 받겠습니다.

13단계 소스코드이다.

이번은 전 단계에서 조건이 더 추가되었다.

no에 substr, ascii, or, and, like, 0x, = 이 필터링되었다.

이것을 우회하고 no 값과 pw 값을 찾아서 넣으면 문제는 해결된다.

일단 blind sql을 수행하기 위한 조건인, 참과 거짓일 때 웹 페이지가 다르게 출력되는 걸 찾아야 한다.

 

공백 우회는 %09 (tab)으로 등호는 in으로 우회하여 blind sql을 시작할 조건을 갖췄다.

no 값은 2다.

and는 %26%26으로 우회했다. 

=(등호) 우회방법

1. like // 등호와 같은 방법으로 쓰인다

2. instr(a, "b") // instr(a, "b") , instr(a, b) a와 b 가 같은지 비교한다

3. ><  // 1 <a ,    a <3

4. in // a in ("b")  

like는 필터링 처리되어서 쓸 수 없으므로 4번을 사용했다.

 

이젠 pw 길이를 추출해야 한다.

pw 길이를 추출할 땐 instr()을 사용했다.

pw는 역시 8 자리이다. 

길이를 알았으니 인젝터를 사용하여 pw 값을 뽑아내면 된다.

수많은 시행착오가 있었지만 긍정적인 결과가 나온 사진만을 첨부하겠다.

 

   or 필터링으로 의도치 않게 ord() 함수까지 필터링되었다. 그래서 결과적으론 아직 내 실력으로 이진 탐색을 구현할       수 없었다. 그래서 일단 문제를 풀기 위해 순차적 검색기법을 사용했다. 그 이유는 php로 보내는 쿼리에서 pw값을

   도저히 수로 치환할 수 없었다. 그래서 문자열로 직접 비교해야만 했다. 하지만 사진에서 볼 수 있듯이 pw 값이

   52 DC3991로 나왔는데 이를 no=2과 함께 입력해봤는데 문제가 해결되지 않았다.

instr(a, "b") 함수에선 a와 b의 대소문자를 구분하지 않는다는 걸 추측했다.

또한 a in("b") 마찬가지다.

일단은 DC를 4가지 경우의 수로 넣어서 문제를 풀긴 했지만 코딩에서 완벽히 해결할 수 있는 방법이 있을까 고민해봐야겠다.

시행착오

1. and 필터링 시 %26%26 사용한다 // php에서 &&는 연산자로써 먹히지 않는 듯하다. (작동 안 함)

2. instr(a, "b")는 두 가지 경우로 나뉜다.

    2-1. b에 더블 쿼터를 씌웠을 때 영어는 대소문자를 구분하지 않고 비교한다.

    2-2. b에 더블쿼터를 씌우지 않았을 때 숫자 값을 바로 출력하고 문자 값은 형 변형을 지원하지 않는 듯하여 숫자랑            비교하자마자 끝난다. (숫자 먼저 출력하고 문자열을 인식하게 출력해서 비용을 줄일 수 있게 응용 가능하다.)

3. 아스키 코드값으로 비교를 할 수 없을 때 이진 검색을 사용할 수 없는데 이때는 순차적 검색을 사용할 수밖에 없다.

   이를 조금더 효율적이게 검색하는 방법을 찾아봐야 한다.

댓글