Forum Discussion

tub91's avatar
tub91
Icon for Cirrus rankCirrus
Jan 09, 2023
Solved

WAF - Allow uploads of only files with certain extensions and block all other file uploads

Hi team,

We need to make some blocks with our WAF on ASM because this block cannot be made on the application side.

We have two web pages on the Internet that allow our customers to fill out a web form and upload some attachments.

Attachment upload is not a mandatory field.

The only file extensions we would like to allow are the following: .jpg,.jpeg,.tiff,.tif,.pdf,.doc,.docx,.xls,.xlsx,.csv

For all other possible extensions we would like the WAF to block the POST call

We initially tried following this article: https://support.f5.com/csp/article/K69153854
This article did not allow us to solve our problem because with the File Types we understood that we can only block requests to certain file types but not prevent their upload


With this article (https://support.f5.com/csp/article/K64356849) we have seen that it is possible to block files containing binary executable content but it would not allow us to block for example the .txt extension

We also tried this article (https://support.f5.com/csp/article/K78925560) but it didn't work. It appears that this feature applies up to version 13.x. Our version is 15.1.5.1

How can we proceed to block the upload of files with disallowed extensions?

Also, would ASM be able to detect the real extension of a file? For example, if I create a file "test.txt" (which needs to be locked) and change the extension to "test.pdf" what would happen? Will the file be locked or not?

Below is a portion of the POST call used to upload files

 

POST /URI/ HTTP/1.1
Host: xxx.xxx.xxx
User-Agent: 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: it-IT,it;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
Referer: https://xxx.xxx.xxx/URI
Content-Type: multipart/form-data; boundary=---------------------------324342428322538423523377594017
Content-Length: 3763
Origin: https://xxx.xxx.xxx
Connection: keep-alive
Cookie: 
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
X-Forwarded-For: 

-----------------------------324342428322538423523377594017
Content-Disposition: form-data; name="Nome"

mario
-----------------------------324342428322538423523377594017
Content-Disposition: form-data; name="Email"

mmtest@test.it
-----------------------------324342428322538423523377594017
Content-Disposition: form-data; name="Allegati_0"; filename="test.txt"
Content-Type: text/plain

-----------------------------324342428322538423523377594017
Content-Disposition: form-data; name="Allegati_0_val"


-----------------------------324342428322538423523377594017
Content-Disposition: form-data; name="Allegati_1"; filename=""
Content-Type: application/octet-stream


-----------------------------324342428322538423523377594017
Content-Disposition: form-data; name="Allegati_1_val"

-----------------------------324342428322538423523377594017
Content-Disposition: form-data; name="btnNext"

Conferma
-----------------------------324342428322538423523377594017
Content-Disposition: form-data; name="HaveDatat1"

1
-----------------------------324342428322538423523377594017--

Thanks

  • Hi tub91 , 
    Just to add somthing : 
    > let all learnt filetypes as it is , and do not delete them even if they are in a wildcard form or even specific filetypes for your application , this is for the stability of your application at all and this restriction should be applied on parameter level. 

    > Another point : 
    you should define 2 parameter in this ASM policy , Parameter with data type "file upload" and the other with "Alpha Numeric ". 
    Let me explain more : 
    you should have a parameter_1 needs to upload file on it’s like a container and this parameter should use (Data type = File upload) , and the other parameter should be triggered when you click "Button upload" let we call it Parameter_2 and you should define this parameter as ( an Alpha Numeric Data type ) With the Regular expression (ReGex) that I sent in the last reply. 

    Please check the below snap shots from my Lab : 

    - you can see " choose file Button " which defined as " filename " parameter in F5 ASM learning suggestions , and "select the image you want to uplaod" which defined as "userfile" Parameter in F5 Learning suggestion. 
    In " Filename " I should create it as ( type = user input value parameter , Data type = Alpha numeric , and add the Regex that I send before in last reply ) . 

    In "userfile" I should create it ( type = user input value , Data type = File upload ) 

    > I hope this helps you. 

     

5 Replies

No RepliesBe the first to reply