https://dreamhack.io/wargame/challenges/1689
LiteBoard
※ 해당 문제는 소스코드를 제공하지 않습니다.
dreamhack.io
소스코드가 주어지지 않은 웹 해킹 문제이다. 바로 웹 사이트로 들어가 보자.
자유롭게 글을 올릴 수 있는 간단한 대시보드 사이트이다.
한번 글을 올려보자.
'안녕'이라는 글을 올려보고, 내가 작성한 글을 찾아봤다.
그럼 기존의 글인 '안녕하세요!~' 와 내가 작성한 방명록이 뜨는 것을 볼 수 있다.
마찬가지로 'hi', 'LiteBoard'를 저장해 보았다.
소스코드가 없으니 이것저것 직접 입력해보며 찾아봐야 될 듯 싶다.
Exploit
xss 페이로드를 넣어서 서버 반응을 살펴보자.
<script>alert('1')</script>
만약 서버가 xss 취약점이 존재한다면, alert 창이 뜰 것이다.
500 에러가 뜨는 걸로 보아 서버 측에서 어느정도 xss에 대한 방지책이 존재하는듯
sql injection
'를 입력하고 저장한 뒤, 해당 입력값을 찾기 위해 keyword에 "'"를 넣고 찾아보면
이런 에러가 튀어나온다.
"를 넣었을 때 에러가 출력이 안되고 정상적으로 내가 작성한 방명록이 출력이 된다는 것을 생각한다면
아마 sql injection 취약점이 존재할 것이고, 쿼리문은 ''(single quote)로 이루어져 있을 확률이 높다.
제목이 Lite Board 였으므로, sqlite db로 작성된 웹 사이트 일지도...?
일단 소스코드가 존재하지 않으므로, blind sql injection임을 감안하고 아래 페이로드를 입력해 보았다.
' UNION SELECT 1,2 --
' AND 1=1 --
' OR 1=1 --
위의 페이로드들은 만약 sql injection에 취약한 웹 사이트라고 가정할 때, 무조건 참인 결과물을 출력하는 쿼리문으로, 해당 페이로드들을 입력할 때 지금까지 입력한 방명록들이 모두 출력되는 것을 확인할 수 있다.
아래 페이로드를 입력해보면
' AND 1=2 --
일부러 틀린 결과를 출력하는 쿼리문을 입력했더니 아무것도 뜨지 않는다.
위의 에러문에서 보듯이, 에러문을 통해 어떠한 단서도 얻을 수 없을듯 하므로 error based sql injection은 아닌 듯 하다.
sqlite 기반 blind sql injection 식으로 접근을 해봐야 할듯
union - based sql injection
우선 union을 통한 접근을 시도해 보았다.
null의 개수를 통해 union과 조인(join)할 수 있은 열(칼럼)의 개수를 확인해 보자.
' UNION SELECT NULL --
이때 에러가 뜨고
' UNION SELECT NULL, NULL --
이때 정상적으로 잘 출력되는 것을 보아 union과 조인할 수 있는 열의 개수는 총 2개, 즉 ~ union 변수1, 변수2 이런 형식으로 적어야 에러가 안뜬다는 의미(union 문은 열의 개수가 서로 맞지 않으면 에러를 출력한다.) -> 서버는 기본적으로 2개의 열을 반환하도록 설계됨
이제 데이터베이스에 저장된 테이블 명들을 모두 출력해보자.
' UNION SELECT NULL, name FROM sqlite_master WHERE type='table' --
해당 페이로드는 sqlite의 sqlite_master 테이블에서 테이블 이름을 추출하는 역할을 한다.
sqlite_master?
sqlite의 모든 데이터베이스에는 sqlite_master라는 메타데이터 테이블이 존재한다.
이 테이블은 데이터베이스에 있는 테이블, 뷰, 인덱스, 트리거와 같은 객체에 대한 정보를 저장하는 테이블이라고 생각하면 된다.
즉 type='table' 조건은 sqlite_master 테이블을 통해 데이터베이스에 존재하는 모든 테이블의 이름을 반환하겠다는 의미이다.
쿼리문을 입력해보면 처음보는 2개의 테이블이 뜨는 것을 볼 수 있다. posts 테이블의 경우 방명록이 저장되어 있는 테이블인 듯 하므로, 플래그는 README 테이블에 존재할 것이라고 추측해 볼 수 있겠다.
해당 README 테이블의 칼럼명을 알아보자.
' UNION SELECT NULL, sql FROM sqlite_master WHERE name='README' --
README 테이블에는 hello, light, world라는 칼럼이 존재한다.
이제 해당 칼럼들에 어떤 내용들이 있는지 조합해보자.
' UNION SELECT NULL, light || hello || world FROM README --
플래그 발견
'보안 > Web hacking' 카테고리의 다른 글
[Dreamhack] access-log (0) | 2025.01.11 |
---|---|
[h4ckingga.me] Simple Calculator (0) | 2025.01.09 |
[Dreamhack] Safe Input (0) | 2025.01.02 |
[Dreamhack] insane python (0) | 2024.12.26 |
[Dreamhack] Replace Trick! (0) | 2024.12.23 |