728x90
반응형

200점인 59번 문제를 풀어보자.

테스트를 위해 test/test계정으로 JOIN을 해보고, POST로 전달되는 데이터에는 어떤 것이 있는지 확인하자.

JOIN할 때는 id와 phone에 데이터가 담겨 request되고, LOGIN할 때는 lid와 lphone에 데이터가 담겨 request된다.

LOGIN을 시도했을 때 쿼리의 결과 중 lv가 'admin'이면 문제가 풀리게 된다.

이제 JOIN부분 소스코드를 살펴보자.

phone의 길이가 20자 이상이면 exit()이 실행된다.

id 파라미터에서는 admin 문자열을 필터링하고, phone 파라미터에서는 admin, 0x, #, hex, char ,ascii, ord, select 문자열이 대소문자 관계 없이 필터링된다.

insert 쿼리문에서 $_POST['phone']을 살펴보면 싱글쿼터(')로 감싸져 있지 않은 것을 보니, 정수만 입력 가능하게 된다.

테스트를 위해 test/1234계정으로 JOIN을 하고, LOGIN을 했을 때 반응을 살펴보자.

LOGIN을 성공하게 되면 id와 lv값이 반환된다.

lv값을 변조하기 위해 phone 변수를 이용할 것이다.

테스트로 JOIN을 했을 때는 다음과 같이 insert 됐을 것이다.

insert into chall59 values ('test', 1, 'guest')

lv값을 1로 바꾸기 위해 phone 변수에 injection을 시도해보자.

insert into chall59 values ('test1', 1,1)--, 'guest')

id : test1 phone : 1,1)--공백 <- 주석(--)이후에 공백이 들어가야 injection이 가능했다.

test1 / 1,1)-- 로 로그인을 해보면 lv가 1로 변환되는 것을 볼 수 있다.

phone 에 1,'admin')--공백 은 admin문자열 필터링으로 JOIN이 불가능하다.

admin 문자열 필터링을 우회하기 위해 우리는 MySql 내장함수를 이용할 것이다.

https://blog.naver.com/foryunha/20139047181

 

[DB]Mysql 내장함수

MySql 내장함수 문자함수 REPLACE REPLACE('string‘,’기존문자열‘,’대체문자열‘) 문...

blog.naver.com

내장함수 중 REVERSE 함수를 살펴보자.

REVERSE('string') : string을 반대로 나열하는 함수

ex) SELECT REVERSE('ABCD'); 

     >> DCBA

그럼 여기서 생각해볼 수 있는 것이 phone 변수에 reverse('nimda')를 입력해 'admin'을 만드는 것이다.

쿼리문 : insert into chall59 values ('nimda', 1,reverse('nimda'))--, 'guest')

그러나 이렇게 쿼리를 할 경우, strlen($_POST['phone'])>=20 되어 exit()되게 된다.

다른 대안으로는 id 변수에 'nimda'를 입력하고, phone 변수에 reverse(id)를 호출해서 'admin'을 만드는 것이다.

쿼리문 : insert into chall59 values ('nimda', 1,reverse(id))--, 'guest')

 주석이후에 공백 필수!

 

 

728x90
반응형

'CTF & WarGame > webhacking.kr' 카테고리의 다른 글

[webhacking.kr] 61번 문제  (0) 2020.03.17
[webhacking.kr] 60번 문제  (0) 2020.03.17
[webhacking.kr] 58번 문제  (0) 2020.03.16
[webhacking.kr] 57번 문제  (0) 2020.03.16
[webhacking.kr] 56번 문제  (0) 2020.03.16

+ Recent posts