(Lord of SQLInjection) blue_dragon 문제입니다.
제공되는 소스코드에서 먼저 필터링 부터 보면
id와 pw 두곳 모두 prob _ . 을 필터링 하고 있습니다.
그다음으로 내려가면 어떤 쿼리인지를 보여주는데 id와 pw를 입력받고 있습니다.
이후 쿼리를 실행한 뒤
if 구문으로 ' 와 \\ 를 필터링 해서 No Hack 이라는 결과를 출력하고 있습니다.
이부분을 이해하는데 상당히 오래걸렸습니다.
이문제에서 첫 걸음으로 생각 해야하는 부분은 쿼리를 실행하고 나서 필터링을 한다는 점입니다.
이러한 필터링 구문은 쿼리 실행전에 존재해 입력자체를 막는 경우가 보통이라
코드를 제대로 해석하지 못해 작성자는 이해하는데 오랜시간이 걸렸습니다.
정리하면 보통은 1번과 같은 구조인데 현재 소스코드는 2번의 구조형태를 가지고 있습니다.
1. prob _ . 필터링 -> ' \\ 필터링 -> 파라미터 입력받기 -> 쿼리실행 -> 결과출력
2. prob _ . 필터링 -> 파라미터 입력받기 -> 쿼리실행 -> ' \\ 필터링 ->결과출력
위 1번과 2번의 차이는 쿼리의 실행유무입니다.
쿼리가 실행만 된다면 참 거짓을 이용한 SQL인젝션이 가능합니다.
이와 관련된 문제를 드림핵 문제에서 Time based SQL 인젝션을 찾을 수 있었고 이를 활용했습니다.
https://dreamhack.io/lecture/courses/286
[WHA] ExploitTech: Error & Time based SQL Injection
이번 코스에서는 Error based SQL Injection과 Time based SQL Injection에 대해 알아봅니다.
dreamhack.io
가볍게 설명하면 Time based SQL인젝션은 파라미터를 전송해 결과를 출력할때
sleep()을 이용해 전달시간 딜레이를 활용한 SQL인젝션입니다.
이번 문제에서 사용할 페이로드는 아래 코드입니다.
?id=admin&pw=%27 ||if(id="admin" and length(pw)>1,sleep(5),0)%23
먼저 id=admin&pw=' 로 false 값과 필터링에 걸리지만 if문을 입력할 수 있게 싱글쿼터(')를 사용하고
if(id="admin" and length(pw)>1,sleep(5),0)%23 으로
id가 admin이면서 pw의 길이가 1이상이라면 True로써 sleep(5) 5초후 전달을 하며
false라면 0을 전달합니다.
현재는 if의 결과가 True를 예상한 구조이며 sleep(5)가 실행되는 것을 예상해 값을 전달해보면
좌측 상단에 로딩표시가 확인가능하며 sleep(5)가 실행되어 5초후 전달되며
pw=' 부분에 싱글쿼터(')로 필터링에 걸려 No Hack가 출력되는 것을 확인 할 수 있습니다.
이를 활용해
length(pw)=? 로 패스워드의 길이를 찾고
찾은 패스워드의 길이를 기준으로 ascii(substr(pw,?,1))=? 를 찾는 파이썬 코드를 작성해보면
위와 같은 페이로드를 구현할 수 있습니다.
페이로드를 실행시켜 보면
ength(pw)=8을 전달하면서 5초간 멈춘뒤
패스워드의 길이가 8임을 찾았으며
ascii(substr(pw,1,1))은 100 에서 5초간 멈추며
pw의 값을 출력해줍니다.
이렇게 총8개의 패스워드를 찾았으며
찾은 pw값을 문제 사이트에 전달해보면
pw의 일치로 admin의 로그인 성공과 함께 문제가 해결되었습니다!
'Wargame(Web) > Lord of SQLInjection' 카테고리의 다른 글
(Lord of SQLInjection) phantom 문제 (0) | 2022.11.21 |
---|---|
(Lord of SQLInjection) frankenstein 문제 (0) | 2022.11.17 |
(Lord of SQLInjection) red_dragon 문제 (0) | 2022.11.13 |
(Lord of SQLInjection) green_dragon 문제 (0) | 2022.10.28 |
(Lord of SQLInjection) evil_wizard 문제 (0) | 2022.10.09 |