요즘 드림핵이 리뉴얼 되면서 거의 10등이 내려가고..ㅎ 점수 인정 안되던 문제들도 인정되면서 새로 풀 문제들이 많이 생겨났다 ㅎㅎ
이 문제 댓글들을 보니 정말 유익한 문제라 해서 풀어봤다! 이것저것 많이 섞여 있어서 예전에 배운 내용을 복습할 수 있었던 좋은 문제당!


memo를 작성하고, 해당 memo들을 보여주는 읽을 수 있는 페이지가 존재한다.
1. Flag 파일명
우선 주어진 소스코드를 확인해보았다. 도커파일을 확인해보니까

이런식으로 돼있었는데, flag가 담긴 파일 이름은 flag_해시 이런식으로 돼있었다.
따라서 flag가 담긴 파일명을 확실히 알고 있지 않은 상황에서, 셸을 활용해서 파일명을 알아내는게 맞겠다고 생각했다.
2. SQL injection
이외에 SQL query가 많아서 다 살펴보다가 SQL injection에 취약한 부분을 찾았다.

'SELECT adminCheck FROM memo WHERE id= '.$id
id에 SQL injection이 가능하다는 것을 알 수 있었다. 마침 GET 방식이다.
하지만 해당 구문을 실행시키려면 REMOTE_ADDR가 127.0.0.1 여야 하는데, 이는 SSRF를 통해 해결할 수 있어 보였다.
참고할만한 사이트:
https://dazemonkey.tistory.com/22
SQL Injection INTO OUTFILE - WebShell, Backdoor Upload
SQL 인젝션(SQL Injection) 취약점 발견 시 MySQL의 INTO OUTFILE 취약점을 이용하여 웹쉘(WebShell) 파일을 업로드하고, 웹쉘의 시스템 명령어를 입력하여 백도어(Backdoor)를 업로드하여 실행할 수 있다. 이런.
dazemonkey.tistory.com
3. CSS injection


한편, CSS injection이 가능한 부분도 찾을 수 있었다. $title의 경우 가져올때 htmlspecialchars를 적용시켜주지만, $color의 경우 str_replace 함수로 < 랑 > 를 필터링할뿐 (xss는 불가능해 보임), CSS injection에는 취약했다.
CSS injection를 통해
background: url("특정 주소");
이런식으로 해준다면 해당 주소로 body의 background를 설정하게 된다.
따라서 color 부분에 blue; background: url("http://127.0.0.1"); 을 삽입해준다면 REMOTE_ADDR가 127.0.0.1 인 점이 충족돼 SQL injection도 가능해진다.
참고할만한 사이트:
CSS Injection (tistory.com)
CSS Injection
<!DOCTYPE html> CSS Injection 위와 같은 페이지에 접속하게 되면 body tag 존재함으로 example.com에 정상적인 요청을 보낸다. 이제 input tag에 민감한 값이 존재한다면? <!DOCTYPE html> CSS Injection Styl..
ngaa.tistory.com
4. Webshell 경로 (secure-file-priv)
앞서 언급했듯이 webshell이 필요할 듯해 보였는데, 이는 SQL injection을 통해 해결가능했다.
Union select "webshell" INTO OUTFILE "파일 경로 및 이름"
위 구문으로 원하는 디렉토리에 웹셸이 담긴 파일이 생성 가능했다.
이때 경로 선정이 문제였는데, 해당 디렉토리에 파일을 쓸 수 있는 권한이 있는 곳으로 선정해야했다.

secure-file-priv는 MySQL에서 사용하는 system variable로, 유저가 database 서버에 데이터를 import 또는 export 할때 특정 path에서만 가능하도록 하는 옵션이다. 따라서 /tmp 폴더로만 sql query의 결과값이 저장되는 것이 확인 되므로 webshell 경로를 /tmp 폴더 안으로 설정해줘야했다.
참고한 사이트:
https://sebhastian.com/mysql-fix-secure-file-priv-error/
How to fix --secure-file-priv option error
Learn how to fix --secure-file-priv option error and run import/ export data statements
sebhastian.com
5. RFI (Remote File Inclusion)

write.php는 POST 방식으로 memoTitle, memoColor 등등을 보내는데, memoColor가 어택 벡터가 될 수 있다. 여기에 CSS injection을 위한 코드, 그리고 check.php에서 GET 방식으로 id에 webshell을 저장하는 query 구문을 보내주면 된다.
이때, php webshell을 보내주는데 앞서 < > 는 모두 필터링 되므로 HEX로 변환해 보내주었다.

다음으로, check.php로 가서 해당 id의 memo를 check 해주면, remote server가 127.0.0.1로 인식 되고, SQL injection을 시킬 수 있다.

한편, index.php를 확인해보면 php include_once $path로 되어있고, $path에 GET 방식으로 php 파일의 디렉토리를 명시해주면 해당 파일을 가져올 수 있다. include 함수가 있다보니 RFI / LFI를 할 수 있는 것이다.


따라서 path 파라미터에 SQL injection을 통해 저장한 webshell의 경로를 명시해주면 webshell을 실행시킬 수 있다.

flag 파일명을 알아내고 실행시켜서 플래그를 얻었따~
이상 SSRF + RFI + SQL injection + CSS injection + Mysql 권한 등등에 대한 지식을 요하는 문제를 풀어봤따!
'해킹 공부 > 웹해킹' 카테고리의 다른 글
Webhacking.kr 랭킹 탑 30 (2) | 2022.05.11 |
---|---|
ReDos Attack + Blind Regular Expression Injection Attack (0) | 2022.04.03 |
XSS (base tag url) (0) | 2021.11.10 |
SQL injection, MD5 raw (0) | 2021.02.02 |