LOS의 4번 문제인 orc이다.
이전 문제와 다른 방식으로 조금 더 귀찮게 풀어야 하는 문제이다.
pw 값을 직접 구해서 비교해야 한다.
이전처럼 id='admin'#으로 해결할 수 없다.
문제의 유형을 따지자면 Blind SQL Injection일라나
해결하기 위한 과정을 나열해보자면..
1. 어드민의 pw 길이는?
2. 어드민의 pw 값은 어떻게?
정도로 볼 수 있다. 그런데 1번 과정은 사실 생략해도 되긴 하지만 문제에서 딱히 필터링하는 것도 없고 조금 더 확실한 값을 가져와야 하니
해결해보자
1. MySQL에서는 length를 통해 길이 값을 받아올 수 있다.
2. 패스워드 값을 하나씩 추출해서 비교해보자. 이것은 하나씩 뽑아와서 ascii 문자 코드와 비교해보면 될 것 같다.
1번을 먼저 해보자면
query : select id from prob_orc where id='admin' and pw='' or id='admin' && length(pw)<30#' |
내 쿼리는 위와 같다. id=admin이고 pw길이가 30보다 작은 id는?
하고 쿼리에 물어봤다.
쿼리는 반갑다며 인사를 해줬다.
여기서 확인할 수 있는 건 admin의 pw의 길이는 30보다 작다는 것을 알 수 있다.
위의 쿼리는 id='admin'이고 pw길이가 30미만인 것을 물어봤으니.
비교를 하다보면 금방 패스워드의 길이를 찾을 수 있다.
1. 어드민의 pw 길이는? 8
이건 해결했다.
이제
2. 어드민의 pw 값은 어떻게?
이걸 해결해야 한다.
여러가지 방법이 있겠지만 나는
ascii(), substr() 두 함수를 통해 직접 패스워드의 아스키 코드값을 비교해줄 생각이다.
substr()은 특정 문자열에서 특정 위치에서 특정 개수만큼 절삭해 값을 반환한다.
ascii()는 그 값을 아스키 코드로 변환한다.
이런식으로 찾을 수 있다.
pw의 1번째의 1개의 아스키 코드 값은 50이다.
admin의 pw의 첫자리는 2인 것을 알 수 있다. 2 to ascii = 50
이 과정을 8번 반복하면 8자리의 비밀번호를 찾을 수 있다!
손으로 다 하면 개고생이니 스크립트를 만들어보기로 했다.
상당히 간단하지 않은가!
비밀번호를 알아내었다.
개인차가 있겠지만 나는 이렇게 스크립트를 사용해서 푸는 문제가 재미있다.
사실 이전 게시글이랑 같이 쓰고 있었는데 갑자기 멀티 프로세싱을 해서 조금 더 빠르게 만들어 보고 싶어서 뻘짓을 했다.
재귀를 통한 것과 반복. 사실 재귀는 의미 없다. 아니 오히려 손해다.
멀티프로세싱이 답인 것 같다.
LOS 올클하고 나면 한 번 멀티프로세싱을 이용해 조금 더 빠른 스크립트를 구현해보고 싶다.
end
'computer > web hacking' 카테고리의 다른 글
[LOS] prob_darkelf (0) | 2018.04.28 |
---|---|
[LOS] prob_wolfman (0) | 2018.04.28 |
[LOS] prob_goblin (0) | 2018.04.27 |
[LOS] prob_cobolt (0) | 2018.04.27 |
[LOS] prob_gremlin (0) | 2018.04.27 |