일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 웹해킹
- wargame.kr
- Express
- node.js
- 웹해킹기초
- 웹기초
- 자바기초
- 자바
- 이진탐색트리
- NavBar
- 워게임추천
- 그래프
- 자료구조
- GIT
- MongoDB
- 포렌식
- 자바문제풀이
- 이진트리
- nodeJS
- gitbash
- node
- 워게임
- CTF
- 써니나타스
- 포렌식워게임
- 웹개발
- 뷰
- mongoose
- materialize
- bootstrap
- Today
- Total
보안 전공생의 공부
Lord of SQL Injection#4 orc | Blind SQL Injection 본문
◆ Blind SQL Injection
서버에서 내부 오류 메시지를 외부에 공개되지 않도록 구성한 경우
Type 변환 오류 메시지를 사용한 Database구조 파악이 불가능
→ substring(문자열, 시작위치, 길이) 문자열의 특정 문자열을 한 글자씩 찾아가는 Blind SQL Injection 공격 시도
Query 결과에 따른 서버의 참/거짓 반응을 통해 공격을 수행한다.
(Target 사이트에서 참/거짓을 구분지을 수 있는 페이지가 존재해야함)
이를 통해 db명, 테이블명, 컬럼명 ID, PW 등을 알아낼 수 있다.
(출처 : https://peemangit.tistory.com/151 )
id는 admin 이고 pw 파라미터 값을 입력받아야 한다.
그러나 db에 있는 pw에 대한 힌트는 아무것도 얻을 수 없다 ㅠ
우선 if문의 'Hello admin' 문구 출력으로 참/거짓을 유추할 수 있는지 확인해야한다.
주소 뒤에 ?pw='||1=1%23 을 입력하면
query문은
이와 같고,
1=1이 참이므로 query문이 참이 되어 Hello admin 문구가 출력된다.
주소 뒤에 ?pw='||1!=1%23 을 입력하면
query문은
이와 같고,
1!=1은 거짓이므로 query문은 거짓이 되어 문구가 출력되지 않는다.(앞의 id='admin' and pw='' 는 pw값이 없으므로 당연히 거짓 !)
이렇게 문구가 출력되는지 안되는지를 이용해 pw를 유추해나가야한다.
pw에 대해 알아야할점은 우선적으로 문자열의 길이이다 !
이는 length함수를 이용하면 된다.
?pw='|| id='admin' and length(pw)=1%23
1 자리에 2,3,4,… 를 바꿔 넣어보며 query문이 참이 되도록 만든다.
하다보면 길이가 8일 떄 문구가 출력되며 참임을 알 수 있다.
이때 id='admin'이라는 것도 함께 포함시켜야 되는 이유는 db 안에 admin 말고 다른 id들이 많기 때문이다.
pw의 길이가 8자리인 것을 알았으니,
이제 이 8글자가 무엇인지 차근차근 맞춰나가야 한다.
ascii함수와 substr함수를 이용해 첫 글자부터 유추해나가야 한다
ascii()는 괄호 안에 입력하는 문자나 문자열에 대해 그에 해당하는 아스키코드 값을 반환한다. (0~9 : 48 - 57, A~Z : 65 - 91 , a~z : 97 - 172 )
substr( string, start [], length )는 문자열 string에 대해 start위치에서부터 length만큼 문자를 추출한다. length 값이 주어지지 않으면 문자열의 끝까지 추출한다.
<첫번째 글자>
첫번째 글자부터 추정해나간다.
문자인지 숫자인지부터 찾아내보려고 한다
id='admin' and ascii(substr(pw,1,1)) < 65
참이므로 숫자임을 알 수 있다.
이제 어떤 숫자인지 맞춰나갈 것이다.
id='admin' and ascii(substr(pw,1,1)) < 57 (57은 9이다) 부터
id='admin' and ascii(substr(pw,1,1)) < 48 (48은 0이다) 까지 줄여나가며
도중에 거짓이 된다면 값을 찾아낼 수 있을 것이다.
ascii(substr(pw,1,1)) < 48 가 되면 거짓이 되므로
첫 번째 글자는 아스키코드 값이 48인 0임을 알 수 있다 !
이렇게 마지막 글자까지 찾아내면 된다.
<두번째 글자>
두 번째 글자도 숫자임
아스키코드 57 = 9
<세번째 글자>
아스키코드 53 = 5
<네번째 글자> 숫자 아니여서 당황쓰 .. 막막했던 심정 ㅋㅋㅋ ㅜ
아스키코드 97 = a
<다섯번째 글자>
아스키코드 57 = 9
<여섯번째 글자>
아스키코드 56 = 8
<일곱번째 글자>
아스키코드 53 = 5
<여덟번째 글자>
아스키코드 50 = 2
이렇게 해서 pw = 095a9852 임을 알아내었다 !!
이것을 입력하면
성공하였다 :)
사실 이번 문제는 정말 내 손으로 시작한 게 아무것도 없다 ㅠㅠ
구글링을 엄 ~~ 청 했다
다른 사람들은 단박에 Blind SQL Injection 으로 풀어야할 것을 판단하던데 신기하고 멋있었다.
나도 워게임 좀 꾸준히 해야되는 것을 몸소 깨달았다 !!
그리고 나처럼 노가다 안까고 바로 파이썬으로 쓩 푸는 사람들이 많았다 ..!
나도 다음에 파이썬 도전해보도록 ..
'Wargame > web' 카테고리의 다른 글
HackCTF #5 Guess me (0) | 2021.01.15 |
---|---|
Lord of SQL Injection#6 darkelf (0) | 2021.01.15 |
Lord of SQL Injection#5 wolfman | White Space filtering (0) | 2021.01.15 |
wargame.kr #6 fly me to the moon | javascript 난독화 (0) | 2021.01.15 |
wargame.kr #4 login filtering | SQL 우회기법 (0) | 2021.01.15 |