본문 바로가기

해킹 공부/웹해킹

CSS injection+RFI+SQL injection&webshell+Mysql config

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


드림핵 Colorful Memo 문제 , 2022 Spring GoN Open Qual CTF에 출제된 문제다.

memo를 작성하고, 해당 memo들을 보여주는 읽을 수 있는 페이지가 존재한다.

1. Flag 파일명

우선 주어진 소스코드를 확인해보았다. 도커파일을 확인해보니까

Docker file

이런식으로 돼있었는데, flag가 담긴 파일 이름은 flag_해시 이런식으로 돼있었다.
따라서 flag가 담긴 파일명을 확실히 알고 있지 않은 상황에서, 셸을 활용해서 파일명을 알아내는게 맞겠다고 생각했다.


2. SQL injection

이외에 SQL query가 많아서 다 살펴보다가 SQL injection에 취약한 부분을 찾았다.

check.php

'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

read.php

한편, 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 "파일 경로 및 이름"

위 구문으로 원하는 디렉토리에 웹셸이 담긴 파일이 생성 가능했다.
이때 경로 선정이 문제였는데, 해당 디렉토리에 파일을 쓸 수 있는 권한이 있는 곳으로 선정해야했다.

mysql/config/my.cnf

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 request

write.php는 POST 방식으로 memoTitle, memoColor 등등을 보내는데, memoColor가 어택 벡터가 될 수 있다. 여기에 CSS injection을 위한 코드, 그리고 check.php에서 GET 방식으로 id에 webshell을 저장하는 query 구문을 보내주면 된다.


이때, php webshell을 보내주는데 앞서 < > 는 모두 필터링 되므로 HEX로 변환해 보내주었다.

response



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

check.php request



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

index.php
path 파라미터에 webshell 경로


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

webshell

flag 파일명을 알아내고 실행시켜서 플래그를 얻었따~




이상 SSRF + RFI + SQL injection + CSS injection + Mysql 권한 등등에 대한 지식을 요하는 문제를 풀어봤따!

'해킹 공부 > 웹해킹' 카테고리의 다른 글