黑名单概念
在PHP代码中黑名单是指通过把可疑的、不安全的数据(如SQL注入攻击等)排除在外的一种防御措施。它的主要作用就是阻止一些特定的内容或者行为进入你的程序中,从而防止恶意的用户利用它们破坏系统的安全性。
例如,在PHP中,你可以使用正则表达式来检查用户的输入,如果发现它们包含了一些特定的字符或者字符串,那么就可以将它们加入到黑名单中,从而避免这些恶意的内容进入你的程序中。
白名单概念
PHP代码中的白名单是一种机制,它允许用户输入符合特定条件的内容,而不是禁止所有内容。它的作用在于,只有符合特定条件的内容才能被添加到数据库中,而其他不符合条件的内容则会被忽略。这样就可以有效地防止黑客利用漏洞攻击你的网站。
黑名单编写
以pikachu 靶场ssrf为例
SSRF(Server-Side Request Forgery:服务器端请求伪造)
其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制,从而导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。
利用url访问百度,可以成功
编写黑名单后
$URL = $_GET['url'];
$substitutions = array( 'file', 'ftp', 'zlib', 'data', 'glob', 'phar','ssh2','rar','ogg',
);
$parsedUrl = parse_url($URL);
if (isset($parsedUrl['scheme']) && in_array($parsedUrl['scheme'], $substitutions)) {
return false; // 伪协议在黑名单中,拒绝访问
}
// URL 安全,允许访问
return true;
scheme是用来标识一种协议,如http、ftp等
代码函数解析:
- parse_url :解析 URL,返回其组成部分
parse_url(string
$url
, int$component
= -1): int|string|array|null|false本函数解析 URL 并返回关联数组,包含在 URL 中出现的各种组成部分。数组的元素值不会 URL 解码。
本函数不是用来验证给定 URL 的有效性的,只是将其分解为下面列出的部分。也会接受不完整或无效的 URL,parse_url() 会尝试尽量正确解析。
- in_array :检查数组中是否存在某个值
in_array(mixed
$needle
, array$haystack
, bool$strict
=false
): boolin_array(待搜索的值,待搜索的数组)
如果第三个参数
strict
的值为true
则 in_array() 函数还会检查needle
的类型是否和haystack
中的相同
- isset :检测变量是否已声明并且其值不为
null
利用http协议访问info1.php无法访问了
白名单编写
以pikachu靶场SSRF(file_get_content)为例
添加白名单前,可以访问info2.php
也可以访问本地文件hosts文件
?file=../../../../../../../../windows/system32/drivers/etc/hosts
添加白名单
echo $filename."<br >";
$octet = explode(".",$filename);
echo $octet[1]."<br \>";
if($octet[1]!="php"){
die("黑客!!!");
}
代码函数解析:
- die :相当于 exit() 表示退出,结束程序执行
- explode :使用一个字符串分割另一个字符串
explode(string
$separator
, string$string
, int$limit
=PHP_INT_MAX
): array此函数返回由字符串组成的数组,每个元素都是
string
的一个子串,它们被字符串separator
作为边界点分割出来。
写入白名单后