형식은 기존의 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 =..
형식이 신기하게 바뀌었다. 일반적인 '#' 주석과 '--' 주석은 필터링 되어있다. 또한 pw의 입력값을 6글자 초과로 받을 수 없다. 싱글쿼터가 필터링되지 않기 때문에 pw의 ('') 를 탈출시켜야 한다. 탈출시키는 방법은 단순하다. pw=') 과 같이 탈출시키면 된다. 이제는 참값을 만들 차례다. SQL에서는 형이 다른 데이터를 비교할 때 '묵시적 형변환'이라는 것을 실시한다. 만약 문자열과 정수를 비교할 때에는 문자열이 0이라는 숫자로 형변환된다. 따라서 'abcd'=0 이라는 결과가 도출된다. 이와 같이 공백의 문자열에서도 이가 성립한다. 따라서 ''=0 이라는 결과도 도출된다. 이를 이용하면 pw의 값을 '참'이라는 값으로 넣어줄 수 있다. pw=TRUE 라는 결과가 query 문으로 전달되고,..
이전 succubus 문제와 query 문의 형식은 아주 비슷하다. 그러나 addslashes 함수가 추가되어 있다. addslashes 함수는 GET 방식으로 받아온 데이터에 싱글쿼터나 더블쿼터, 그리고 역슬래시가 있으면 해당 문자의 바로 앞에 역슬래시를 하나 더 붙여주는 역할을 한다. 예를 들어 query 문이 id=" 과 같이 전달되었다면, addslashes 함수를 거친 이후에는 id=\" 과 같이 역슬래시가 추가된다. 따라서 succubus 문제처럼 역슬래시를 이용하여 바로 뒤의 싱글쿼터를 문자열로 인식시키는 방법은 사용할 수 없다. 그런데 우리에게는 같은팀이 하나 존재한다. strrev 함수이다. 누가봐도 문자열은 reverse 시키는 함수이다. 이를 이용하면 위와 같이 쿼리문을 전달했을 때 ..
preg_match('/prob|_|\.|\(\)/i' 를 통하여 'prob', '_', '()', '.' 를 필터링하고 있다. 또한 아래에서는 싱글쿼터(')를 필터링하고 있다. id 와 pw 의 입력값이 모두 싱글쿼터로 갇혀있기 때문에 어떻게든 탈출시켜야 한다. 이전에는 싱글쿼터를 한 번 더 사용함으로써 기존의 싱글쿼터를 탈출했다. 하지만 지금은 싱글쿼터가 필터링 되어있기 때문에 다른 방법을 찾아야 한다. 우선 더블쿼터를 이용해보려고 했다. 하지만 쿼리문 자체에서 싱글쿼터로 입력값을 감싸기 때문에 소용이 없다. 그 다음으로는 주석을 이용하려고 했다. 하지만 어떻게든 문자열을 탈출하여 'or TRUE' 라는 쿼리문을 만들어야 한다. 문자열 탈출이 답이다. mySQL 에는 '\' 를 이용함으로써 특수문자를..