티스토리 뷰

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

12단계 소스코드이다.

no 에는 ascii, substr, probl , _ ,. , () 이 필터링된 모습이다.

입력받은 pw 값은 ', ", null을 필터링하는 모습이고 그 값이 admin과 같으면 해결된다.

pw 뒤에 싱글 쿼터가 바로 막힌다. 일단 싱글 쿼터 필터링을 우회해야 한다.

그렇게 생각했는데 새로 배운 게 있다. no 뒤에는 더 이상 쿼리문이 없기 때문에 바로 추가 쿼리를 날릴 수 있다.

간단한 쿼리로 참값을 만들어본다.

이제 blind sql로 pw 값과  no 값을 알아내면 된다.

pw의 자릿수는 8자리이다.

또한 admin의 no 값은 2다.

이제 admin 의 pw 값을 알아내면 되는데 substr과 ascii 가 필터링되어있다.

substr 은 right(left(pw, {}),1)로 우회할 수 있고 ascii()는 ord()와 chr()로 우회할 수 있다.

1. ord('A') -> 65   // 문자를 아스키 값으로 변환해준다.

1-2. ord('a') -> 97  

 

2. chr(65) -> A // 숫자를 문자로 변환해준다.   

2-1. chr(0x41) -> A

하지만 지금은 아스키코드로 변환해줘야 하기 때문에 ord() 함수를 채택한다.

그에 따른 코드를 작성하고 pw를 추출한다.

추출한 pw 값과 no 값을 입력한다.

문제 해결.

느낀 점

1. 싱글 쿼터가 우회되어있을 때 더블 쿼터로 대체할 수 있는데 이는 파이썬 인젝터에서 문자열에 문제를 주므로 URL인코딩해서 사용하거나 hex로 변환해서 사용한다.

    1-1. " -> URL 인코딩 %22

    1-2. hex -> 0x뒤에 값을 넣음

 

2. ascii() 함수 필터링 우회는 ord()로 사용하면 된다. 똑같이 작동한다.

 

3. 쿼리 문의 where절 맨뒤에는 쿼리를 추가로 작성할 수 있다.

    3-1. ex) select id from ---- where id=1 and pw =2 and no=1'or1=1--+-

                     ㄴpw와 no 가 필터링되어있는 게 달라 생각을 못했다... 실화냐

4. and 와 && 의 차이점

    4-1. 우선순위  and < = < &&, ||으로 &&, || 의 우선순위가 더 높다.  ex) b= true and false // b = true이다!!

    4-2. 또한 and와 & 가 php에서 하는 역할은 다르기 때문에 착각하지 않도록 해야 한다. and = 논리 연산자,

          & = where절 뒤의 조건을 이어준다. 

 

5. 쿼리 맨뒤에 쿼리문을 작성하려면 바로 전 조건에 아무 값이라도 넣어야 한다.

    5-1. ex)? pw=&no=""like""   // false

          ex)?pw=&no=1""like"" // true

 

 

 

댓글