전공쪽

이번에는 좀 특이한 문제이다. 패스워드 검사를 하지 않는다. 첫번째 쿼리에서 보낸결과로 두번째 쿼리가 구성된다. 일단 \ 검사를 안하니 id에는 \를 넣어줘서 내가 원하는 쿼리문을 구성시켜줘봤다. 이러면 실제 쿼리문은 테이블에 있는 모든 값을 가져와야하는데 query2가 뜨지 않은 것으로 보아 테이블에는 아무 값도 없는 것 같다. 이러면 select union을 사용해서 값을 만들어줄 필요가 있겠다. 일단 시나리오는 다음과 같다. 첫번째로 pw를 구성할 때 union select로 값을 2개 반환하는데, 2번째(패스워드) 값이 다시 select union으로 구성된 문장이여야 한다. 두번째에는 id만 가져오는 것을 모르고 union select admin,1 같은것을 계속 주면서 삽질을 했다.;;
hell fire와 다른점은 sleep 함수도 막혔다는 점이다.. benchmark 함수도 막혀있기 때문에 어떻게 해야 고민을 좀 해보았다. if 문 반환값과 order by를 이용한 방법도 이용이 가능하다..! 일단 email 길이는 30이다. 이 방법에 따르면 if 조건이 참이면 admin이 rubiya보다 먼저 나와야한다. 이를 파이썬의 find함수로 구분해줄 것이다. find함수는 문자열에서 해당 문자열의 위치를 반환한다. 이것도 이진탐색을 해주었다. 비밀번호가 꽤 길어서... 그냥 돌리는 것보다 3배이상 빠른 것 같다. 클리어! 상당히 재미있는 방법이였다. #!/usr/bin/python #-*-coding:utf-8 -*- import urllib,urllib2,requests import t..
hellfire의 풀이를 시작해 보도록 하겠다. 먼저 이제 컬럼이 id, email,score로 세개가 되었다. 그리고 쿼리를 보니 order에 따라서 모든 값을 다 가져온다. 그리고 출력할때 admin의 email은 *로 숨겨서 출력을 한다. 이를 볼때 admin의 email을 알아 맞추는 게임이 되겠다. union이 막혀있고 지금까지 배운 내용으로 보아서는 time based injection 내용인 것 같아서 테스트를 해보았다. 실제로 위 쿼리를 보내면 3초이따가 결과가 수행된다. sleep(2)를 주고 파이썬에서 실행시간 측정을 해보았다. 2초가 걸리는 것을 알 수 있었고 이를 이용해 brute forcing을 하면 될 것 같았다. 그리고 너무 느릴 거 같아서 이진탐색을 적용했다. 그리고 emai..
if가 막혔다. select union으로 이를 우회하겠다 . 이제 에러메세지가 뜨질 않기 때문에 이를 생각하고 자동화를 해야한다. union select를 통해 이전 쿼리의 결과와 값을 합쳐서 나타낼 수 있다. 다만 컬럼의 수가 동일해야한다! 먼저 비밀번호의 길이를 구하였다. 이 원리는 서브쿼리는 레코드가 무조건 한개여야한다는 원리로, length(pw)=8일시에는 1이 반환되고 아닐 시에는 0,1 이 반환되어 에러가 뜨는 것이다. 일단 비밀번호의 길이는 8자라는 것을 알았다! 또한 비밀번호가 ascii로 인코딩 되있다는 것도 알아냈다. 이제 자동화를 돌려줄 수 있을 것 같다. (select 1 union select substr(pw,1,1)=?) 으로 구해줄 수 있을 것이다. 만약 참이라면 결과값에..
이제부터 푸는 방법이 바뀌었다. 오류기반 sql injection 기법들을 적극 활용하겠다. 가장 중요하게 쓴 것은 if(조건, ture, false) 였다. 먼저 if(length(pw)=32, pow(2,9999),1) 을 통해 pw의 길이가 32바이트라는 것을 알았다. 그리고 ascii 인코딩임을 확인하였다. 이제 substr로 단순한 brute forcing을 진행하였다. 코드는 다음과 같다 #!/usr/bin/python #-*-coding:utf-8 -*- import urllib,urllib2,requests header={"Cookie":"PHPSESSID=****"} password='' a='' for i in range(1,33) : admin=0 guest=0 b=[0,0,0,0] ..
atoi 함수는 문자열을 만나면 지금까지 읽은 숫자를 반환하고 종료한다. 그러나 몇가지 제어 문자는 그냥 무시를 하는데 그 문자들은 다음과 같다. 아스키 코드(16진수) 아스키 코드 (10진수) 문자 0x9 9 가로 탭 0xa 10 개행 0xb 11 수직 탭 0xc 12 뉴 페이지 0xd 13 케리지 리턴 0x20 32 공백 0x2b 43 + 0x2d 45 - 단 -는 뒷 숫자가 -로 인식되기 때문에 주의해야 한다. 포너블 할 때 쓸일이 있을지도 모른다.
%0a(개행)을 통한 우회를 하였다.
상당히 어려웠던 문제이다... 솔직하게 인터넷 찾아보고 싶었다. 그런데 쉬운문제들은 봐도 상관없는데 어려운 문제는 안보고 푸는 재미가 있기때문에 좀 삽질을 많이 해보았고 혼자 풀어서 뿌듯했다 일단 bruteforce관련 문제이다. 그리고 regex와 like가 안되는데, regex는 정규표현식. 일단 pw 길이는 8일것이다. 귀신같이 아니였다 ㅋㅋㅋㅋ 물론 password 길이를 자동화 돌려도 되지만, 약간의 주의가 필요할 듯 보여서 (그리고 사실 부등호를 이용하면 이진탐색이 가능하고 이건 손으로 하는게 더 빠를 것 같아서. ) order by로 admin이 최상단에 위치하게 해주겠다. 비번은 12바이트이다. 사실 order by 쓸 필요가 없었던듯.. 이제 자동화를 돌려주면 된다. addslashes우..
OSOR2
'전공쪽' 카테고리의 글 목록 (4 Page)