不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。
如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话
就可能发生"跳错对象"的问题。
url跳转比较直接的危害是:
–>钓鱼,既攻击者使用漏洞方的域名(比如一个比较出名的公司域名往往会让用户放心的点击)做掩盖,而最终跳转的确实钓鱼网站
打靶
先抓个包:
发现第三个 像秋天的风一样的少年 里面的 url
中有 url=unsafere
第四个 我就是我,放荡不羁的我 里面的 url
中的 url=i
以上两个案例都是典型的可利用的 url
不安全链接,在渗透测试的过程中可以留意一下这种特殊的命名或者参数传输。会有意想不到的效果
先观察以上两个链接会跳到哪儿去:
第三个:
(跳到了概述)
第四个:
(跳到了本页面,没变化)
组合 payload
第三个:
payload:
http://192.168.200.8/vul/urlredirect/urlredirect.php?url=www.baidu.com
第四个:
payload:
http://192.168.200.8/vul/urlredirect/urlredirect.php?url=www.baidu.com
如何防御
以第三个举例
查看原码:
<?php
$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);
if ($SELF_PAGE = "urlredirect.php"){
$ACTIVE = array('','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','active open','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');
}
$PIKA_ROOT_DIR = "../../";
include_once $PIKA_ROOT_DIR.'header.php';
$html="";
if(isset($_GET['url']) && $_GET['url'] != null){
$url = $_GET['url'];
if($url == 'i'){
$html.="<p>好的,希望你能坚持做你自己!</p>";
}else {
header("location:{$url}");
}
}
?>
关键源码:
if($url == 'i'){
$html.="<p>好的,希望你能坚持做你自己!</p>";
}else {
header("location:{$url}");
}
检查重定向目标
修改源码:
如果 url
的值为 unsafere.php
,则跳转到 unsafere.php
,如果 url
的值不为 i
,也不为 unsafere.php
,则留在当前页面,并显示提示信息。
if($url == 'i'){
$html.="<p>好的,希望你能坚持做自己!</p>";
}else if($url == 'urlredirect.php'){
header("loaclhost:{$url}");
}else{
$html.="<p>警告,sb别搞</p>";
}
设置安全的重定向URL
使用 urlencode()函数
对 URL
进行编码
$redirect_url = "http://example.com/redirect.php?redirect_url=".urlencode($user_input);
header("Location:".$redirect_url); //执行重定向
使用相对路径重定向
相对路径只指定目标文件的相对位置,而不是完整的 URL
的好处是,无法使用恶意 URL
来进行攻击。
header("Location:/index.php"); //使用相对路径重定向
防止循环重定向
循环重定向的危害:循环跳转导致系统进入死循环,服务器资源耗尽
解决:使用一个计数器来限制重定向的次数。
通过 SESSION
变量储存重定向的次数,超过限制时拒绝执行重定向。
$redirect_count = $_SESSION['redirect_count']; // 获取重定向计数器
if($redirect_count > 5){
echo"重定向次数太多辣"; // 重定向次数过多,拒绝执行
}else{
$_SESSION['redirect_count'] = $redirect_count + 1; //更新计数器
header("Location:".$redirect_count); //执行重定向
}