[LOS] SQL Injection 풀이 (orc)

어제 못 푼 문제를 다시 풀어본다.

우선 첫번째로 접근해야 할점은 코드를 보면 id가 admin인 것은 고정이고 pw 가 맞으면 admin이라는 문구를 출력하도록 되어 있다.

그리고 새로운 함수 addslashes가 있는데 이 함수는 DB에 저장될 때 '와 같은 특수문자는 구문을 나눌때 사용되므로 오류를 일으킬수 있기 때문에 앞에 / 을 처리하여 특수문자를 문자로 인식해 오류를 줄여주는 코드이다.

여기서는 DB에 저장하는 것이 아닌 참 거짓을 위주로 하는것이기 때문에 크게 신경쓰지 않아도 되는 부분이다.

 

주된 목적은 화면에 참 거짓이 도출된 다는 것이다. 이것을 이용하면 db의 데이터에 계속된 질의를 통해 비밀번호 값을 알아 낼 수 있게 된다.

처음에는 문자열을 길이를 알아내기 위해

Length를 이용하여 길이를 알아낸다.

그러면 아래 그림과 같이 8자리 패스워드인 것을 알아낼 수 있다.

패스워드의 길이를 알아냈으니 다음으로 해야할 것은 바로 비밀번호를 대조해서 넣는 것이다.

그걸 위해서는 substr 과 ascii를 알아야한다.

substr를 이용해 비밀번호를 한자리씩 추출해 참 거짓을 판별하는 것이다. ascii를 사용하는 이유는 대 소를 비교해 주는 <,> 문자를 사용하기 위해서이다. 만약 영어나 특수문자일 경우는 숫자형식으로 변환해서 대소를 구분하기 쉬워져 조금 더 수월하게 비밀번호를 찾는 것이 가능해 진다.

ascii 코드

48 ~ 57 : 숫자 (0 ~ 9)
65 ~ 90 : 영어(대문자) (A ~ Z)
97 ~ 122  : 영어(소문자) (a ~ z)
32 ~ 47 : 특수문자 (space, !, ", #, $, %, & etc.)
58 ~ 64 : 특수문자 (:, ;, <, =, >, @, ?)
123 ~ 126 : 특수문자 ({, |, }, ~)

이제 위 ascii를 이용해 데이터를 추출해 보자 python으로 코드를 짜도 되지만 나 같은 경우는 burp suit을 이용하여 값을 찾아내었다.

아래 문구처럼 url 을 만든다음 burp suit으로 http history로 패킷을 잡아서 intruder로 보낸다.

intruder는 반복하기 어려운 작업을 반복잡을 해주는 역할을 한다.

처음 하는 사람들은 사용법이 어려울 수 있으니 전체샷으로 찍어서 올린다.

맨처음 choose an attack type이 sniper로 되어 있을텐데 아래와 같이 cluster bomb로 설정해준다. 이는 설정한 payload positions을 각기 다른 값을 대입하는 공격 방식이다

payload positions의 보라색 부분이 패턴에 맞게 변경하여 반복 공격을 하는 자리이다. 아래와 같이 설정해준다.

그다음 payloads 탭에 가서 아까 설정한 payload positon의 순서에 맞게 설정해 준다. 비밀번호는 8자리 였기 때문에 substr을 이용해 첫번째 자리 부터 8번째 자리까지 1~8을 집어 넣어줘야한다.

substr(값,추출위치,해당위치의추출갯수) <ㅡ 함수 형식

두번째 payload postion에서는 숫자부터 집어넣기위해 48~57 을 넣는다. 이는 ascii코드로 0부터 9까지를 의미한다.

증가는 1씩

attack을 하면 아래와 같이 창이 뜨고 결과가 뜨게 되는데 참과 거짓의 문자 Length가 다르기 때문에 Length를 기준으로 정렬하면 아래와 같이 나오게 된다. 보게되면 4번 자리만 값이 안뜨는 것을 볼 수 있다. 즉 숫자가 아닌 다른 문자로 되어 있기 때문에 반복으로 위 과정을 영어 ascii 한번더 해주면 된다.

그러면 ascii 97 를 디코더한 소문자 a가 나오게 된다.

ascii에서 10진수로 변환시 095a9852가 나오게 되고 대입시 Clear가 된다.

+ Recent posts