티스토리 뷰

Up!Up!Up!


파일을 선택하여 업로드할 수 있고 10분마다 업로드한 파일이 삭제되고 있다.


소스 코드


정상적인 이미지 파일을 올리면 업로드되어 저장된 경로가 표시된다. 파일명이 변경되고 업로드한 파일의 확장자가 아니라 강제로 .jpg 확장자로 저장된다.


php 확장자 사용할 경우 Invalid file이 발생한다.


Content-Type이 image가 아닐 경우 Please Give Me a Picture가 발생한다.


즉, Content-Type은 image/jpeg, image/png로 확장자는 php로 업로드 해야한다.

이 문제는 multipart/form-data를 검증하는 부분에서 발생한다.


逐浪 CMS 2.4 (zoomla)

위 CMS에서 발생했던 취약점을 토대로 만든 문제로 생각이 든다.

해당 CMS에서 파일 업로드를 방어하는 코드 중 /Plugins/swfFileUpload/UploadHandler.ashx 파일에서 취약점을 확인할 수 있다.


asp_code.dll

class ZoomlaSecurityCenter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public static void CheckUpladFiles()
    {
        HttpRequest request = HttpContext.Current.Request;
        HttpResponse response = HttpContext.Current.Response;
 
        if (HttpContext.Current.Request.ContentType.IndexOf("multipart/form-data") > -1)
        {
 
            HttpFileCollection files = request.Files;
            for (int i = 0; i < files.Count; i++)
            {
                HttpPostedFile httpPostedFile = files[i];
                string fileName = httpPostedFile.FileName;
                if (httpPostedFile.ContentLength > 0)
                {
                    if (fileName.IndexOf(".") > -1)
                    {
                        string[] array = fileName.Split(new char[]
                        {
                            '.'
                        });
                        for (int j = 1; j < array.Length; j++)
                        {
                            string ext = array[j].ToString().ToLower();
                            if (!ZoomlaSecurityCenter.ExNameCheck(ext))
                            {
                                string findStr = System.IO.Path.GetExtension(fileName).ToLower().Replace(".", "");
                                string text = SiteConfig.SiteOption.UploadFileExts.ToLower();
                                if (!StringHelper.FoundCharInArr(text, findStr, "|"))
                                {
                                    function.WriteErrMsg("上传的文件不是符合扩展名" + text + "的文件");
                                    response.End();
                                }
                            }
                            else
                            {
                                function.WriteErrMsg("请勿上传可疑文件!");
                                response.End();
                            }
                        }
                    }
                    else
                    {
                        function.WriteErrMsg("请勿上传可疑文件!");
                        response.End();
                    }
                }
            }
        }
    }
cs


일반적으로 파일을 업로드할 경우에 multipart/form-data를 사용하는 것을 생각해서 위 코드에서는 multipart/form-data가 있을 경우에만 검증하도록 되어있다.
if(HttpContext.Current.Request.ContentType.IndexOf("multipart/form-data") > -1)
이 부분을 통해서 multipart/form-data 문자가 있을 경우에만 아래 코드를 통해서 파일 업로드를 검증하도록 되어있다.

따라서 이 부분은 multipart/form-data 대신에 대문자를 섞어서 간단하게 우회할 수가 있다.


먼저, 확장자는 jpg, Content-Type은 image/jpeg로 했을 경우 정상적으로 파일이 업로드된 것을 확인할 수 있다.


이번에는 위에서 설명한 것과 같이 확장자는 php로 바꾸고 Content-Type은 image/jpeg로 해준 다음, multipart/form-data를 대문자를 이용해서 Multipart/form-data로 바꾸고 전송을 하게 되면 Flag를 얻을 수 있다.


결과 화면


Flag: SSCTF{d750aa9eb742bde8c65bc525f596623a}

댓글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
링크
공지사항
Total
Today
Yesterday