쉽고 깔끔하게

[LOS ; Lord of SQL Injection] 17번 zombie_assasin 문제풀이 본문

WebHacking/LOS

[LOS ; Lord of SQL Injection] 17번 zombie_assasin 문제풀이

찐무 2022. 4. 5. 13:14
728x90
반응형


문제

https://los.rubiya.kr/chall/zombie_assassin_eac7521e07fe5f298301a44b61ffeec0.php


풀이

 

  • preg_match($pattern, $subject, [, $matches]) : 문자열 안에서 특정한 정규식 패턴의 존재 여부를 찾는데 유용한 함수

- $pattern : 문자열로 검색할 패턴

- $subject : 입력 문자열

- [$matches] : 사용 시 패턴에 매치되는 내용을 배열에 담아둠

 

따라서 얻을 수 있는 정보로는 id와 pw의 입력 값 필터링 규칙으로 다음과 같은 정보를 필터링한다는 것이다.

1) prob

2) _

3) .

4) ( )

 

  • addslashes() : DB의 질의에서 처리할 필요가 있는 문자 앞에 백슬래시(\)를 붙인 문자열 반환, 이때 처리할 필요가 있는 문자에는 싱글 쿼터('), 더블 쿼터("), 백슬래시(\)NUL(NULL)이 있다.
    ex) It's a pen  --오류 발생-->  It\'s a pen

  • strrev() : 입력받은 문자열을 뒤집는 함수
    ex) strrev('1234') → 4321

addslashes()는 싱글 쿼터(')더블 쿼터("), 백슬래시(\)NUL(NULL)에  \ 를 통해 일반 문자열로 인식하게 만든다.

그렇기 때문에 싱글 쿼터를 2개 넣게 되면 addslashes()에 의해서 \'\'가 되고 strrev()에 의해 '\'\로 뒤집혀 아래와 같이 id의 '가 닫히게 되고, 뒤의 ' 는 \로 인해 일반 문자열이 된다.

 

따라서 id의 값으로 더블 쿼터(")를 입력하게 되면 다음과 같은 순서로 변화한다는 것을 알 수 있다.

1) id='"' and pw=''

2) id='\"' and pw=''  →  addslashes()

3) id='"\' and pw=''  →  strrev()

 

최종적인 문자열을 살펴보면 \ 를 통해 id의 ' 가 일반 문자열이 되기 때문에  id='"\' and pw='' 의 노란 부분이 파란 ' 에 묶인 하나의 일반 문자열이 된다.

 

이를 바탕으로  id="&&pw=or 1=1%23을 뒤집은 id="&&pw=%231=1 ro를 입력하게 되면 문제를 해결할 수 있다.

 

728x90
반응형