쉽고 깔끔하게
[LOS ; Lord of SQL Injection] 17번 zombie_assasin 문제풀이 본문
문제
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를 입력하게 되면 문제를 해결할 수 있다.
'WebHacking > LOS' 카테고리의 다른 글
[LOS ; Lord of SQL Injection] 18번 nightmare 문제풀이 (0) | 2022.04.07 |
---|---|
[LOS ; Lord of SQL Injection] 16번 succubus 문제풀이 (0) | 2022.04.01 |
[LOS ; Lord of SQL Injection] 15번 assassin 문제풀이 (0) | 2022.03.31 |
[LOS ; Lord of SQL Injection] 14번 giant 문제풀이 (0) | 2022.03.30 |
[LOS ; Lord of SQL Injection] 13번 bugbear 문제풀이 (0) | 2022.03.28 |