WEB hacking/LORD OF SQL INJECTION

[Lord of SQL Injection] cobolt 문제 풀이

Roronoa 2023. 3. 31. 17:16
반응형

문제 설명

[그림 1] cobolt 문제 접속

preg_match함수로 prob, _, ., () 의 문자들이 필터링 되어있다.

id값이 admin이면서 pw가 맞으면 문제를 해결할 수 있다.

먼저 id값에 admin을 넣어보자

 

[그림 2] id값에 admin입력

id값에 admin을 입력하였는데 문제가 해결되지 않았다. 왜냐하면 뒤에 and 구문이 성립하지 않았기 때문이다.

이문제를 해결하기 위해서는 비밀번호를 알아야한다.

하지만 우리는 비밀번호를 알기 힘들다. 어떻게 하면 문제를 해결할 수 있을까??

쿼리문을 보자.

select id from prob_cobolt where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')

첫번째 방법

쿼리문에 mysql의 주석인 #이 필터링이 되어 있지 않기 때문에

id 파라미터에 id = admin'#을 넣으면 뒤에 pw부분이 주석처리가 되어 실행이 되지 않아 admin으로 접속을 할 수 있을것이다.

하지만 url에 #을 넣으면 인식이 되지 않기때문에 #을 url 인코딩한 값인 %23을 넣어서 문제를 해결하면 된다.

 

[그림 3] 문제 해결

payload는 다음과 같다.

?id=admin'%23

두번째 방법

php의 연산자 우선순위를 살펴보았다.

[그림 4] and 와 or의 연산자 우선순위

출처 : http://www.tcpschool.com/php/php_operator_arithmetic

 

and 연산이 우선적으로 실행이 된다.

 

select id from prob_cobolt where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')

위 쿼리 부분에서 id값에 admin' or '1' = '1 부분을 삽입해보자.

 

 select id from prob_cobolt where id='admin' or '1' = '1' and pw=md5('')

위의 쿼리 문은 admin' or '1' = '1 부분을 삽입을 한 결과이다.

and연산자가 먼저 실행되기 때문에 '1'='1' and pw=md5('') 연산이 먼저 실행된다.

참 and 거짓 이므로 거짓을 반환한다.

그다음 id = 'admin' or 거짓이므로

참 or 거짓이된다.

따라서 참이되고 id='admin'이므로 문제를 해결할 수 있다.

 

payload는 다음과 같다.

?id=admin' or '1' = '1
반응형