드디어 table이 시각적으로 출력되기 시작하였다. query문도 order by 를 통하여 정렬하는 query문으로 변경되었다. 문자열 필터링에서 sleep, benchmark 가 빠진 것을 보아 time-based sql injection 에 관한 문제인 것 같다. Time-Based SQL Injection 이란, query문에 시간을 delay 시키는 함수, sleep/benchmark 등을 사용하여 요청에 대한 응답시간을 의도적으로 지연시키는 방법이다. 어떻게 사용하는 것인가? 우선 문제에 간단하게 테스트해보자. ?order=1 위와 같이 query 를 전달할 경우, 1번 column, 즉 id column 을 기준으로 table 이 정렬된 것을 볼 수 있다. admin 의 email 주소는 p..
기본적인 Blind SQL Injection 문제인 것 같아 보이지만 참값을 확인할 방법이 보이지 않는다. 이전 문제들에서는 'Hello admin 이라는 문자열을 출력시켜줌으로써 우리가 전달한 query문에 대한 참값을 알 수 있었다. 코드 line 8 을 보면 myslqi_error() 함수를 사용하고 있다. 이 함수는 query 문에 오류가 있을 시에 해당하는 오류를 출력시켜주는 함수이다. 이것을 이용하면 될 것 같다. 어떤 오류를 출력시키는지 한 번 살펴보자. ?pw=' 위와 같은 query 문을 전달하였더니 아래와 같은 오류 메세지가 출력되었다. You have an error in your SQL syntax; check the manual that corresponds to your MySQ..
간만에 간단한 문제가 나왔다. id 바로 뒤에 주석이 있어 pw 단에 어떠한 값을 입력해도 무력화된다. MySQL 에서 주석 사용은 다음과 같다. 주석 설명 # 해당 라인을 주석화 -- 해당 라인을 주석화 /* */ 여러 라인을 주석화 그렇다. #은 한 줄만 comment(주석)화 한다. 따라서 줄바꿈 제어문자를 pw 입력값에 넣으면 될 것 같다. pw=%0a or id='admin'%23 하지만 위와 같이 넘겨주면 id='guest'가 우선적으로 처리되어 guest로 로그인된다. 앞에 guest를 무력화시키자. 간단하다. and 0 으로 거짓으로 만들어주면 된다. pw=%0a and 0 or id='admin'%23
형식은 기존의 Blind SQL Injection 과 비슷하다. pw 의 길이까지는 기존의 방식과 동일하게, 쉽게 구할 수 있다. 하지만 pw의 형식이 문제다. 기존에는 알파벳과 숫자의 조합들이었다. 알파벳과 숫자는 흔히 알고 있듯이 아스키코드로 변환한 값의 크기가 1-byte 이다. 즉, 8-bit 라는 소리이다. 혹시나 해서 pw 각 글자마다의 bit 수를 측정해보았다. import requests requests.packages.urllib3.disable_warnings() org_url = "https://los.rubiya.kr/chall/xavis_04f071ecdadb4296361d2101e4a2c390.php" header = {'Cookie': 'PHPSESSID='} session =..