티스토리 뷰
포스팅에 앞서 내용이 틀릴 수도 있으며, 해당 부분 지적은 감사히 받겠습니다.
9번 웹페이지이다.
이번에도 심플하다.
1,2,3 버튼이 하이퍼링크 되어있다.
눌러보자.
3번에서 칼럼은 id, no이며, no 3의 id가 비밀번호라 알려주고 있다.
3번의 id를 알아내면 문제는 해결된다.
그럼 진행해보자.
여러 가지 시도를 해봤는데 필터링된 게 좀 많다.
공백, select, ><, 스키마 데이터에 관한 문자열들, 등호까지 필터링되어있다.
막막하다.
계속 시도를 했음에도 불구하고 문제에 진전이 보이지 않아 다른 블로그의 글들을 조금씩 참고했다.
일단 select가 필터링되어있어 where 절을 사용할 수 없어 데이터를 지정시켜 불러올 수 없다. (나의 현재 실력으로..)
하지만 그냥 id를 불러오면 테이블 내의 모든 id칼럼을 비교한다는 걸 알게 되었다.
이를 기반으로 쿼리를 작성해보자.
쿼리 : ?no=if(length(id)like(5),1,0)
조건이 참이 되어 정상적으로 no=1인 페이지가 출력되었다.
그리고 참일 때 값을 1,2,3으로 주면 각 id의 길이를 알아낼 수 있다.
하지만 여기서 문제가 발생한다.
거짓일 때 값을 0으로 주면 문제가 생기지 않지만, 1~3 사이의 값으로 주면 문제가 생긴다.
확인해보자.
쿼리 : ?no=if(length(id)like(6),2,1)
쿼리 : ?no=if(length(id)like(6),2,2)
두 쿼리는 거짓일 때 값만 바뀌었지만 실제 쿼리의 실행 결과가 달라진다.
첫 번째 쿼리는 Apple을 출력하고, 두 번째 쿼리는 banana를 출력한다.
허허.. 처음에 혼돈이 왔지만 여러 블로그를 뒤지다가 하나의 블로그에서 그 설명을 찾을 수 있었다.
https://whitesnake1004.tistory.com/601
[Renewal] webhacking.kr old-9 [900]
문제를 살펴보면 1 2 3 이라는 링크가 존재합니다. ↑ ?no=1 일때 출력되는 화면 ↑ ?no=2 일때 출력되는 화면 ↑ ?no=3 일때 출력되는 화면 ?no=3 일때의 출력되는 화면을 살펴 보면 칼럼은 id와 no가
whitesnake1004.tistory.com
요약을 하자면
우리는 id칼럼 중에서 하나를 특정한 게 아니기 때문에 if의 조건문에서 칼럼이 가진 데이터의 수만큼 비교를 하게 된다.
따라서 id의 길이를 총 3번 비교하게 되는데, 이 부분에서 문제가 발생한다.
순차적으로 비교하는 값과 no의 값이 일치하는 값만 반환하기에 생기는 문제이다.
아직 이해가 안 가는 게 정상이다.
쿼리 : ?no=if(length(id)like(6),2,1) 로 설명하겠다.
no=1 인 id의 길이가 6이다.
거짓으로 1을 반환한다.
no=2 인 id의 길이가 6이다.
참으로 2를 반환한다.
no=3 인 id의 길이가 6이다. (no=3인 id의 길이는 11이다. 추후에 설명 예정)
거짓으로 1을 반환한다.
이렇게 no에 해당하는 값들을 반환하게 되는데, 여기서 끝이 아니다.
바로 반환된 값과 해당 no값을 비교해 일치하는 부분만 살아남고 나머지는 소거된다.
따라서 이번 쿼리에서는 Apple과 Banana가 살아남았다.
하지만 결과는 아래와 같이 Apple만 출력되는 걸 볼 수 있는데, 이는 레코드가 2개 이상이면 처음 값을 받아들이게끔 된 것 같다.
인젝터를 만들어 no=3의 id값을 추출해보자.
그전에 길이부터 추출하자
쿼리 : ?no=if(length(id)like(11),3,0)
해당 쿼리를 통해 no=3인 id의 길이가 11 임을 확인할 수 있다.
ord()와 ascii()가 필터링당했다. 따라서 우리는 hex를 통해 구해야 한다.
바로 뽑아냈다.
비용이 적은 binary search로 하고 싶었지만 <, >이 필터링되어있어서 사용할 수가 없다..
따라서 그냥 막일로 돌렸다.
ALSRKSWHAQL
민간좀비..?
id값을 알아냈고 이 값을 그대로 입력했지만 문제가 풀리지 않았다.
낙심하고 있었지만 id값을 봤을 때, 잘못 찾은 듯 하진 않았다.
그러다 mysql, mssql은 대소문자를 구분하지 않는 게 생각이 났다.
그래서 모두 소문자로 치환 후 대입했다.
문제 해결!
시행착오
1. select로 특정 칼럼의 값을 불러오는 게 아니면 해당 칼럼에 있는 모든 데이터를 비교한다. 따라서 일반 논리와는 조금 다르게 적용된다.
2. mysql, mssql은 대소문자를 구분하지 않고 oracle은 대소문자를 구분한다.
'SQL injection > webhacking' 카테고리의 다른 글
Webhacking 11번 (0) | 2022.03.21 |
---|---|
Webhacking 10번 (0) | 2022.03.21 |
Webhacking 8번 (0) | 2022.03.14 |
Webhacking 7번 (0) | 2022.03.13 |
Webhacking 6번 (0) | 2022.03.12 |
- Total
- Today
- Yesterday
- 자바
- 기술스택
- 김영한 실전 자바 기본
- 프로그래머스 상품을 구매한 회원 비율 구하기
- los 15단계
- lord of sql
- 김영한
- zixem
- 백준 피보나치 수열
- 상품을 구매한 회원 비율 구하기 파이썬
- los 15
- 코딩테스트
- 상속
- webhacking.kr
- spring
- static
- 백준 피보나치
- 김영한 실전 자바 중급
- 프로그래머스
- 김영한 실전 자바 기초
- java
- samron
- ys.k
- 코딩테스트 준비
- extends
- samron3
- 백준
- 프로그래머스 상품을 구매한 회원 비율 구하기 파이썬
- 스프링
- Los
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |