매일 해킹공부/웹 해킹

[Lord of Sqlinjection] 4번 문제 orc 풀이

dreamaccomplirar 2025. 2. 13. 11:22

 

먼저 위의 코드를 해석 해보면

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. 버프스위트를 통해 뽑아낸 값을 입력하면 문제 풀이 완료!!