[Lord of Sqlinjection] 4번 문제 orc 풀이
먼저 위의 코드를 해석 해보면
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
위의 코드를 좀 뜯어 보면
1. preg_match(a,b) : 첫번째 매개변수인 a와 두분째 매개변수인 b가 일치하는지 확인한다.
2. /prob|_|\.|\(\)/i : /는 정규표현식의 시작과 끝을 나타낸다.
| 는 or을 의미한다.
\ 는 뒤에오는 문자를 일반문자열로 취급하게 해준다.
i 는 대소문자 구분없이 없다는 것을 의미합니다.
위의 내용을 조합해보면 입력한 pw값에 prob 또는 0 또는 ()가 포함될 경우 No Hack ~_~ 을 출력하며 종료합니다.
그다음으로 또 봐야할것이 addslashes($_GET[pw]); 인데
addslashes() : 말 그대로 슬래시를 더해주는 것이다.
예를 들어 I'm iron man 이라고 쓴다면 ' 앞에 슬래시가 추가되어
I\'m iron man 으로 표현된다고 보면된다.
하지만 이 문제 풀이에 그다지 크게 영향이 없는데 이유는
첫번째 쿼리문에서는 적용이 안되기 때문에
첫번째 쿼리문의 결과인 Hello admin을 가지고 참 거짓을 구분하여 값을 얻어내면 된다.
STEP 1. pw 값에 참 값을 입력하여 Hello admin을 출력해본다.
입력값 : 1' or '1'='1
STEP 2. pw 길이를 먼저 뽑아 낸다.
입력값 : 1' or id='admin' and length(pw)='숫자
위에서 다시 한번 id=admin을 언급한 이유는
and 와 or 를 같이 사용하는 경우 뒤에 or가 오면 or 값이 참이면 무조건 다 참이 되어버린다.
만약 같은 테이블 내 admin 계정 외에 다른 정보가 있고, 그 계정의 비밀번호 길이가 7이라면
1' or length(pw)='7 과 1' or lenght(pw)='8 모두 참이 나오기 때문에
정확히 admin 계정의 길이를 알려면 한번 더 언급해줘야 한다.
STEP 3. pw 값을 한개씩 뽑아낸다.
입력값 : 1' or id='admin' and substring(pw,1,1)='문자1개
코드는 자신 없어서 일단 버프로 했다.
자리수가 길면 어쩔수 없이... 코드를 짜야겠지만 8자리까지는 버프가 쓸만한것 같다.
STEP 4. 버프스위트를 통해 뽑아낸 값을 입력하면 문제 풀이 완료!!