일단 쓰고보자

[los] nightmare 본문

모의해킹/Lord of SQLInjection

[los] nightmare

휘갈기갈기 2020. 4. 10. 20:57

#문제

#문제 의도

- 입력 값 필터링 규칙 (pw)

if(preg_match('/prob|_|\.|\(\)|#|-/i'$_GET[pw])) exit("No Hack ~_~"); 
if(
strlen($_GET[pw])>6) exit("No Hack ~_~"); 

  1) prob

  2) _

  3) .

  4) ()

  5) #

  6) -

  7) pw 입력 값이 6자가 넘으면 안 됨

 

- 목표

pw 값을 6자 이하로 입력, 필터링을 우회하여 쿼리 결과값이 존재하도록 해라.

 

#확인사항

- 가장 먼저, 주석문을 삽입해서 뒤에 and id!='admin' 조건문을 우회해야 할 것 같다.

- Mysql에서 주석을 사용하는 방법을 알아보자.

  1) # → 필터링 됨

  2) --공백 // 예를 들어, --%20 혹은 --%09 등 → 필터링

  3) /*주석 내용*/ → 파라미터가 하나라 사용하기 부적절

  4) ;%00

- pw 입력 값을 닫아주기위해 ') 문자로 반드시 사용해야하고, ;%00 문자로 뒷 문장을 주석해야하니 최대 2문자를 사용해서 문제를 해결해야한다. 조금 가혹한 것 같은걸...

- 처음 문제를 해결하려고 할 땐 pw=('')||1;%00 와 같이 or 를 집어넣어서 해결하려고 했는데, 이 방법으론 무조건 6자를 초과해버린다. 아래를 참고해서 다른 방법을 찾아보도록 보도록 하자.

- 테스트 목적으로 test 테이블에 몇 가지 내용을 넣고, 쿼리에 따른 결과를 정리해봤다.

  1) pw=('test')=0 인 경우 pw 값이 'test' 아닌 결과만 조회되며,

  2) pw=('test')=1 인 경우 pw 값이 'test' 인 결과만 조회된다.

 

- 위 결과를 토대로, 문제 쿼리에 적용해보면 pw 값이 공백인 경우를 조회할 지, pw 값이 공백이 아닌 경우를 조회할 지 판단이 선다.

- 결론적으로 아래 4가지를 모두 충족하려면 pw=')=0;%00 이 되겠다.

  1) 입력 값 닫기

  2) pw 값이 공백이 아닌 경우 조회

  3) 주석 처리

  4) 입력 값 6자 이하

- 입력 값 6자 이하만 아니었어도 금방 푸는건데...

'모의해킹 > Lord of SQLInjection' 카테고리의 다른 글

[los] dragon  (0) 2020.05.11
[los] xavis  (0) 2020.04.24
[los] zombie_assassin  (2) 2020.04.10
[los] succubus  (0) 2020.04.08
[los] assassin  (0) 2020.04.08