file_put_contens小trick

file_put_contents tricks

0x01 trick1

來自於P神的實例:php

<?php
$text = $_GET['text']; if(preg_match('[<>?]', $text)) { die('error!'); } file_put_contents('config.php', $text);

但願getshell,可是限制了<>,沒法寫入PHP標準代碼。html

來自於P神的小密圈分享:linux

          file_put_contents的第二個參數,能夠是數組,而且會將數組轉化成字符串寫入。而且得益於PHP弱類型,在正則匹配前,傳入的數組會被強制轉化成字符串,也就是Array。所以能夠繞過正則匹配,而且可以正常寫入。shell

 

實例:windows

    

 

 

 

0x02 trick2

另外一個關於file_put_contents的小trick,當file_put_contents、copy、file_get_contents等讀取寫入操做與unlink、file_exists等刪除判斷文件函數之間對於路徑處理的差別致使的刪除繞過數組

<?php
$user=$_GET['user']; var_dump($user); echo $user['name']; $filename = __DIR__.'\\'.$user['name']; echo $filename; $data = $user['info']; file_put_contents($filename, $data); if(file_exists($filename)){ unlink($filename); }

p牛在小密圈說過相似問題app

查看php源碼,其實咱們能發現,php讀取、寫入文件,都會調用php_stream_open_wrapper_ex來打開流,而判斷文件存在、重命名、刪除文件等操做則無需打開文件流。函數

咱們跟一跟php_stream_open_wrapper_ex就會發現,其實最後會使用tsrm_realpath函數來將filename給標準化成一個絕對路徑。而文件刪除等操做則不會,這就是兩者的區別。學習

因此,若是咱們傳入的是文件名中包含一個不存在的路徑,寫入的時候由於會處理掉「../」等相對路徑,因此不會出錯;判斷、刪除的時候由於不會處理,因此就會出現「No such file or directory」的錯誤。spa

因此,linux能夠經過xxxxx/../test.php、test.php/. 來繞過刪除

windows能夠經過test.php:test test.ph<來繞過文件刪除

拿windows實例:

http://127.0.0.1/l.php?user[name]=2.php:test&user[info]=2y 會生成2.php

http://127.0.0.1/l.php?user[name]=2.ph<&user[info]=2y 會寫入內容

 

 

學習資料:http://www.am0s.com/functions/386.html

相關文章
相關標籤/搜索