16번째로 푼 문제이다.! 
바로 blind sql injection! 음 정확히 말하면 블라인드?라고는 아무튼 인젝션 문제이다!

ip log table!


(ip log table)



문제 진입 전에 설명에 Ascii를 Date로 사용할 수 있다는 문구가 있다.
나는 오래 헤맨 뒤에야 이 문구의 의미를 깨달을 수있었다.



(힌트)



문제 페이지


(문제 페이지)



문제 페이지는 위와 같다.
아이피 가보이고 클릭해보면 해당 아이피의 접속 시간? 시간정보가 나온다.

소스코드를 열어서 확인해보니 hidden 값으로 몰래 값이 전달되고있었다.



(form)



idx에 값을 넣어 쿼리가 전달될 것이라고 생각해볼 수 있다.

즉 이 form문을 이용해 쿼리를 보낼 것이다.



(사용할 form문)



(사용할 form문 개조)



이 form을 이용하여 내 예상이지만 where idx=$_POST['idx']
요론 식으로 되어있지 않을까 예상이 된다.
idx니까 numeric이 겠지? 라는 기대를 가지고 1 or 1을 날려본다.



(1 or 1 injection)





(실행결과)



실행결과가 나온다.
사실 이 정보만으로 numeric이야 라고 섣불리 판단할 수 있지는 않다.
이유는 1 or 1 이렇게 전달했지만 웹 페이지 내에서 int만 parse 해서 사용하고 있을 수도 있고
그 외에 문자가 들어와서 디폴트로 줄수도 있고 다양한 변수들이 존재하지만

나의 수많은 쿼리들을 이 곳에 다 담을 수 없기에 정리한다 여기는 numeric으로 쿼터 없이 입력이 가능하다!

그 후 1 or 1 union select 77 limit 15,1 을 인젝션하다가 발견한 것이 있다.
여기서 limit 15,1 을 한 이유는 앞의 쿼리에서 14개의 행이 나오고 그 다음 내가 union 한 결과가 15행 부터 나오기에 15행 하나만 꺼내서 보기위해 그랬다.



(특이점 발견)





(특이점)



무심코 지나칠 뻔 했는데,
원래 없는 값은 1970-01-01 09:00:00 으로 나오다가
왠걸 조금 다른 값이 나온다.

불현듯 든 생각이 앞의 그 힌트였다. 혹시 데이터에 저장되고 있는것이 유닉스 타임 스탬프이고
그 값에 따라서 이 페이지에서 날짜 형태로 출력되는 걸까?
나는 유니온을 해서 77을 select 했다. 그 결과 01:17...
초로 따지면 77 !
다른 값으로 더 해보아 확인해보았다.

이제 정보를 알아낼 차례이다.!
나는 1 or 1 union select (숫자형태로 나오게 select 한글자) limit 15,1
요것을 이용하여 알아낼 것이다.

먼저 table 이름을 알아야한다.




(테이블 이름)





(테이블 이름 알아가는 중)



내가 알아낸 테이블 이름은 (기본적인거 빼고)
admin_table (누가봐도 수상하다.)
ip_    (여기까지 알아봤다. ip_table일거 같고 본 페이지에서 사용하는 테이블일 것이다.)
그 외의 테이블은 없었다.

문제 페이지에서 관리자로 로그인하는 페이지가 있었는데, 바로 관리자의 계정과 패스워드를 알아내라는 뜻인거 같다.

그렇다면 컬럼 이름을 알아내자!
컬럼이름을 쓰려면 ' ' 쿼터를 사용해야하는데, 확인은 안됬지만 왠지 쿼터정도는 막혀있을 예상이 들어 아싸라하게 char을 이용하여 컬럼이름을 검색해주었다.



(admin_table 다른 표현)



컬럼이름 알아내기 시작!



(컬럼이름 injection)





(찾아가는 중)



그 결과
id, ps
라는 2개의 컬럼만 있다는 사실을 알았다.

사실 이 정보는 관리자 로그인 페이지에서 form문에서 눈치 챌수 있었지만 확실히 하기 위해 찾아보았다.

그 다음은 id의 값을 알아낼 것이다!



(id injection)





(찾는 중)


찾아낸 아이디는 공개하지 않겠다! :)

그 다음은 비밀번호 찾기!



(비밀번호 injection)




(찾는 중)



비밀번호까지 찾았으니 관리자로 로그인 해본다!



(관리자로 로그인)





(문제 해결)



로그인 하니 바로 플래그가 나오고 문제를 해결할 수 있었다! :)




'WarGame > 500 Project' 카테고리의 다른 글

(18/500) Lord of the BOF - cobolt  (0) 2017.05.05
(17/500) Lord of the BOF - gremlin  (0) 2017.05.05
(15/500) Wargame.kr - lonely guys  (0) 2017.04.18
(14/500) Wargame.kr - strcmp  (0) 2017.04.16
(13/500) Wargame.kr - SimpleBoard  (0) 2017.04.16


15번째로 푼 문제이다.

SQL Injection 문제인데... 내가 가장 자신있기도하지만
풀기는 귀찮아서 풀기 시작하기가 조금 꺼려지는 문제이기도 하다..!

문제이름은 외로운 사나이
lonely guys이다.



(lonely guys)



아래는 문제 페이지다.
문제 이름과 어울리게 외로운 남자들의 이름이 적혀있다.



(문제 페이지)



당연히 소스코드가 주어졌으니 소스코드를 보고 우리가 공략할 수 있는 부분을 확인해보자.



(소스 코드)



소스코드를 보니 select 문을 이용할 수 있는데
ordey by 뒤에 붙일 수 있다.. (몰랐지만 이게 조금 검색을 하게 만들었던 부분이다.)

order by reg_date 뒤에는 일반적으로 asc desc 가 오거나 혹은
order by reg_date, [컬럼명], 컬럼명 ... 등등 이렇게 올수 있다.

나는 콤마로 붙여 여러게를 있는 방법을 사용했다.
if 분기문을 사용해 Blind injection을 할 것이다.

우리가 공략해야할 테이블 이름은 authkey이며 컬럼이름은 authkey이다. (코드에 나와있다.)

먼저 POST방식으로 sort를 전달해야하므로 post form 문을 만들어주자.



(form 문 제작)



기본적으로 내가 사용하려는 if 문으로 blind injection의 공격 가능성을 체크해본다.

if(1=1, sleep(2),2)
만약 공격이 된다면 슬립이 걸려 2초가 멈췄다 동작할 것이다.




(인젝션)





(실행결과)



실행결과 2초가 멈추는 것을 알 수 있었다.

즉 if문을 사용해 공격할 여지를 확인했다.

if(조건,참,거짓) -> 조건문에 내가 확인하고 싶은 쿼리를 사용할 것이고 참에는 sleep을 걸어줄 것이다.
헌데.! sleep은 시간이 좀 걸리니까 에러기반으로 전향했다.
참 부분에 에러를 유발 시킬 수 있는 문구를 넣는것이다. 
내가 자주 사용하는 에러 유발 문구 cot(0)을 사용할 것이다.
cot(0)은 무한대이므로 에러가 난다.

먼저 길이를 알아보자.!
길이를 알기위한 조건문
length((select authkey from authkey limit 0,1))=길이
사용한 쿼리문
,if(length((select authkey from authkey limit 0,1))=i,cot(0),0)
i를 30부터 45까지 돌려주었다. (30이상으로 참이 나왔고 45 이상으로 거짓이 나왔기 때문)



(길이 확인)




(실행결과)



실행 결과 flag길이는 40글자라는 것을 확인 할 수 있었다.

이제 본격적으로 blind injection에 들어간다. 40글자를 찾을 것이다.
사용한 쿼리
,if(ord(substr((select authkey from authkey limit i,1),1,1))=j,cot(0),0)



(authkey 찾기)



(실행결과)



실행결과 authkey를 찾았고 문제를 해결할 수 있었다.


'WarGame > 500 Project' 카테고리의 다른 글

(17/500) Lord of the BOF - gremlin  (0) 2017.05.05
(16/500) Wargame.kr - ip log table  (0) 2017.04.20
(14/500) Wargame.kr - strcmp  (0) 2017.04.16
(13/500) Wargame.kr - SimpleBoard  (0) 2017.04.16
(12/500) Wargame.kr - tmitter  (0) 2017.04.15

+ Recent posts