티스토리 뷰

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

24단계 소스코드이다.

23번 문제와 굉장히 유사하다.

이번엔 sleep, 와 benchmark함수 등을 필터링하였다. 이는 시간 기반 공격을 막기 위한 것으로 추측된다.

하지만 if가 필터링되지 않았기에 공격 가능하다. 

일단 참과 거짓을 구분할 수 있는 포인트를 찾는 게 중요하다.

order by에 칼럼수 이하의 수를 집어넣었을 때 정상적으로 데이터가 출력되지만

4를 집어넣으니 아무 결과도 출력되지 않는다.

이 점을 이용해 문제를 풀어보겠다.

일단 email의 길이부터 추출한다.

email의 길이는 정상적인 상황이라면 무조건 1보다는 클 거니까... 정상적으로 데이터가 출력되었다.

거짓인 조건을 넣었을 때 데이터가 출력이 안되지 않고 rubiya에 해당하는 데이터들이 먼저 출력된다.

하지만 이대로 인젝터를 돌리기전 text.find()를 사용하기에는 적절치 않다.

limit를 사용하여 적절하게 만들어준다.

인젝터를 돌릴 준비는 끝났다.

 

하지만 결과적으론 인젝터는 정상적으로 작동하지 않았다...

aasup3r_secure_email@emai33com으로 출력되었고 이는 정답이 아니었다.

도대체 뭐가 문제일까 생각하다가 문득 떠오른 게 하나 있다.

바로 if (res.text.find("50")!=-1):  부분이다......

내가 짠 코드는 ascii 코드의 값을 이진 탐색으로 검색하며, 비교하는 과정 중 웹페이지의 query : 부분 즉

이 부분에서 if문이 참이 되고 있던 것이었다... 그래도 생각보다 빨리 찾아내서 기분은 좋다.

바로 확실하게 참과 거짓을 구분할 수 있게끔 쿼리문을 고쳤다.

query의 and의 뒤에! 를 붙이고 text.find() 값을 "rubiya"로 수정했다.

기존에는 참 페이지에서 "50"을 찾는 거였지만 수정 후 참일 때 if문을 거짓으로 만들어 "rubiya"를 추출하는 방법으로 만들었다.

이제야 제대로 찾은 것 같다.

정답!

 

시행착오

1. order by 절에서 1, 2,3의 값 중 하나로 참 거짓 화면이 구분될 줄 알았는데 실제로 되지 않았다. 하지만

   order by에 오류를 내는 값을 넣었더니 구분이 가능한 화면이 나와서 문제를 해결할 수 있었다.

2. 웹페이지에 내가 쓴 쿼리를 다시 표현해줄 때는 ascii()와 ord()같은 함수로 문자를 치환하고 text.find()에 범위내 숫자     를 넣으면 탐색에서 오류가 생길 수도 있으니 우회할 방법을 잘 찾거나 확실히 참 거짓을 구분할 수 있게끔 해야한다.

 

댓글