审计

首先定位到 /application/home/controller/Connectwx.php的get_url_contents()方法

1
2
3
4
5
6
7
8
9
10
11
12
public function get_url_contents($url){
if (ini_get("allow_url_fopen") == "1") {
return file_get_contents($url);
} else {
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
}

这里首先判断allow_url_fopen配置是否开启,开启之后直接使用file_get_contents()方法获取文件内容,没有任何过滤

否则就使用curl()函数获取远程内容,这时候容易产生ssrf漏洞

触发

http://localhost/public/home/Connectwx/get_url_contents/?url=http://localhost/webshell.php

image-20250109100624900

image-20250109100647458

修复

把public该为 private,使得它只能在类的内部被调用,外部代码无法直接访问它。这样可以防止外部用户通过构造特定的输入直接调用该方法,外部无法直接访问该方法,必须通过类中受控的公开方法来间接调用,例如通过以下安全接口:

1
2
3
4
5
public function fetch_image($url) {
// 先验证 URL 是否可信
$this->validate_url($url);
return $this->get_url_contents($url);
}