| @ -0,0 +1,77 @@ | |||||
| --- | |||||
| title: PHP - Stop Malicious Image Uploads | |||||
| author: Brett Langdon | |||||
| date: 2012-02-01 | |||||
| template: article.jade | |||||
| --- | |||||
| Quick and easy trick for detecting and stopping malicious image uploads to PHP. | |||||
| --- | |||||
| Recently I have been practicing for the upcoming NECCDC competition and have | |||||
| come across a few issues that will need to be overcome, including how to stop | |||||
| malicious image uploads. | |||||
| I was reading | |||||
| <a href="http://www.acunetix.com/websitesecurity/upload-forms-threat.htm" target="_blank">this</a> | |||||
| article on | |||||
| <a href="http://www.acunetix.com/" target="_blank">Acunetix.com</a> | |||||
| about the threats of having upload forms in PHP. | |||||
| The general idea behind this exploit for Apache and PHP is when a user can | |||||
| upload an image whose content contains PHP code and the extension includes | |||||
| ‘php’ for example an image ‘new-house.php.jpg’ that contains: | |||||
| ``` | |||||
| ... (image contents) | |||||
| <?php phpinfo(); ?> | |||||
| ... (image contents) | |||||
| ``` | |||||
| When uploaded and then viewed Apache, if improperly setup, will process the | |||||
| image as PHP, because of the ‘.php’ in the extension and then when accessed | |||||
| will execute malicious code on your server. | |||||
| ## My Solution | |||||
| I was trying to find a good way to remove this issue quickly without opening | |||||
| more security holes. I have seen some solutions that use the function | |||||
| <a href="http://us2.php.net/manual/en/function.getimagesize.php" target="_blank">getimagesize</a> | |||||
| to try and determine if the file is an image, but if the malicious code is | |||||
| injected into the middle of an actual image this function will still return | |||||
| the actual image size and the file will validate as an image. The solution I | |||||
| came up with is to explicitly convert each uploaded image to a jpeg using | |||||
| <a href="http://us2.php.net/manual/en/function.imagecreatefromjpeg.php" target="_blank">imagecreatefromjpeg</a> | |||||
| and | |||||
| <a href="http://us2.php.net/manual/en/function.imagejpeg.php" target="_blank">imagejpeg</a> | |||||
| functions. | |||||
| ```php | |||||
| <?php | |||||
| $image = imagecreatefromjpeg( './new-house.php.jpeg' ); | |||||
| imagejpeg( $image, './new-house.php.jpeg' ); | |||||
| ``` | |||||
| If the original image contains malicious code an error will be thrown and | |||||
| `$image` will not contain an image. This is a way to try and sanitize the | |||||
| image. This code can also be embellished where if the image is invalid then | |||||
| an image is still created and uploaded. | |||||
| ```php | |||||
| <?php | |||||
| //@ to quite the possible error from this. | |||||
| $image = @imagecreatefromjpeg( './new-house.php.jpg' ); | |||||
| if( !$image ): | |||||
| $image = imagecreate(100,20); | |||||
| $greenish = imagecolorallocate( $image, 180,200,180 ); | |||||
| imagefill( $image, 0, 0, $greenish ); | |||||
| $black = imagecolorallocate( $image, 0,0,0 ); | |||||
| imagestring( $image, 1, 5, 5, 'No.. No..', $black ); | |||||
| endif; | |||||
| imagejpeg( $image, './new-house.php.jpg' ); | |||||
| ``` | |||||
| Enjoy. | |||||