일단 쓰고보자

[los] orc 본문

모의해킹/Lord of SQLInjection

[los] orc

휘갈기갈기 2020. 4. 6. 16:56

#문제

 

#문제 의도

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

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

$_GET[pw] = addslashes($_GET[pw]); 

  1) prob

  2) _

  3) .

  4) ()

  5) addslashes() 함수는 싱글쿼터('), 더블쿼터("), \, NULL 문자 입력 시 문자 앞에 \를 붙여 일반 문자로 만든다.

- 목표

필터링을 사용하지 않거나 우회하여 admin의 pw를 알아내라.

 

#확인사항

- prob, _ 문자는 테이블 접근하지 못하도록 걸어둔 것 같고, ()는 특정 함수 쓰지 못하게 걸어둔 것 같다.

- 입력 받은 pw 값에 addslashes() 함수를 적용하여, 나쁜 짓 못하게 막아뒀다.

- 위에 쿼리 결과 id 값이 존재하는 경우 "Hello admin" 라는 문구를 띄워주는데, 관심 끄고 우리는 addslashes()를 우회해야 한다. 그러므로 멀티바이트에 대해 알아보자. → 가 아니고 "Hello admin" 문구를 통해 Blind Injection을 해야하는 문제이다.

- 처음에 addslashes() 우회한다고 삽질을 많이 했다.

- Blind Injection을 위한 기본 구문과 조건문 2가지

  pw='123' or [조건문]#

  1) length(pw)=n // n=[pw 문자열 길이]

  2) ascii(substr(pw,n,1))=m // m=[pw n번째 문자의 ascii 코드]

  ※ 조건문이 참이라면 "Hello admin"을 출력해 줄 것이고, 거짓이면 아무것도 출력하지 않을 것이다.

  ※ 위 처럼 일부 노가다가 필요한 상황이 있으므로, 웹 프록시 도구 Burp Suite 기능인 Intruder를 이용하도록 하자.

- 근데, 이 쯤에서 주의해야할 점이 있다.

문자열 하나하나 구할 때 반드시 ascii() 함수를 활용해서 ASCII 값을 구하도록 하자.

나는 ascii(substr(pw,1,1))=48 구문을 사용하기 전에 substr(pw,1,1)=char(48) 와 같이 char() 함수를 사용한 구문을 사용했는데, 큰 실수였다. 처음에 패스워드 값이 "095A9852" 임을 알아내서 입력해보았는데, 도무지 클리어가 되지 않았다. 뭔가 함정이 있는 줄 알고 한참 찾았는데, 그게 아니라 Mysql은 대소문자 구분을 하지 않는다는걸 알게 됐다. 그래서 아래 두 조건 다 참이 나옴...

  1) substr(pw,4,1)=char(65) // 대문자 'A'

  2) substr(pw,4,1)=char(97) // 소문자 'a'

오 65 참이네? 하고 넘어가면 나중에 혼돈스러울 수도 있다. 확실하게 하려면 ascii 값으로 구하자.

- 정답은 095a9852

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

[los] darkelf  (0) 2020.04.07
[los] wolfman  (0) 2020.04.07
[los] goblin  (0) 2020.04.06
[los] cobolt  (0) 2020.04.03
[los] gremlin  (0) 2020.04.03