CTF入坑

CTF学习

前言

本内容主要以解题模式为学习重点,由Stalker-16成员(Danie1,7iny)整理。

day01–7iny

解题模式CTF赛题目类别与能力对应

· Web-Web应用的漏洞挖掘和利用
· PWN-逆向分析、漏洞挖掘、漏洞利用、安全编程
· Reverse Engineering-逆向分析、安全编程
· Crypto-密码、逆向分析、安全编程
· PPC(Professional Programming and Coding)-安全编程
· Forensic-网络流量分析、隐写分析、系统取证等
· Recon-社工、情报搜集分析

相应的赛题要求

PWN、Reverse偏重对汇编、逆向的理解
Crypto偏重对数学、算法的深入学习
Web偏重对技巧沉淀、快速搜索能力的挑战
Misc则更为复杂,所有与计算机安全挑战有关的都算在其中

如何入门–如何学?

1、恶补基础知识(有基础的跳过此步)

都需要学的内容:
Linux基础、计算机组成原理、操作系统原理、网络协议分析
PWN+Reverse+Crypto随机搭配:
IDA工具使用(f5插件)、逆向工程、密码学、缓冲区溢出等
Web+Misc组合:
网络安全、内网渗透、数据库安全等

2、尝试从脑洞开始(hackgame)

1.xss练习平台

2.sql注入挑战

3、从基础题目出发

刷题站点:

1.i春秋

2.xctf攻防世界

3.国外CTF题库

4.国外PWN+Reverse方向

5.ssh连接玩wargame

6.老牌wargame

7.pwn题库

4、学习信息安全专业知识

书籍

PWN+Reverse+Crypto随机搭配:
RE for Beginners(逆向工程入门)
IDA Pro权威指南
揭秘家庭路由器0day漏洞挖掘技术
自己动手写操作系统
黑客攻防技术宝典:系统实战篇

Web+Misc组合:
Web应用安全权威指南
Web前端黑客技术揭秘
黑客秘籍-渗透测试实用指南
黑客攻防技术宝典Web实战篇
代码审计:企业级Web代码安全架构

5、锻炼体力而耐力

工具下载

以下是由各大大佬整理的工具库,全部放在了github上

1.工具库1

2.工具库2

3.工具库3

MISC学习

学习MISC的好处:MISC可能是切入CTF竞赛领域、培养兴趣的最佳入口
1.基础知识/技能面、逆向思维
2.“解谜”能力、“脑洞”大开

1.国外:Google Map、Earth、Street View
2.国内:Baidu地图、卫星视图、全景视图:map.baidu.com腾讯地图、卫星、街景:map.qq.com
· 从网络世界到物理世界
1.IP2Location IP地址(因特网上的虚拟地址)>现实世界中的具体地理位置
2.IP2Location数据库:WHOIS数据库,GeolP,IP2Location,纯真数据库(QQIP查询使用)
· Google image search
1.搜索图片含义和外观类似图片

2.Encoding Analysis 编码分析
· 二进制编码
· 十六进制编码
1.单字节:00-FF·ASClI字符编码
2.字母:A-Z:41-5A;a-Z:61-7A
· Base64编码
1.基于64个可打印字符来表示二进制数据的表示方法
2.字符集:大小写字母各26个,10个数字,加号“+”,斜杠“/”,一共64个字符,等号“=”用来作为后缀用途
· Huffman Code-无损压缩编码,01串显示
· 条形码:宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符
·国际标准

  • EAN-13:商品条码标准,13位数字
  • Code-39:39字符
  • Code-128:128字符
    ·条形码
  • 在线条码生成器/识别器
  • ZXing-多平台条形码生成、扫码库
    条形码在线解码:网站
    题目1:Barcode.jpeg
    · 二维码:用某种特定几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息
    1.堆叠式/行排式二维条码:Code 16K、Code49、PDF417
    2.矩阵式二维码:QR CODE

    常见题目二维码、条形码的恢复
    参考文章:freebuf
    练习平台:蓝鲸安全打卡练习场
    参考writeup:简书

练习蓝鲸安全打卡练习场题目:
1.破碎的心–画图按住ctrl,按上下键不断还原
2.黑白打字机–画图ctrl+shift+i反色,图片隐写解密,86版五笔对照表

图片隐写解密软件下载地址

3.Forensic Analysis 取证分析

· 取证分析-取证对象
1.文件file
2.磁盘disk
3.网络数据包pcap
4.内存dump
5.系统镜像image
· 取证分析挑战目标
1.一般为发现在取证对象中隐藏的Flag(代表要取证的敏感信息)
2.取证分析通常和隐写分析联系在一起
· 文件格式分析常用命令和工具
1.基本命令file、identify、strings:用于文件类型探测
2.winhex、UE:用于直接察看文件16进制数据
3.binwalk:分析二进制文件,提取其中隐藏文件等
· 需要了解常见文件特征串
1.http://en.wikipedia.org/wiki/List of file signatures
2.特别是JPEG、PNG、GIF、BMP等图片文件,ZIP、RAR、TAR、7z等压缩文件,mp3、wma、avi等音视频文件

音频取证
· Audacity音频处理软件,查看声音波形

国光音频取证总结

磁盘取证
· 磁盘分区格式
1.Windows:FAT12->FAT16->FAT32->NTFS
2.Linux:EXT2->EXT3->EXT4
3.FAT主磁盘结构

| 主引导区 | 文件分配表#1 | 文件分配表#2 | 根目录 | 其他所有数据剩下磁盘空间 |

删除文件
·目录表中文件名第一字节E5
·文件恢复和取证工具
EasyRecovery、MedAnalyze、FTK
网络数据包Pcap取证分析
· Wireshark工具
书籍《Wireshark抓包分析实战》
· 流量统计和会话列表
· 善用过滤规则,找出关注的网络流纪录
· 流重组:Follow TCP Stream
· 常见网络通信协议的理解
IP/TCP、UDP/HTTP、DNS、.….
·提取流中的文件数据

内存与image镜像取证分析
· 内存取证
1.Volatility内存镜像分析工具
2.解析Windows/Linux/MacOSX内存结构
3.分析当前运行进程列表、进程内存数据等
4.根据题目提示寻找线索和思路,提取分析指定进程的特定内存数据
· Image镜像取证
1.Binwalk
2.根据题目提示提取镜像中需关注的文件
3.分析提取文件中的应用层数据

4.Steganalysis 隐写分析

隐写术
· 隐写载体
1.文本
2.图片
3.音频
4.视频
· 隐写方法和工具
1.RSD、LSB、DCT
2.https://en.wikipedia.org/wiki/Steganography_tools

国光图片隐写总结

· 识别隐写
1.统计分析
2.Noise floor consistency analysis 噪声一致性分析
· 隐写识别工具
1.Stegdetect
2.StegSecret
3.GFE Stealth
· 隐写分析
1.http://www.garykessler.net/library/fsc_stego.html

day01–Danie1


MISC(Miscellaneous)类型,即安全杂项,题目或涉及流量分析、电子取证、人肉搜索、数据分析等等。

例题day01.zip下载网盘链接 提取码: fjru

常见编码


摩斯密码

凯撒密码

base编码

  • base16:

    Base16编码就是将ASCII字符集中可打印的字符(数字0~9和字母A~F)对应的二进制字节数据进行编码

  • 编码的方式: 根据ASCII编码得到对应的二进制,将所有二进制串起来,然后按4个二进制位分割,转化成十进制数值,根据Base16编码表得到编码

  • 例将”ILU”字符串加密

  • base32:

    与Base16编码区别的是,Base32使用了ASCII编码中可打印的32个字符(大写字母A~Z和数字2~7)对任意字节数据进行编码.Base32将串起来的二进制数据按照5个二进制位分为一组,由于传输数据的单位是字节(即8个二进制位).所以分割之前的二进制位数是40的倍数(40是5和8的最小公倍数).如果不足40位,则在编码后数据补充”=”

  • 编码方式:先根据ASCII编码得到对应字符编码值以及对应二进制,将所有二进制串起来,然后按照5个二进制位为一组分割 ,得到十进制值=>找到Base32编码表找到对应的字符.案例总共分割成了5组(25位),还差三组(15位).在末尾补充3个”=”.

  • 例将”ILU”字符串加密
  • base64:

    Base64编码使用了ASCII编码中64个可打印的字符(大写字母A~Z,小写字母a~z,数字0~9以及”+”,”/“)将任意字节数据进行编码.Base64编码将串起来的二进制以6位进行分割.所以分切之前的二进制位数应该是24的倍数(即6,8的最小公倍数).如果不足24位,则在编码后数据后面添加”=”

  • 编码方式:先根据ASCII编码得到对应字符编码值以及对应二进制,将串起来的二进制按6位分为一组.得到4组(24位).所以末尾不用补充”=”

  • 例将”ILU”字符串加密
  • 题目

    1
    2
    3
    MzQ0MTM1MzYzNDQ1MzQzNjM0NDYzNTMyMzMzMjM0MzQzNDQzMzQzOTM1NDEzNTM0MzQzNzM1MzQzNDQyMzQzNzM0NDMzNDQxMzQ0MzM1MzUzNTMzMzUzNzM1MzMzNTM1MzQ0MTM0MzIzNDM4MzQzNTM0MzUzNDQ1MzUzMzM1MzIzNDM4MzUzNTMzMzYzNTM0MzMzMjM1MzAzNDM5MzM0NA==

    flag格式:flag{xxxx}
  • 代码

    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
    #!/usr/bin/python
    # -*-coding:utf-8-*-

    import base64


    def bs(s):
    while(1):
    ok = 0
    try:
    s1 = base64.b64decode(s).decode('ascii')
    ok = 1
    s=s1
    except:
    pass

    try:
    s2 = base64.b32decode(s).decode('ascii')
    ok = 1
    s=s2
    except:
    pass

    try:
    s3 = base64.b16decode(s).decode('ascii')
    ok = 1
    s=s3
    except:
    pass

    if ok == 0:
    break
    return s

    if __name__ == "__main__":
    s = raw_input("请输入字符串:")
    res = bs(s)
    print '---------------------------'
    print 'result:'+ res

ascii编码

unicode编码

例:flag

MD5

  • MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一

  • 加密

  • 解密:https://www.cmd5.com/

  • 题目1

    1
    md5(?)[:6] == '233333'
  • 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #-*-coding:utf-8-*-

    import hashlib

    for i in range(100000000):
    m = hashlib.md5()
    m.update(str(i).encode('utf-8'))
    res = m.hexdigest()
    if res[:6] == '233333':
    print i
    break
  • 题目2

    1
    已知一段由5个大写字母组成的明文字符串,经过md5加密后的密文前6位为73acd9,求加密前的明文
  • 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #!/usr/bin/python
    # -*-coding:utf-8-*-

    import hashlib

    letter = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

    for i in letter:
    for j in letter:
    for k in letter:
    for l in letter:
    for n in letter:
    cipher = i+j+k+l+n
    m = hashlib.md5()
    m.update(cipher)
    res = m.hexdigest()
    if res[:6] == '73acd9':
    print res
    print cipher
    break

异或

  • 相同为0,不同为1

  • 题目

    1
    密文 : FR8SFAgwJzUWASwLHAEsAA4=
  • 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!usr/bin/python  
    #-*- coding:utf-8 -*-
    import base64

    ming = 'FR8SFAgwJzUWASwLHAEsAA4='
    mi=base64.b64decode(ming)

    for j in range(0,127):

    flag=''
    for i in range(len(mi)):
    t=ord(mi[i])^j
    flag+=chr(t)
    if 'flag' in flag :
    print flag
    break

图片隐写


图片隐写主要考察信息在图片中隐写的几种方法,文件头信息修改,stegsolve工具使用,LSB算法,binwalk工具使用等知识。

常用工具介绍(常用工具下载地址:https://www.ctftools.com/down/)

  • binwalk:是一个固件分析工具,多用于逆向工程、取证、隐写分析

  • winhex:是在Windows下执行的十六进制编辑软件,此软件功能强大,有完好的分区管理功能和文件管理功能,在CTF中一般用来查看文件头格式、修改16进制数据等。

  • Stegsolve:是一款图片分析工具,功能十分强大

  • Stegdetect:是一种数字图像隐写分析工具,主要实现JPEG图像的隐秘信息的嵌入的检测

  • foremost:和binwalk结合使用,提取隐藏信息。

  • MP3stego:音频隐写工具 (链接:https://pan.baidu.com/s/1fSSX-e-Q95GY0bftght3Pg
    提取码:0r3r )
    复制这段内容后打开百度网盘手机App,操作更方便哦

    • 用法:隐藏信息 encode -E hidden_text.txt -P pass svega.wav stego.mp3

      提取信息 decode -X -P pass svega_stego.mp3

  • 常见文件文件头格式

  • 题目

    1. 查看属性 meinv.jpg (易)

    2. 查看图片内容 hacker.jpg (易)

    3. binwalk + mp3stego 3.jpg (中)

    4. binwalk + 伪加密 carefully.jpg (中) (ps:伪加密是在未加密的zip文件基础上修改了它的压缩源文件目录区里的全局方式位标记的比特值,使得压缩软件打开它的时候识别为加密文件,提示输入密码, 而在这个时候,不管你用什么软件对其进行密码破解,都无法打开它)

      伪加密(https://blog.csdn.net/qq_26187985/article/details/83654197)

      将如图位置的09改为00即可,或者使用工具ZipCenOp.jar (用法 java -jar ZipCenOp.jar r xxx.zip)

    5. gif帧 flag.png.gif (易)

    6. 压缩包爆破 love.zip (中)

    7. LSB隐写 tanwanlanyue (中)

    8. 其他 f1ag.png (中)

    9. png改高度 dabai.png (中)

      ps:png文件格式简介:

      89 50 4E 47 是文件的格式

      00 00 00 0D说明IHDR头块长为13

      49 48 44 52 IHDR标识

      00 00 01 F4 图像的宽

      00 00 01 A4 图像的高

lsb隐写


首先来讲png图片,png图片是一种无损压缩的位图片形格式,也只有在无损压缩或者无压缩的图片(BMP)上实现lsb隐写。如果图像是jpg图片的话,就没法使用lsb隐写了,原因是jpg图片对像数进行了有损压缩,我们修改的信息就可能会在压缩的过程中被破坏。而png图片虽然也有压缩,但却是无损压缩,这样我们修改的信息也就能得到正确的表达,不至于丢失。BMP的图片也是一样的,是没有经过压缩的。BMP图片一般是特别的大的,因为BMP把所有的像数都按原样储存,没有进行压缩。
png图片中的图像像数一般是由RGB三原色(红绿蓝)组成,每一种颜色占用8位,取值范围为0x00~0xFF,即有256种颜色,一共包含了256的3次方的颜色,即16777216种颜色。而人类的眼睛可以区分约1000万种不同的颜色,这就意味着人类的眼睛无法区分余下的颜色大约有6777216种。
LSB隐写就是修改RGB颜色分量的最低二进制位也就是最低有效位(LSB),而人类的眼睛不会注意到这前后的变化,每个像数可以携带3比特的信息。

day02–7iny

内容简介:

day02以流量分析,加密解密为主。例题day02.zip下载网盘链接 提取码: fjru

Wireshark:

Wireshark是目前全球使用最广泛的开源抓包软件(前身为Etherea1),是一个通用化的网络数据嗅探器和协议分析器,由Gerald Combs编写并于1998年以GPL开源许可证发布。

推荐资料:

《Wireshark数据包分析实战》第二版Chris Sanders
《Wireshark网络分析》第二版Laura Chappe11
《TCP/IP协议栈详解卷一》W.Richard Stevens

相关站点:

官网下载地址

官方wiki页面

流量分析:

流量分析有以下三个方向:
1、流量包修复
2、协议分析
3、数据提取
转载来自Yokeen总结

1、流量包修复

通常都借助现成的工具例如PCAPFIX直接修复

2、协议分析

须掌握wireshark过滤器(捕捉过滤器与显示过滤器)的基础语法,从而更快更精准的获取指定的信息。
捕捉过滤器:用于决定将什么样的信息记录在捕捉结果中,需要在开始捕捉前设置。
显示过滤器:用于在捕获结果中进行详细查找,可以在得到捕捉结果后进行更改
捕捉过滤器基础语法
Protocol Direction Host(s) Value LogicalOperations other expression
tcp dst 10.1.1.1 80 and tcp dst 10.2.2.2 3128

Protocol
可能的值: ether, fddi, ip, arp, rarp, decnet,lat, sca, moprc, mopdl, tcp and udp,如果没有特别指明是什么协议,则默认使用所有支持的协议。
Direction
可能的值: src, dst, src and dst, src or dst,如果没有特别指明来源或目的地,则默认使用 “src or dst” 作为关键字。
Host(s)
可能的值: net, port,host, portrange,如果没有指定此值,则默认使用”host”关键字。
例如,”src 10.1.1.1”与”src host 10.1.1.1”相同。
Logical Operations
可能的值:not, and, or
否(“not”)具有最高的优先级,或(“or”)和与(“and”)具有相同的优先级
“not tcp port 3128 and tcp port23”与”(not tcp port 3128) and tcp port23”相同。

举例分析:
tcp dst port 3128 //目的TCP端口为3128的封包。
ip src host 10.1.1.1 //来源IP地址为10.1.1.1的封包。
host 10.1.2.3 //目的或来源IP地址为10.1.2.3的封包。
src portrange 2000-2500
//来源为UDP或TCP,并且端口号在2000至2500范围内的封包
not icmp //除了icmp以外的所有封包。

显示过滤器基础语法
Protocol String1 String2 ComparisonOperator Value Logical Operations other expression
Protocol
可以使用大量位于OSI模型第2至7层的协议。在Expression中可以看到,例如,IP,TCP,DNS,SSH
String1,String2
可选择显示过滤器右侧表达式,点击父类的+号,然后查看其子类
Comparison Oerators
可以使用六种比较运算符
英文写法:|c语言写法:|含义:
-|-|-
eq|==|等于|
ne|!=|不等于|
gt|>|大于|
It|<|小于|
ge|>=|大于等于|
le|<=|小于等于|

Logical Expressions
英文写法:|c语言写法:|含义:
-|-|-
and|&&|逻辑与
or| |||逻辑或
xor| ^^|逻辑异或
not| !|逻辑非

举例分析:
snmp || dns || icmp //显示SNMP或DNS或ICMP封包
ip.addr == 10.1.1.1 //显示源或目的IP为10.1.1.1的封包
ip.src != 10.1.2.3 and ip.dst!=10.4.5.6 //显示源不为10.1.2.3并且目的不为10.4.5.6的封包
tcp.port == 25 //显示来源或目的TCP端口号为25的封包
tcp.dport == 25 //显示目的TCP端口号为25的封包

如果过滤器语法是正确的,表达式背景为绿色,否则为红色
前文中的wireshark文件还原就可以说是一个很基础的数据包流量分析。

数据提取

这一块是流量包中另一个重点,通过对协议分析,找到题目的关键点,从而对所需要的数据进行提取。

可以学习一下tshark的使用
tshark作为wireshark的命令行版,高效快捷是它的优点,配合其余命令行工具(awk,grep)等灵活使用,可以快速定位,提取数据从而省去了繁杂的脚本编写

1
常用方法:tshark -r *.pcap -Y ** -T fields -e **|***>data

题目1、MISC.rar

key为文本格式,你找得到吗?

用wireshark打开数据包,在文件 -> 导出对象中,选择HTTP->保存txt文件

题目2、A记录(蓝鲸)

他在看什么视频,好像很好看,不知道是什么网站的。 还好我截取了他的数据包,找呀找。 key就是网站名称。格式ctf{key} tip:A记录的第一条。所以答案是

ps:在数据包分析工具中,看到的都是加密后的802.11协议的数据包,而无法看到数据包的原始内容。为了方便分析,aircrack-ng工具包提供了一个专用解密工具airdecap-ng。kali自带

1.aircrack-ng shipin.cap -w password.txt
2.airdecap-ng shipin.cap -e 0719 -p 88888888
3.top1000弱口令下载

题目3、好多苍蝇【蓝鲸】

好多苍蝇啊,吧我的重要文件都爬满了,看不到怎么办?提交格式是flag{xxxx},所以答案是?

  • 738数据包,导出application/octet-stream的数据流,删除(00000160,B)之前的都是不需要的数据,拼接数据。伪加密,foremost分离。
    Tools:
    hxD:下载
    类似软件,了解不推荐
    winhex:下载
    Notepad++ 16进制编辑功能:下载UNI
    解压缩后把HexEditor.dll文件复制到安装目录(如Notepad++\plugins),退出需要以十六进制显示时,点击菜单的:【插件】-【Hex-Editor】-【View in Hex】即可。

参考文章:

1.某大佬给新疆电网培训MISC总结)

2.流量分析–ctf实战

3.流量分析–HTTP认识

4.蓝鲸安全CTF打卡第一期杂项篇WriteUp

5.蓝鲸安全30day打卡Writeup

密码学

RSA学习

从0到1,基础知识

RSA出题

参考博客

题目1:密钥生成

在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17求解出d,格式:key{xxxx}

  • 已知p q e 解d 详细讲解

    1
    2
    3
    ed ≡ 1 (mod r)
    r = (p-1)(q-1) = 2135733082216268400
    ed mod r = 1 mod r
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    p=473398607161
    q=4511491
    e=17
    r=(p-1)*(q-1)
    i=0
    while True:
    if (1-r*i)%e == 0:
    break
    i-=1
    print ('d:' + '%d' % ((1-r*i)/e))

    使用rsatool.py进行计算,环境kali,python2.X

    sudo apt-get install libgmp-dev

    pip install gmpy

    python2 rsatool.py -p 473398607161 -q 4511491 -e 17

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    #!/usr/bin/python2
    import base64, fractions, optparse, random
    import gmpy

    from pyasn1.codec.der import encoder
    from pyasn1.type.univ import *

    PEM_TEMPLATE = '-----BEGIN RSA PRIVATE KEY-----\n%s-----END RSA PRIVATE KEY-----\n'
    DEFAULT_EXP = 65537

    def factor_modulus(n, d, e):
    """
    Efficiently recover non-trivial factors of n
    See: Handbook of Applied Cryptography
    8.2.2 Security of RSA -> (i) Relation to factoring (p.287)
    http://www.cacr.math.uwaterloo.ca/hac/
    """
    t = (e * d - 1)
    s = 0

    while True:
    quotient, remainder = divmod(t, 2)

    if remainder != 0:
    break

    s += 1
    t = quotient

    found = False

    while not found:
    i = 1
    a = random.randint(1,n-1)

    while i <= s and not found:
    c1 = pow(a, pow(2, i-1, n) * t, n)
    c2 = pow(a, pow(2, i, n) * t, n)

    found = c1 != 1 and c1 != (-1 % n) and c2 == 1

    i += 1

    p = fractions.gcd(c1-1, n)
    q = (n / p)

    return p, q

    class RSA:
    def __init__(self, p=None, q=None, n=None, d=None, e=DEFAULT_EXP):
    """
    Initialize RSA instance using primes (p, q)
    or modulus and private exponent (n, d)
    """

    self.e = e

    if p and q:
    assert gmpy.is_prime(p), 'p is not prime'
    assert gmpy.is_prime(q), 'q is not prime'

    self.p = p
    self.q = q
    elif n and d:
    self.p, self.q = factor_modulus(n, d, e)
    else:
    raise ArgumentError('Either (p, q) or (n, d) must be provided')

    self._calc_values()

    def _calc_values(self):
    self.n = self.p * self.q

    phi = (self.p - 1) * (self.q - 1)
    self.d = gmpy.invert(self.e, phi)

    # CRT-RSA precomputation
    self.dP = self.d % (self.p - 1)
    self.dQ = self.d % (self.q - 1)
    self.qInv = gmpy.invert(self.q, self.p)

    def to_pem(self):
    """
    Return OpenSSL-compatible PEM encoded key
    """
    return PEM_TEMPLATE % base64.encodestring(self.to_der())

    def to_der(self):
    """
    Return parameters as OpenSSL compatible DER encoded key
    """
    seq = Sequence()

    for x in [0, self.n, self.e, self.d, self.p, self.q, self.dP, self.dQ, self.qInv]:
    seq.setComponentByPosition(len(seq), Integer(x))

    return encoder.encode(seq)

    def dump(self, verbose):
    vars = ['n', 'e', 'd', 'p', 'q']

    if verbose:
    vars += ['dP', 'dQ', 'qInv']

    for v in vars:
    self._dumpvar(v)

    def _dumpvar(self, var):
    val = getattr(self, var)

    parts = lambda s, l: '\n'.join([s[i:i+l] for i in xrange(0, len(s), l)])

    if len(str(val)) <= 40:
    print '%s = %d (%#x)\n' % (var, val, val)
    else:
    print '%s =' % var
    print parts('%x' % val, 80) + '\n'


    if __name__ == '__main__':
    parser = optparse.OptionParser()

    parser.add_option('-p', dest='p', help='prime', type='int')
    parser.add_option('-q', dest='q', help='prime', type='int')
    parser.add_option('-n', dest='n', help='modulus', type='int')
    parser.add_option('-d', dest='d', help='private exponent', type='int')
    parser.add_option('-e', dest='e', help='public exponent (default: %d)' % DEFAULT_EXP, type='int', default=DEFAULT_EXP)
    parser.add_option('-o', dest='filename', help='output filname')
    parser.add_option('-f', dest='format', help='output format (DER, PEM) (default: PEM)', type='choice', choices=['DER', 'PEM'], default='PEM')
    parser.add_option('-v', dest='verbose', help='also display CRT-RSA representation', action='store_true', default=False)

    try:
    (options, args) = parser.parse_args()

    if options.p and options.q:
    print 'Using (p, q) to initialise RSA instance\n'
    rsa = RSA(p=options.p, q=options.q, e=options.e)
    elif options.n and options.d:
    print 'Using (n, d) to initialise RSA instance\n'
    rsa = RSA(n=options.n, d=options.d, e=options.e)
    else:
    parser.print_help()
    parser.error('Either (p, q) or (n, d) needs to be specified')

    rsa.dump(options.verbose)

    if options.filename:
    print 'Saving %s as %s' % (options.format, options.filename)


    if options.format == 'PEM':
    data = rsa.to_pem()
    elif options.format == 'DER':
    data = rsa.to_der()

    fp = open(options.filename, 'wb')
    fp.write(data)
    fp.close()

    except optparse.OptionValueError, e:
    parser.print_help()
    parser.error(e.msg)

参考文章

1.CTFwiki–密码学部分

2.RSA介绍–总结

day02–Danie1

流量分析


在CTF比赛中,对于流量包的分析取证是一种十分重要的题型。通常这类题目都是会提供一个包含流量数据的pcap文件,参赛选手通过该文件筛选和过滤其中无关的流量信息,根据关键流量信息找出flag或者相关线索。

pcap流量包的分析通常都是通过图形化的网络嗅探器——wireshark进行的,这款嗅探器经过众多开发者的不断完善,现在已经成为使用最为广泛的安全工具之一。

Wireshark的基本使用分为数据包筛选、数据包搜索、数据包还原、数据提取四个部分。

经典题型

  • CTF题型主要分为流量包修复、WEB流量包分析、USB流量包分析和其他流量包分析。

实例

  • 看到where is the flag?继续查看下一个数据包

  • 发现两个包id对应的字段刚好是flag

  • 按照同样的方式连接后面相连数据包的id字段,找到最终的flag

    flag{aha!_you_found_it!}

解题思路:wireshark打开流量包

可以看到User和pass,且都是base64编码

解码可以得到

user:test@51elab.com

passwd:FLAG:ISCCTESTpas

​ 解题思路:wireshark打开流量包,追踪tcp流,在第二个流中发现flag

解题思路:wireshark打开流量包,过滤显示http协议包

发现不停的向一个目录post数据,猜测有人在上传一句话

追踪tcp流,发现

1
cmd=%40eval%01%28base64_decode%28%24_POST%5Bz0%5D%29%29%3B&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0%2BfCIpOzskRD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7aWYoJEQ9PSIiKSREPWRpcm5hbWUoJF9TRVJWRVJbIlBBVEhfVFJBTlNMQVRFRCJdKTskUj0ieyREfVx0IjtpZihzdWJzdHIoJEQsMCwxKSE9Ii8iKXtmb3JlYWNoKHJhbmdlKCJBIiwiWiIpIGFzICRMKWlmKGlzX2RpcigieyRMfToiKSkkUi49InskTH06Ijt9JFIuPSJcdCI7JHU9KGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZWdpZCcpKT9AcG9zaXhfZ2V0cHd1aWQoQHBvc2l4X2dldGV1aWQoKSk6Jyc7JHVzcj0oJHUpPyR1WyduYW1lJ106QGdldF9jdXJyZW50X3VzZXIoKTskUi49cGhwX3VuYW1lKCk7JFIuPSIoeyR1c3J9KSI7cHJpbnQgJFI7O2VjaG8oInw8LSIpO2RpZSgpOw%3D%3D

先进行url解码,再进行base64解码,得到

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
php

@ini_set(“display_errors”,”0″);

@set_time_limit(0);

@set_magic_quotes_runtime(0);

echo(“->|”);;

$D=dirname($_SERVER["SCRIPT_FILENAME"]);

if($D==”")

$D=dirname($_SERVER["PATH_TRANSLATED"]);

$R=”{$D}\t”;

if(substr($D,0,1)!=”/”)

{

foreach(range(“A”,”Z”) as $L)

if(is_dir(“{$L}:”))

$R.=”{$L}:”;

}

$R.=”\t”;

$u=(function_exists(‘posix_getegid’))?@posix_getpwuid(@posix_geteuid()):”;

$usr=($u)?$u['name']:@get_current_user();

$R.=php_uname();

$R.=”({$usr})”;

print $R;;

echo(“|<-”);

die();

在tcp stream 5发现一个压缩包,下载

在tcp stream 6发现png文件头89504E47

保存为一张png图片

  • question

    破解wifi密码(文件wifi.cap)

    1
    2
    3
    4
    5
    flag格式:flag{你破解的WiFi密码}

    tips:密码为手机号,为了不为难你,大佬特地让我悄悄地把前七位告诉你
    1391040**
    Goodluck!!

加解密


https://blog.csdn.net/qq_41187256/article/details/79693012

  • 栅栏密码

    所谓栅栏密码,就是把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无规律的话

    明文:THERE IS A CIPHER
    去掉空格后变为:THEREISACIPHER
    两个一组,得到:TH ER EI SA CI PH ER
    先取出第一个字母:TEESCPE
    再取出第二个字母:HRIAIHR
    连在一起就是:TEESCPEHRIAIHR
    还原为所需密码。
    而解密的时候,我们先把密文从中间分开,变为两行:
    T E E S C P E
    H R I A I H R
    再按上下上下的顺序组合起来:
    THEREISACIPHER
    分出空格,就可以得到原文了:
    THERE IS A CIPHER

  • Brainfuck/Ook!编码

  • https://tool.bugku.com/brainfuck/

1
2
3
4
5
6
7
8
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook!
Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook.
  • 培根密码中的ab,代表的是数学二进制中的0和1.通过下列的密码表进行加密和解密:
    第一种方式:
    A aaaaa B aaaab C aaaba D aaabb E aabaa F aabab G aabba H aabbb I abaaa J abaab
    K ababa L ababb M abbaa N abbab O abbba P abbbb Q baaaa R baaab S baaba T baabb
    U babaa V babab W babba X babbb Y bbaaa Z bbaab
    第二种方式
    a AAAAA g AABBA n ABBAA t BAABA
    b AAAAB h AABBB o ABBAB u-v BAABB
    c AAABA i-j ABAAA p ABBBA w BABAA
    d AAABB k ABAAB q ABBBB x BABAB
    e AABAA l ABABA r BAAAA y BABBA

    f AABAB m ABABB s BAAAB z BABBB

例:

1
baabbaabaabaaaababbaaabbaabbababbabaaabb

脚本工具

  • caesar(凯撒)

    使用python pycipher库

  • RSA算法(非对称密码)

    加密过程 选择两个大素数p和q,计算出模数N = p * q

    计算φ = (p−1) * (q−1) 即N的欧拉函数,然后选择一个e (1<e<φ),且e和φ互质

    取e的模反数为d,计算方法: e * d ≡ 1 (mod φ)

    对明文m进行加密:c≡m^e (mod n) 或 c = pow(m,e,n),得到的B即为密文

    对密文c进行解密,m≡c^d( mod n) 或 m = pow(c,d,n),得到的A即为明文

    p 和 q :大整数N的两个因子(factor)

    N:大整数N,我们称之为模数(modulus)

    e 和 d:互为模反数的两个指数(exponent)

    c 和 m:分别是密文和明文,这里一般指的是一个十进制的数

    一般有如下称呼:

    (N,e):公钥

    (N,d):私钥

    分解N可以在线factordb.com

  • 代码

    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
    #-*-coding:utf-8-*-

    def split_n(n): #分解n
    for i in range(2,n):
    if n%i == 0:
    p = i
    q = int(n/i)
    break
    return p,q

    def egcd(a, b): #求d
    if a == 0:
    return (b, 0, 1)
    else:
    g, y, x = egcd(b % a, a)
    return (g, x - (b // a) * y, y)
    def modinv(a, m):
    g, x, y = egcd(a, m)
    if g != 1:
    exit('wrong')
    else:
    return x % m

    e=17
    n=2135733555619387051
    c=781391873123526159
    p,q=split_n(n)
    print('n:%d'%n)
    print('e:%d'%e)
    print('c:%d'%c)
    print("p = " + str(p))
    print("q = " + str(q))
    d=modinv(e,(p-1)*(q-1))
    print('d = '+str(d))
    m=pow(c,d,n) #快速幂取模
    print('m = '+str(m))

常见题型的分类

(1)已知p、q、e求解d

解题思路:根据 φ = (p−1) (q−1)这一欧拉函数式, 可以使用所给的p、q求解出n的欧拉函数值φ,之后再根据 e d ≡ 1 (mod φ) 即可求解出d的值。

题目

http://www.shiyanbar.com/ctf/1828

代码

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
#!/usr/bin/python


def egcd(a, b): #求d
if a == 0:
return (b, 0, 1)
else:
g, y, x = egcd(b % a, a)
return (g, x - (b // a) * y, y)
def modinv(a, m):
g, x, y = egcd(a, m)
if g != 1:
exit('wrong')
else:
return x % m

def main():
p=473398607161
q=4511491
e=17
f_n=(p-1)*(q-1)
d=modinv(e,f_n)
print(d)

if __name__ == "__main__":
main()

已知p、q、e、c求解明文

思路:根据n=p*q求解出n的值,之后再根据φ = (p−1) * (q−1),求解出n的欧拉函数的值,之后再根据e * d ≡ 1 (mod φ)求解出d的值,之后再根据m≡c^d( mod n) 或 m = pow(c,d,n)求解出明文信息即可!

题目

http://www.shiyanbar.com/ctf/1979

代码

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
#-*-coding:utf-8-*-


def egcd(a, b): #求d
if a == 0:
return (b, 0, 1)
else:
g, y, x = egcd(b % a, a)
return (g, x - (b // a) * y, y)
def modinv(a, m):
g, x, y = egcd(a, m)
if g != 1:
exit('wrong')
else:
return x % m

e=65537
p=9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q=11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
c=83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034

n=p*q
f_n=(p-1)*(q-1)
print('n:%d'%n)
print('e:%d'%e)
print('c:%d'%c)

d=modinv(e,f_n)
print('d = '+str(d))

m=pow(c,d,n)
print("------------")
print('message:%d'%m)

题目

http://ctf5.shiyanbar.com/crypto/RSAROLL.txt

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
#-*-coding:utf-8-*-

def split_n(n): #分解n
for i in range(2,n):
if n%i == 0:
p = i
q = int(n/i)
break
return p,q

def egcd(a, b): #求d
if a == 0:
return (b, 0, 1)
else:
g, y, x = egcd(b % a, a)
return (g, x - (b // a) * y, y)
def modinv(a, m):
g, x, y = egcd(a, m)
if g != 1:
exit('wrong')
else:
return x % m

e=19
n=920139713

res=''
p,q=split_n(n)
print('n:%d'%n)
print('e:%d'%e)
print("p = " + str(p))
print("q = " + str(q))
d=modinv(e,(p-1)*(q-1))
print('d = '+str(d))
with open('rsa.txt') as f:
for c in f:
res+=chr(pow(int(c.replace('\n','')),d,n))
print(res)
  • DES(对称算法)

    https://blog.csdn.net/qq_42606051/article/details/81279504

    题目

    1
    2
    3
    密文:74cWby3JysahM3cZudF3gT11lamL/4Cd
    key=12345678
    求明文

    代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # -*-coding:utf-8-*-

    from Crypto.Cipher import DES
    import base64


    key = '12345678'

    des = DES.new(key,DES.MODE_ECB)

    encrypted_text=base64.b64decode('74cWby3JysahM3cZudF3gT11lamL/4Cd')

    decrypted_text = des.decrypt(encrypted_text)
    print "明文:"+decrypted_text

  • 拓展

    与佛论禅

    • http://www.keyfc.net/bbs/tools/tudoucode.aspx

    • 1
      怯勝苦集參哆究梵礙呐度究梵呼梵顛以怯勝豆哆陀哆真罰夜大知涅曳他呐依道多波缽喝侄波缽羅奢喝俱咒冥上奢阿怯喝侄羅以侄朋僧哆婆謹冥地諳顛哆度哆都冥寫有呐阿勝娑哆涅皤怛。怯苦怯南是哆得謹侄訶至故殿故僧道多地罰倒皤利奢喝呐南奢都哆。切是奢究奢藝侄參哆佛曰明諳道彌奢娑阿哆寫娑利梵姪若諦竟奢藐悉奢集諳彌諳遮怯。皤喝阿孕怯曰罰般梵多伊梵耨死哆彌阿輸呐遮冥上哆藐夷冥輸俱故沙恐冥薩侄栗世得。耨夢諳智都冥薩耨俱薩皤密吉怖罰想上罰喝訶罰蒙盧舍神藝哆知呐姪怯那楞皤度遮奢顛度梵咒呐訶悉梵利究即冥夢諳一俱娑怯沙俱三奢婆缽知侄無呐若槃醯想哆故冥怖沙諳一豆曳呐咒心羯有
    • 解密前要带上佛曰:如是我闻:的文字。

  • aaencode

    1
    ゚ω゚ノ= /`m´)ノ ~┻━┻   //*´∇`*/ ['_']; o=(゚ー゚)  =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');
  • jsfuck

    1
    (![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+([][[]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[!+[]+!+[]+[!+[]+!+[]]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]()[+!+[]+[!+[]+!+[]]]+(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(![]+[+[]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[!+[]+!+[]+[+[]]]+(+(+!+[]+[+[]]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][[]]+[])[+!+[]]+(![]+[])[+!+[]]+((+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]]](!+[]+!+[]+[+!+[]])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[(![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]]((+((+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]+[+[]+[+[]]+[+[]]+[+[]]+[+[]]+[+[]]+[+[]]+[+[]]+[+[]]+[+!+[]]])+[])[!+[]+!+[]]+[+!+[]])+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]()[+!+[]+[!+[]+!+[]]]+([+[]]+![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]])[!+[]+!+[]+[+[]]]

    chrome控制台解密

day03–7iny

前言

以下内容以web安全为主,Danie1整理的内网地址为实验室靶场环境,三康庙职业技术学院的同学可在校园网环境下访问。不可访问的同学理解原理学习即可

OWASP TOP 10漏洞

思维导图

2017版TOP10思维导图

TOP10漏洞介绍

A1 注入 Injection

Web安全头号大敌。注入攻击漏洞往往是应用程序缺少对输入进行安全性检查所引起的。攻击者把一些包含攻击代码当做命令或者查询语句发送给解释器,这些恶意数据可以欺骗解释器,从而执行计划外的命令或者未授权访问数据。注入漏洞通常能SQL查询、LDAP查询、OS命令、程序参数等中出现

A2 失效的身份认证和会话管理 Broken Authentication and Session Management

与认证和会话管理相关的应用程序功能往往得不到正确管理,这就导致攻击者破坏密码、密匙、会话令牌或利用实施漏洞冒充其他用户身份。

A3 跨站脚本-XSS

XSS的出现时间跟SQL差不多,是最普遍的web应用安全漏洞。当应用程序在发送给浏览器的页面中包含用户提供的数据,但没有经过适当验证或转译,就会导致跨站脚本漏洞。XSS允许攻击者在受害者的浏览器中执行脚本,这些脚本可以劫持用户会话,破坏网站,或将用户重定向到恶意站点。

A4 不安全的直接对象引用 Insecurity Direct Object Reference

当开发人员公开对内部实现对象(如文件、目录或数据库键)的引用时,就会出现直接对象引用。如果没有访问控制检查或其他保护,攻击者可以操纵这些引用来访问未经授权的数据。

A5 安全配置错误 Security Misconfiguration

良好的安全性需要为应用程序、框架、应用服务器、web服务器、数据库服务器和平台定义和部署安全配置。默认值通常是不安全的。另外,软件应该保持更新。攻击者通过访问默认账户、未使用的网页、未安装补丁的漏洞、未被保护的文件和目录等,以获得对系统未授权的访问。

A6 敏感信息泄露 Sensitive Data Exposure

保护与加密敏感数据已经成为网络应用的最重要的组成部分。最常见的漏洞是应该进行加密的数据没有进行加密。使用加密的情况下常见问题是不安全的密钥和使用弱算法加密。

A7 缺少功能级访问控制

大多数web应用程序在实现UI中可见的功能之前,都要验证功能级别的访问权限。但是,当访问每个函数时,应用程序需要在服务器上执行相同的访问控制检查。如果请求没有得到验证,攻击者将能够伪造请求,以便在没有适当授权的情况下访问功能。

A8 跨站请求伪造 CSRF

利用了网站允许攻击者预测特定操作的所有细节这一特点。由于浏览器自动发送会话cookie等认证凭证,导致攻击者能够创建恶意的web页面来伪造请求。这些伪造的请求很难和合法的请求区分开。CSRF通过伪装来自受信任用户的请求来利用受信任的网站。

A9 使用含有已知漏洞的组件

开发人员使用的组件也会含有漏洞,这些漏洞能够被自动化工具发现和利用。然后攻击者根据需要定制攻击代码并实施攻击。

A10 未验证的重定向和转发

应用程序经常将用户重定向到其他网页,或以类似的方式进行内部转发。当目标网页是通过一个未验证的参数来指定时,就容易被攻击者利用。攻击者通过诱使受害人去点击未经验证的重定向链接,从而利用不安全的转发绕过安全检测。攻击者通过重定向可以试图安装恶意软件或者诱使受害人泄露密码等敏感信息,通过转发可以绕过访问控制。

详细介绍

sql注入

简介

在owasp发布的top 10漏洞里面,注入漏洞一直是危害排名第一,其中数据库注入漏洞是危害最大也是最受关注的漏洞。

当攻击者发送的sql语句被sql解释器执行,通过执行这些恶意语句欺骗数据库执行,导致数据库信息泄露。

教程推荐

sqlmap安装

sqlmap的使用需要python环境

1.python下载:官网

2.sqlmap下载:官网

1.将下载的SQLMAP安装包解压到文件夹sqlmap中,并拷贝到 Python27 安装目录下

2.在文件夹下创建sqlmap.bat ,内容为cmd.exe,创建桌面快捷方式

sqlmap作用

1、判断可注入的参数

2、判断可以用那种SQL注入技术来注入

3、识别出哪种数据库

4、根据用户选择,读取哪些数据

sqlmap支持五种不同的注入模式

1、基于布尔的盲注,即可以根据返回页面判断条件真假的注入。

2、基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。

3、基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。

4、联合查询注入,可以使用union的情况下的注入。

5、堆查询注入,可以同时执行多条语句的执行时的注入。

sqlmap支持的数据库有

MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB

测试GET参数,POST参数,HTTP Cookie参数,HTTP User-Agent头和HTTP Referer头来确认是否有SQL注入,它也可以指定用逗号分隔的列表的具体参数来测试。

可以设定HTTP(S)请求的并发数,来提高盲注时的效率。

如果你想观察sqlmap对一个点是进行了怎样的尝试判断以及读取数据的,可以使用-v参数。

共有七个等级,默认为1:

0、只显示python错误以及严重的信息。

1、同时显示基本信息和警告信息。(默认)

2、同时显示debug信息。

3、同时显示注入的payload。

4、同时显示HTTP请求。

5、同时显示HTTP响应头。

6、同时显示HTTP响应页面。

如果你想看到sqlmap发送的测试payload最好的等级就是3。

更详细介绍参考博客

sqlmap基本操作

  • 检测注入点

    sqlmap.py -u url

  • 所有数据库信息

    sqlmap.py -u url –dbs

  • 当前数据库信息

    sqlmap.py -u url –current-db

  • 指定库名列出所有表

    sqlmap.py -u url -D 库名 –table

  • 指定库名表名列出所有字段

    sqlmap.py -u url -D 库名 -T 表名 –columns

  • 指定库名表名字段dump

    sqlmap.py -u url -D 库名 -T 表名 -C 字段1,字段2 –dump

CTF中的SQL注入

1.练习总结博客:站点

2.简单sql注入3:writeup

XSS攻击

介绍

CSS(Cross Site Scripting,跨站脚本攻击),为了和层叠样式表(Cascading Style Sheet,CSS)区分,所以安全领域改为叫XSS。
XSS攻击能让攻击者在受害者的浏览器中执行js脚本,并劫持用户会话、破坏网络或将用户重定向到其他恶意的站点。

XSS的分类

1. 反射型XSS

所谓反射型XSS,就是简单用户输入的数据‘反射’给浏览器。也就是说,黑客我那个网需要有事用户‘点击’一个恶意链接,才能攻击。这其实是比较被动的。

2. 存储型XSS

存储型XSS会把用户输入的数据‘存储’在服务器端。当访问数据库数据时,从数据库取出数据,并由HTML显示,这时导致了XSS的产生。

比如黑客将恶意js脚本写在一个博客中,下次任何人访问这个博客,都会在他们的浏览器中执行这段恶意js脚本。导致‘Cookie劫持’等。

3. DOM型XSS

首先是关于DOM节点:
整个文档是一个文档节点 从每个 XML 标签是一个元素节点 包含在 XML 元素中的文本是文本节点 每一个 XML 属性是一个属性节点 注释属于注释节点。

HTML 文档中的所有内容都是节点:

  • 整个文档是一个文档节点
  • 每个 HTML 元素是元素节点
  • HTML 元素内的文本是文本节点
  • 每个 HTML 属性是属性节点
  • 注释是注释节点

和反射型XSS类似,但是这类XSS执行脚本的位置与反射型XSS不同,是修改了页面的DOM节点而造成了恶意js脚本的执行。

总结
XSS类型 反射型 存储型 DOM型
触发过程 正常用户访问携带XSS的url 1.黑客构造XSS脚本2.用户访问有XSS脚本的网站 正常用户访问携带XSS的url
存储位置 url 数据库 url
谁来输出 后端web 后端web 前端JS
输出位置 HTML响应 HTML响应 动态生成的DOM节点
XSS在CTF中的运用

XSS在CTF中主要用于盗取CookieSession,然后利用cookie,做一些其他的事情,但是这是有CSP的,一般会考察XSS绕过(bypass)的能力。

另外还会涉及到XSS,CSRFSSRF的综合应用。

再者,就是利用XSS漏洞,进行js脚本注入。

参考文章

1.XSS原理&复现
2.XSS攻击手段&在CTF中的运用

day03–Danie1

php代码审计

extract变量覆盖

该函数使用数组键名作为变量名,使用数组键值作为变量值。但是当变量中有同名的元素时,该函数默认将原有的值给覆盖掉。这就造成了变量覆盖漏洞。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
error_reporting(0);
$flag='xxx';
extract($_GET);
if(isset($shiyan))
{
$content=trim($flag);
if($shiyan==$content)
{
echo'ctf{xxx}';
}
else
{
echo'Oh.no';
}
}

?>

file_get_contents — 将整个文件读入一个字符串。

trim — 去除字符串首尾处的空白字符(或者其他字符)。

多重加密


1
2
$login = unserialize(gzuncompress(base64_decode($requset['token'])));
if($login['user'] === 'ichunqiu'){echo $flag;}

本地编写

1
2
3
4
5
6
<?php

$arr = array(['user'] === 'ichunqiu');
$token = base64_encode(gzcompress(serialize($arr)));
print_r($token);
?>

运行得到

即是所需的payload

ereg正则%00截断
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 ($_GET['password']))
{
if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
{
echo '<p>You password must be alphanumeric</p>';
}
else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
{
if (strpos ($_GET['password'], '*-*') !== FALSE) //strpos — 查找字符串首次出现的位置
{
die('Flag: ' . $flag);
}
else
{
echo('<p>*-* have not been found</p>');
}
}
else
{
echo '<p>Invalid password</p>';
}
}
?>

ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的。

strpos() 函数查找字符串在另一字符串中第一次出现的位置(区分大小写)

  • 解决方法

ereg函数存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配

科学计数法绕过长度限制

  • payload http://172.16.43.117/php_bugs-master/05.php?password=1e9%00*-*

strcmp比较字符串

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$flag = "flag";
if (isset($_GET['a'])) {
if (strcmp($_GET['a'], $flag) == 0) //如果 str1 小于 str2 返回 < 0; 如果 str1大于 str2返回 > 0;如果两者相等,返回 0。

//比较两个字符串(区分大小写)
die('Flag: '.$flag);
else
print 'No';
}

?>

可以使用数组绕过

int strcmp ( string $str1 , string $str2 )
// 参数 str1第一个字符串。str2第二个字符串。如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。

可知,传入的期望类型是字符串类型的数据,但是如果我们传入非字符串类型的数据的时候,这个函数将会有怎么样的行为呢?实际上,当这个函数接受到了不符合的类型,这个函数将发生错误,但是在5.3之前的php中,显示了报错的警告信息后,将return 0 !!!! 也就是虽然报了错,但却判定其相等了。这对于使用这个函数来做选择语句中的判断的代码来说简直是一个致命的漏洞,当然,php官方在后面的版本中修复了这个漏洞,使得报错的时候函数不返回任何值。strcmp只会处理字符串参数,如果给个数组的话呢,就会返回NULL,而判断使用的是==NULL==0bool(true)

题目 http://172.16.43.115/1.php

payload: ?a[]=1

sha()函数比较绕过

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

$flag = "flag";

if (isset($_GET['name']) and isset($_GET['password']))
{
if ($_GET['name'] == $_GET['password'])
echo '<p>Your password can not be your name!</p>';
else if (sha1($_GET['name']) === sha1($_GET['password']))
die('Flag: '.$flag);
else
echo '<p>Invalid password.</p>';
}
else
echo '<p>Login first!</p>';
?>

限制条件

传入的name参数和password参数不能相同

但是它们的sha1值要相同

解决方法

===会比较类型,比如bool
sha1()函数和md5()函数存在着漏洞,sha1()函数默认的传入参数类型是字符串型,那要是给它传入数组呢会出现错误,使sha1()函数返回错误,也就是返回false,这样一来===运算符就可以发挥作用了,需要构造usernamepassword既不相等,又同样是数组类型

题目: http://172.16.43.117/php_bugs-master/07.php

payload: ?name[]=1&password[]=2

SESSION验证绕过

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

$flag = "flag";

session_start();
if (isset ($_GET['password'])) {
if ($_GET['password'] == $_SESSION['password'])
die ('Flag: '.$flag);
else
print '<p>Wrong guess.</p>';
}
mt_srand((microtime() ^ rand(1, 10000)) % rand(1, 10000) + rand(1, 10000));
?>

限制条件

传入的password参数要等于session中的password值

解决方法

删除session

题目: http://172.16.43.115/2.php

payload http://172.16.43.115/2.php?password=

urldecode二次编码绕过

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
if(eregi("hackerDJ",$_GET[id])) {
echo("<p>not allowed!</p>");
exit();
}

$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "hackerDJ")
{
echo "<p>Access granted!</p>";
echo "<p>flag: *****************} </p>";
}
?>

题目:http://172.16.43.117/php_bugs-master/10.php

payload http://172.16.43.117/php_bugs-master/10.php?id=%2568ackerDJ

X-Forwarded-For绕过指定IP地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
function GetIP(){
if(!empty($_SERVER["HTTP_CLIENT_IP"]))
$cip = $_SERVER["HTTP_CLIENT_IP"];
else if(!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
$cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
else if(!empty($_SERVER["REMOTE_ADDR"]))
$cip = $_SERVER["REMOTE_ADDR"];
else
$cip = "0.0.0.0";
return $cip;
}

$GetIPs = GetIP();
if ($GetIPs=="1.1.1.1"){
echo "Great! Key is *********";
}
else{
echo "错误!你的IP不在访问列表之内!";
}
?>

题目:http://172.16.43.117/php_bugs-master/12.php

解决方法

HTTP头添加X-Forwarded-For:1.1.1.1

使用forefox插件SIMPLE MODIFY HEADERS

md5加密相等绕过

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){#
if ($a != 'QNKCDZO' && $md51 == $md52) {
echo "nctf{*****************}#";
} else {
echo "false!!!";
}}
else{echo "please input a";}

?>
  • 分析

    $md51=QNKCDZO的MD5编码

    $md52=传入的参数a的MD5编码

    $a 不等于’QNKCDZO’ 并且 $md51等于 $md52(也就是两个不同的字符串md5值要相同)

将QNKCDZO进行MD5加密,密文为0e830400451993494058024219903391,发现密文为0e开头,PHP在进行比较运算时,0e开头字符串都等于0,所以让两者相等我们只需再找到一个MD5加密后开头为0e的字符串即可

1
2
md5('240610708'); // 0e462097431906509019562988736854 
md5('QNKCDZO'); // 0e830400451993494058024219903391

strpos数组绕过NULL与ereg正则%00截断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

$flag = "flag";

if (isset ($_GET['nctf'])) {
if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
echo '必须输入数字才行';
else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)
die('Flag: '.$flag);
else
echo '骚年,继续努力吧啊~';
}

?>
  • 分析

    既要是纯数字,又要有#biubiubiu

    ereg函数存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配

    注意:需将#编码

  • 题目:http://172.16.43.117/php_bugs-master/15.php

  • payload:?nctf=1%00%23biubiubiu

md5()函数===使用数组绕过

1
2
3
4
5
6
7
8
9
10
11
12
<?php
error_reporting(0);
$flag = 'flag{test}';
if (isset($_GET['username']) and isset($_GET['password'])) {
if ($_GET['username'] == $_GET['password'])
print 'Your password can not be your username.';
else if (md5($_GET['username']) === md5($_GET['password']))
die('Flag: '.$flag);
else
print 'Invalid password';
}
?>
  • 分析

    若为md5($_GET['username']) == md5($_GET['password'])
    则可以构造:
    ?username=QNKCDZO&password=240610708
    因为==对比的时候会进行数据转换,0eXXXXXXXXXX 转成0
    也可以使用数组绕过
    ?username[]=1&password[]=2

    但此处是===,只能用数组绕过,PHP对数组进行hash计算都会得出null的空值
    ?username[]=1&password[]=2

  • 题目: http://172.16.43.117/php_bugs-master/18.php

  • payload: ?username[]=1&password[]=2

ereg()函数strpos() 函数用数组返回NULL绕过

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php  

$flag = "flag{123456}";

if (isset ($_GET['password'])) {
if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
echo 'You password must be alphanumeric';
else if (strpos ($_GET['password'], '--') !== FALSE)
die('Flag: ' . $flag);
else
echo 'Invalid password';
}
?>
  • 分析
    • 方法一:
      ereg()正则函数可以用%00截断
      ?password=1%00--
    • 方法二:
      password构造一个数组,传入之后,ereg是返回NULL的,===判断NULLFALSE,是不相等的,所以可以进入第二个判断,而strpos处理数组,也是返回NULL,注意这里的是!==NULL!==FALSE,条件成立,拿到flag
      ?password[]=
  • 题目: http://172.16.43.117/php_bugs-master/19.php
  • payload:?password=a%00--

弱类型整数大小比较绕过

1
2
3
4
5
6
7
8
9
10
11
12
<?php

error_reporting(0);
$flag = "flag{test}";

$temp = $_GET['password'];
is_numeric($temp)?die("no numeric"):NULL;
if($temp>1336){
echo $flag;
}

?>
  • 分析

    • 不能是数字,且又要大于1336,看上去是矛盾的
  • 解决

​ 利用PHP弱类型的一个特性,当一个整型和一个其他类型行比较的时候,会先把其他类型intval再比。如果输入一个1337a这样的字符串,在is_numeric中返回true,然后在比较时被转换成数字1337,这样就绕过判断输出flag

其他常见web类型


命令执行

参考

命令连接符:

1
2
3
;  命令1;命令2   多个命令顺序执行
&& 命令1&&命令2 当命令1执行成功,命令2才会执行 。命令1执行不成功时,命令2不会执行
|| 命令1||命令2 当命令1执行不成功,命令2才会执行。命令1执行成功时,命令2不会执行
1
2
3
4
5
6
7
8
9
10
11
<?php
if(isset($_GET[1])){
if(strlen($_GET[1])<8){
echo shell_exec($_GET[1]);
}
}
else{
show_source(__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
26
27
28
29
30
31
32
33
34
<?php

// Get input
$target = $_REQUEST[ 'ip' ];
// var_dump($target);
$target=trim($target);
// var_dump($target);
// Set blacklist
$substitutions = array(
'&' => '',
';' => '',
'|' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);
// Remove any of the charactars in the array (blacklist).
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
// var_dump($target);
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 1 ' . $target );
}
echo "<pre>{$cmd}</pre>";
highlight_file(__FILE__);
?>

git源码泄露

文件包含漏洞


PHP中文件包含函数有以下四种:

require()

require_once()

include()

include_once()

includerequire区别主要是,include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行。

include_once()require_once()这两个函数,与前两个的不同之处在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题。

  • 题目 http://4.chinalover.sinaapp.com/web7/index.php

  • php伪协议

  • 方法:读index.php

    http://4.chinalover.sinaapp.com/web7/index.php?file=php://filter/read=convert.base64-encode/resource=index.php

    base64解码后

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    <html>
    <title>asdf</title>

    <?php
    error_reporting(0);
    if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}
    $file=$_GET['file'];
    if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
    echo "Oh no!";
    exit();
    }
    include($file);
    //flag:nctf{edulcni_elif_lacol_si_siht}

    ?>
    </html>

简单脚本辅助


  • 题目 http://172.16.43.117/web/08/index.php

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #!/usr/bin/python
    #-*-coding:utf-8-*-

    import requests
    import re

    url = 'http://172.16.43.117/web/08/index.php'
    s = requests.Session()

    html = s.get(url).content

    reg = r'(.*)</p>'
    res = re.findall(reg,html)

    payload = {'result':eval(res[0])}

    flag = s.post(url,data=payload)
    print flag.content

day03–yiyangqianxixxxx

前言

此内容为严老板编写总结,7iny整理。仅供学习参考,请及时向漏洞平台上报漏洞

渗透测试

要求

  • 确立渗透测试目标 :省企业网站,或任意学习网站。
  • 确立渗透测试范围:隶属于该网站域名下所有网站均可。
  • 渗透测试手段:通过信息搜集得到网站的主要信息,来对其进行各种漏洞的测试,包括但不限于sql注入、xss、信息泄露。考虑到的攻击手段要全面,只要有可能存在漏洞的地方就去尝试。

选择的目标若未找到漏洞,可只记录信息搜集过程,并且将可能存在漏洞点的(你认为不安全的地方)标注出来。
可多选择几个目标进行尝试,但在渗透过程中要进行多方面考虑,尝试每一个可能的攻击面,若找到漏洞甚至getshell不得对系统进行任何破坏,一切也测试为目的。渗透过程中也要注意保护系统,对服务器的扫描等行为要确保不会影响服务。

详细记录整个过程,把每个值得记录的地方都写下来。并向相关漏洞平台上报漏洞

流程

信息收集

在拿到一个网站的时候,首先是对这个网站要有一个比较全面的了解,就是对这个网站进行信息收集。在信息收集阶段,一般要收集这个网站的IP地址信息,是否使用CDN,使用哪种语言开发,中间件是什么

IP端口扫描

端口发现的目的是查看是否有高危端口,比如135/445/3389或者常见的数据库端口等 比如,如果存在445端口,我们就可以测试是否存在永恒之蓝漏洞,在端口发现阶段,如果存在像7001或者8080这样的端口的情况,我们就要看下这些端口是在运行哪些服务

目录扫描

对网站目录的扫描,我们可以观察是否存在网站后台管理 如果存在的话,可以尝试弱口令登录 如果尝试多次登录没有锁定,也可以尝试简单的口令爆破,因为现场测试时间有限,长时间的爆破是不可能的

主机层漏洞

主机层的漏洞就是看端口开放情况,判断开放的服务,然后测试是否有漏洞,比如溢出漏洞,反序列化漏洞

中间件漏洞

中间件漏洞比较简单,像weblogic反序列化,还有就是使用中间件部署web木马,直接拿服务器权限另外还有一些框架的漏洞,比如Struts2的漏洞。这些漏洞都是可以直接使用工具进行检测的

常见漏洞

xss漏洞,sql注入漏洞,还有一些越权等逻辑漏洞

比如XSS漏洞,一般存在于搜索框中或者注册信息等地方
当发现有搜索框或者注册信息或者发布消息,需要输入内容,且输入消息会返回到页面让读者查看的时候,就需要测试一下是否存在xss漏洞
当然,我们还需要联想到,当我们看到搜索框的时候,我们需要测试一下搜索的内容是否是从数据库中去调取的,如果是的话,可能也会存在SQL注入的可能
上传漏洞一般配合解析漏洞使用,如果服务器端与前端都没有对上传格式进行限制,那么我们可以直接上传webshell,拿服务器权限
如果网站对上传格式有限制,我们需要抓包对文件类型进行修改,然后上传,验证是前端还是服务器端做的限制,如果是前端做的限制就可以改包上传了,上传后注意观察返回包的内容,是否有文件上传的路径与上传后的文件名
当网站是使用iis6.0搭建的网站时可以使用IIS6.0特有的两个文件解析漏洞进行测试

SQL注入漏洞常见的存在于带参数链接或者POST数据包 类似于xxx.jsp?id=xxx
或者像登录时使用POST请求方式传输用户名和密码,至于验证是否存在SQL注入

工具

在测试的过程中,一般会使用到SQLmapwvskalik8菜刀webshell御剑Nessus等还有一些反序列化的检测工具和脚本,这些可以在GitHub上,或其他地方找到
端口扫描工具可以使用nmap,Windows下的zmap(其实就是nmap),常用参数可以上网搜一下,比较详细
远程连接工具可以使用putty,或者crt
数据库连接工具可以使用Navicat

强调

渗透的思路的话,一般就是信息收集,整理,利用,测试(验证),获取权限,到此为止,禁止拿数据或者对用户网络造成影响
剩下的就是对工具的熟练使用以及丰富自己的渗透思路,能力大的可以从代码层面去发现漏洞,说不定会有意外收获

-------------The End-------------