1

PHP - 게시판 제작 7 - 게시판 해킹하기

PHP - 게시판 제작 7 - 게시판 해킹하기

노아의 블로그

    목차
반응형

안녕하세요. 이제 게시판 기능을 얼추 구현하였습니다.

하지만. 여기에는 심각한 취약점이 있습니다. 

 

read 페이지를 공격 해 볼까요?

 

여기서 알 수 있는점은.. bno로 게시글을 조회한다는것. 따라서 board 테이블에는 bno가 존재한다.

board 테이블에는 title과 content가 있다는것을 알 수 있습니다.

 

bno로 조회를 하는것이니까 쿼리문을 생각해봅시다.

select ? from ? where bno = ?

 

근데, bno는 숫자 타입이니까 따옴표가 없습니다. 맞추지 않고 그냥 공격해도 됩니다.

 

select ? from ? where bno = ? and 1 = 1

 

숫자와 문자를 섞어서 요청을 해 봅시다.

아무것도 뜨지 않습니다. 

 

이제 and 1 = 1을 Injection 해 봅시다.

정상적으로 출력이 됩니다. 즉 SQL Injection 취약점이 있다는 소리입니다.

 

다른 게시물도 정상적인 출력이 가능합니다. 이제 확정되었습니다.

 

order by [인덱스] 로 컬럼 수를 알아냅니다. 

order by 6에서 아무런 결과가 뜨지 않습니다. 즉 컬럼 수는 5개라는것을 알 수 있습니다.

 

컬럼 수를 알았으니,  union injection 공격을 시도합니다.

정상적인 출력이 되었으나, 우리가 원하는 결과가 나오지 않았습니다.

 

result가 두개가 나오니까 뒤에것이 밀리는것입니다.

두가지 방법이 있습니다. 앞을 지우거나,정렬하거나.

일단 첫 번째 방법이 더 쉬우니 첫 번째 방법을 시도합시다.

 

bno를 존재하지 않는 -1로 바꿔보리고 union select결과만 출력될 수 있도록 합니다.

 

5,4번만 출력이 되는것을 확인할 수 있습니다.

 

5번자리에 database() 를 써서 db명을 추출합니다. db명이 test 라는것을 알아냈습니다.

 

이제 table명을 알아냅시다.

 

tbl_name 인줄 알았는데 table_name 이였음.. 버전에 따라 다른가봅니다. 일단 board 라는 테이블을 알아냈지만

전혀 흥미롭지 않구요. 사용자의 정보를 조회해봅시다.

limit절로 바꿔보니 test_tbl이라는 테이블명이 나왔군요! (실수: 여기서는 별로 상관없지만 limit 1,1 입니다.)

 

이제 column 이름을 알아냅시다.

 

오호 test_tbl에는 id column가 있군요.

 

 

이제 모든 정보를 알아냈습니다.

 

test 데이타베이스에는 test_tbl이라는 테이블이 있고 test_tbl는 id,pass,name이라는 column 을 가지고 있습니다.

따라서 select id,pass,name from test_tbl 을 하면 정보가 나올것입니다.

 

하지만, 데이터는 3개인데 출력하는곳은 4,5번 즉 2개이죠 이럴때는 concat를 써서 문자열을 합치면 전부 볼 수 있습니다.

 

이런식으로 해커는 모든 사용자의 정보를 털었습니다.

추출한 정보

id:id4 

pass:password4로 로그인을 해 봅시다.

 

로그인이 되었고 index.php까지 정상적으로 진행되었습니다.

반응형