일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 회고
- 스프링 배치
- docker
- hackctf
- gcp ci/cd
- 사이버보안
- cloud run
- gcp
- 네트워크
- 파이썬
- nodejs
- 프로그래머스
- webhacking.kr
- Batch
- 웹해킹
- Baekjoon
- 백준
- spring Batch
- pwnable.xyz
- 포너블
- sequelize
- node.js
- 리버싱
- 시스템 해킹
- 웹보안
- kotest
- gcp cloud build
- 보안
- programmers
- Python
uju's Tech
3. webhacking.kr 18번 본문
<본 포스팅은 공부목적으로 작성되었습니다. 혹시 틀린 부분이 있거나 문제가 되는 부분이 있다면 답글 달아주세요!>
18번에 들어가게되면 위와 같은 창이 나온다
sql injection으로 푸는 문제라는 것을 알 수 있다.
index.phps 에 들어가서 보면 아래와 같은 코드가 주어진다.
소스를 살펴보면 eregi 하고 조건이 있고 그 조건을 만족하면 no hack을 출력한다는 것을 알 수 있다.
eregi 는 문자열 필터링 함수이다. eregi("찾고자 하는 문자","임의의 값") 임의의 값에서 찾고자 하는 문자를 찾으면 조건이 만족되는 것을 알 수 있다. 그리고 대소문자로 우회가 가능한지 보았는데 eregi는 대소문자 구분을 하지 않기 때문에 대소문자로 우회가 불가능하다.
|(파이프)를 기준으로 /,&,union,select,from,0x 등의 문자열들을 필터링을 한다. 위와 같은 문자열을 이용하면 no hack이 출력된다.
위의 코드는 변수 $q에 배열 형식으로 쿼리문을 저장한다. 위의 코드를 해석해보면 id='guest' and no=1 이면 hi guest 를 출력한다. and 는 둘다 참일 때 참이 되므로 admin을 출력하려면 id='guest' and no=1이아닌 아무런 값 or no=admin의 숫자 형식으로 넣어주면 될 거같다고 추측할 수 있다.
그럼 여기서 no=1이 guest인지 어떻게 알았느냐 하면 no=0부터 대입해 보았다. no=1을 대입하니 밑에 와 같이 gi guest가 뜬다.
오 no=1일때 guest라는 것을 알았으니 webhacking.kr/challenge/web/web-32/index.php?no=999%0aor%0ano=2를 해보면 hi admin 이 나와 포인트 획득:)
여기서 %0a를 써준이유는 스페이스바를 필터링 하기 때문에 이를 우회하기 위해 스페이스바을 대신하는 %0a를 써주었다. 그리고 연산자의 우선순위를 살펴보면 and 다음에 or이므로 and에서 거짓을 만들고
거짓 or 참은 참이므로 뒤에 no를 admin 값으로 만들어 admin이 출력되게 만든다.
(이 때 admin의 no가 무엇인지 모르는데 no=999%0aor%0ano=값 대입을 해보면서 찾아본다.)
'Security > Webhacking.kr' 카테고리의 다른 글
6. Webhacking.kr 58번 (0) | 2020.06.13 |
---|---|
5. Webhacking.kr 32번 (0) | 2020.06.13 |
4. webhacking.kr 24번 (0) | 2020.06.13 |
2. webhacking.kr 4번 (0) | 2020.06.13 |
1. webhacking.kr 가입하기 (0) | 2020.06.13 |