티스토리 뷰

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

22단계 소스코드이다.

이번엔 21단계에 이어서 col, if, case, when가 추가로 필터링 되었다.

그리고 pw 값에 admin의 pw와 일치하는 값을 넣으면 문제는 해결된다.

조건문들을 사용하지 못하게 한것같다.

그리고 exit() 함수에 db에러를 출력해주는 변수가 빠졌다. 이번에는 에러문을 아무것도 출력해주지 않는다.

 

하지만 필터링된 문자를 보고 strcmp() 함수가 생각났다. 

1. strcmp(a,b) // a와 b의 값을 비교해서 a<b 0보다 작은값, a==b이면 0 a>b 0보다 큰값을 반환한다. 

하지만 이함수는 이문제를 해결하는데 사용될 순 있지만 필요가 없었다.

그리고 새로운걸 배웠다. 

select a where에서 where절이 if 와 같은 조건절로도 쓰일 수 있다.

ex) select 1 where(2>1) union select 2 // where 절이 참일 때 뒤 union select 구문이 실행된다. 이를 if문 처럼 사용 할 수 있다.

바로 pw의 길이를 추출 해보겠다.

query: ?pw='||id='admin'and(select 1 where!(length(pw)=1)union select 2)--+- 와 같이 쿼리를 작성한다.

조건절 앞에 ! 를 붙인 이유는 인젝터를 사용할 때 웹페이지에서 요청된 결과에 참과 거짓을 구분할 수 있는 차이점을 줘야하는데 편의상 참일때 정상적인 화면을 출력하는게 좋기에 조건절이 참이 되면 ! 와 합쳐서 거짓이 되고 union 구문이 실행이 안되게 끔 했다.

pw의 자리는 8자리 이고 바로 pw의 값을 찾아본다.

5a2f5d3c

문제해결

시행착오

1. 쿼리의 where 조건절을 if 문 처럼 사용할 수 있는걸 알게 되었다.

   하지만 union절이 where절 앞 뒤 어디에 와도 정상적으로 작동한다 

   ex) select 1 union select 2 where()

   ex) select 1 where() union select 2 

         ㄴ 두쿼리의 결과가 같다.

2. 참일 때 특정 결과를 출력 시키는게 인젝터를 만들기에 수월하다.

댓글