기본적인 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 =..
형식이 신기하게 바뀌었다. 일반적인 '#' 주석과 '--' 주석은 필터링 되어있다. 또한 pw의 입력값을 6글자 초과로 받을 수 없다. 싱글쿼터가 필터링되지 않기 때문에 pw의 ('') 를 탈출시켜야 한다. 탈출시키는 방법은 단순하다. pw=') 과 같이 탈출시키면 된다. 이제는 참값을 만들 차례다. SQL에서는 형이 다른 데이터를 비교할 때 '묵시적 형변환'이라는 것을 실시한다. 만약 문자열과 정수를 비교할 때에는 문자열이 0이라는 숫자로 형변환된다. 따라서 'abcd'=0 이라는 결과가 도출된다. 이와 같이 공백의 문자열에서도 이가 성립한다. 따라서 ''=0 이라는 결과도 도출된다. 이를 이용하면 pw의 값을 '참'이라는 값으로 넣어줄 수 있다. pw=TRUE 라는 결과가 query 문으로 전달되고,..