HTTP/HTTPS协议介绍
HTTP的工作流程
客户端通过TCP三次握手与服务器建立连接
TCP连接之后 向服务器发送HTTP请求
服务器接收到HTTP请求后 向客户端发送http响应
客户端通过TCP四次断开 与服务器断开TCP连接
请求头字段详情:https://itbilu.com/other/relate/EJ3fKUwUx.html#http-request-headers
请求头字段
常见的请求方法:GET POST
Referer
这个可以表示你从哪个URL过来的X-Forwarded-For
这个表示你从那个ip过来的Client-IP
:和X-Forwarded-For
类似User-Agent
表示你从哪个操作系统或者哪个客户端(浏览器)过来的
浏览器安全
同源策略
同源指得是域名,协议端口相同。不同源的客户端脚本在没有明确授权的情况下,不能读写对方的资源。【例如你打开两个不同的网址 这两个网址之间不可以相互读写。
它是用来隔离两个网站的脚本混乱【例如 你打开一个京东的网址和百度的网址,可能京东的广告在百度的网址上出现了。
内容安全策略
Content-Security-Policy
:限定了可执行的内容内容安全策略指的是 以白名单的形式配置可信任的内容来源
在网页中,能够使白名单的内容正常执行(包含:JS,CSS,Image)
而在非白名单的内容不可正常执行,从而减少了跨站脚本攻击(XSS)
XSS
前端基础
看其他的博客去。
跨站脚本攻击:https://segmentfault.com/a/1190000017057646
。。。我看视频看的好迷。。。。
xss进阶实验
FileInclude
文件包含:为了更好的使用代码的重用性
引入了文件包含函数
比如include(flag.php)
它可以把flag.php的文件代码放到该文件里面
如此使得代码的重用性增加了
不过include($_GET)
里面是变量 可能被恶意改造
漏洞原因:
未对变量进行校验或者校验被绕过
主要依靠四个PHP函数导致
include() PHP代码解析
include_once()
require()
require_once()另外还有一些
file_get_contents()
读取文件内容
简单的一个包含例子:
1 |
|
文件包含漏洞分类
本地文件包含
远程文件包含
伪协议
- 伪协议CTF使用:
1 | ?file=php://filter/read=convert.base64-encode/resource=php_filter.php |
file:// 用于访问本地文件系统,在CTF中通常用来读取本地文件的
file:// [文件的绝对路径和文件名]
http://127.0.0.1/cmd.php?file=file://D:/soft/phpStudy/WWW/phpcode.txt
php://协议
常用的协议是
php:??filter
用于读取源码?file=php://filter/read=convert.base64-encode/resource=./cmd.php
php://input
用于执行php代码 她可以将POST请求的数据作为PHP代码执行 常见的在getconvert
文件包含绕过
就是变量的输入被限制了
绕过的方式有:
1、00截断
1 | http://127.0.0.1/tst.php?file=file:///c:/user/Thinking/desktop/flag.txt%00 |
2、点加斜杆绕过
(过滤了.php文件)
加点和斜杆来补充尾巴
那种判断文件名后四位是不是.php
的函数
可以利用· / 或者 /.
3、去掉后缀名绕过
4、双写绕过
双写绕过的意义在于
函数判断是否有这样的字符串../
等等
有的话 把它变成空格。
比如过滤了…/
那么可以这么写..././
,这样会把中间的../
过滤掉
这样就可以过滤掉这个函数
PS:
在SQL注入中
也有双写注入 , 比如过滤了union ,我们可以写成 uniunionon;
5、文件包含写shell
XXE
大师傅的博客:https://mature-sec.com/post/xxe%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/
XML介绍:
XML是一种用于标记电子文件使其具有结构性的可扩展标记语言
XtensibleMarkup Language
,可扩展标记语言,使用简单的标记来描述数据
xml是一种非常灵活的语言,类似于HTML语言,但是并没有固定的标签,所有的标签都可以自定义,其设计的宗旨是传输数据,而不是像HTML一样显示数据。
数据传输的载体
XML不会做任何事情,他是呗设计用来结构化、存储以及传输信息,也就是xml文件所携带的信息,需要被其他的语言或者程序来解析,才能发挥作用。
XML的用处
通常,xml被用于信息的记录和传递(比如,数据库的导出导入会很麻烦,但是xml会很方便),也会被用于充当配置文件。也会被应用于Web 开发的许多方面,常用于简化数据的存储和共享。如:
XML 把数据从 HTML 分离,更方便在HTML文档中显示动态数据。
XML 简化数据共享,XML数据以纯文本格式进行存储,因此提供了一种独立于软件和硬件的数据存储方法。这让创建不同应用程序可以共享的数据变得更加容易。
XML 简化数据传输,由于可以通过各种不兼容的应用程序来读取数据,以 XML 交换数据降低了不兼容系统之间交换书据的复杂性。
XML 简化平台变更,使用XML存储一些不兼容的数据,可以在系统或软件升级,转换大量的数据时,避免数据的丢失。
XML 使您的数据更有用,XML可以使不同的应用程序都能够访问您的数据,使得数据的用途更广。
XML 用于创建新的互联网语言,如XHTML、WSDL、WAP 和 WML、RSS 、RDF 和 OWL等
XML语法
- XML文档中有且只有一个根元素
- XML元素都必须有一个关闭标签
- XML标签对大小写敏感
- XML元素必须被正确的嵌套
- XML属性值必须加引号
它没有固定的标签
1 | <?xml version="1.0" encoding="utf-8" ?> |
DTD 文档类型定义
用来为XML文档定义语义约束
1、我们可以理解为一个模板,这个模板定义了用户自己
创建的根元素以及对应的子元素和根元素的合法元素和属性
2、而文档元素则必须以我们的DTD为模板,来对XML的元素的
内容进行相应的规范化。
DTD分为内部和外部两种。DTD定义在xml文件中视为内部DTD;
DTD定义在外部的dtd文件中,视为外部DTD。
DTD声明
内部声明:DTD被包含在XML源文件中,应当使用下面的语法包装在一个DOCTYPE声明中:
语法:
例子:
1 |
|
如上,就是一个内部DTD的引用示例,在DTD定义中,要求根元素books的子元素book出现一次及以上,子元素book又有三个子元素,分别为name,author和price,然后声明了元素book的id属性,其类型是CDATA,并且是必须的(#REQUIRED),最后定义了book的三个子元素的数据类型为#PCDATA,这表示这三个元素标签中的内容必须是文本,并能再出现子标签。
外部声明:假如DTD位于XML源文件的外部,应当使用下面的语法封装在一个DOCTYPE定义中
语法:
PCDATA
指的是被解析的字符数据
XML解析器通常会解析XML文档中所有的文本
CDATA
CDATA 由“<![CDATA [“开始, 由”]]>” 结束
指的是不应由XML解析器进行解析的文本数据
CDATA部分中的所有内容都会被解析器忽略
DTD实体
实体是用于定义引用普通文本或特殊字符的快捷方式的变量
实体就像是变量,可以用于存储数据,以便后续的使用。
但它的功能又不仅仅是存储。
比如外部实体,除了可以存储数据,还可以从远程文件或远程网络中读取内容或调用数据。至于什么是外部实体,别着急,接着往后看。
从实体被定义的位置来看,实体可以分为内部实体和外部实体。
就像内部DTD和外部DTD一样,内部实体,就是在XML文档内部的DTD进行定义的实体,外部实体就是定义在外部DTD文件中然后被引用到当前XML中的实体。
内部普通实体:
声明 :
引用: 一个实体的引用,由三部分构成: &符号,实体名 , 分号。
1 |
|
外部普通实体
声明:
1 |
|
参数实体
XML注入
XML与HTML一样,也存在注入漏洞。比如:一个 web 应用,在进行用户注册时,选择以 xml 来存储数据到 xmldb 数据库中,当用户填写用户名,密码和邮箱时,后台存储的文件格式及内容如下:
那么攻击者就可以在注册的时候构造恶意的数据,假设他在用户名与密码的输入框中输入正常的文本,在最后的邮箱输入框中输入如下内容:
那么就会多注册一个名为admin的用户。
综合上面的小例子,我们可以知道,能够进行XML注入攻击的前提是,用户能够控制数据的输入,程序没有对输入的内容进行过滤且拼接了数据。那么相应的,破坏掉其中一个前提就可以进行防御了,既然我们无法限制用户的输入,那么就可以对数据进行过滤,将XML语言本身的“保留字符”进行过滤或者转意即可。
XXE 即SML外部实体注入攻击
是一种web常见的安全漏洞,发生在应用程序解析XML输入时,没有
禁止外部实体的加载,导致了攻击者可以通过XML的外部实体获取服务器中本应被保护的数据
产生原因:
在文档类型定义部分,可以引用外部的DTD文件,所以这里容易出现安全问题。
XML解析器解析外部实体支持多种协议。如:使用file
协议可以读取本地文件内容
使用http
协议可以获取web资源
因此 攻击者可以构建恶意的外部实体,当解析器解析了包含恶意的外部实体的XML文件时
就出现了XXE攻击。
XXE的利用场景
一般分为两大场景
有回显和无回显
有回显的情况下 我们可以直接在页面种中看到payload的执行结果或现象(带内XML外部实体)
即攻击者可以发送带有XXE有效负载的请求并从包含某些数据的web应用程序获取响应
无回显的情况 可以使用外带数据通道提取数据即带外XML外部实体
有回显的本地文件读取
漏洞示例代码:
测试payload:
在浏览器中设置代理,打开burpsuite访问存在漏洞的页面:“xxetest.php”,并抓包,然后发送到Repeater中,构造请求包:
这样我们就读取到了windows系统的system.ini的文件内容。
但是这样也不代表这个payload的就适用于任何情况,比如我们更换一个读取的文件xmltest2.txt,内容是:
我们再使用刚才的payload测试:
这个时候就会如上图一样,报很多错误,主要是因为我们要读取的文件内容中存在很多的特殊字符:大于号、小于号等,我们在前面的XML基础巩固中也提到过,当xml的标签内还存在小于号、大于号等特殊字符时,尤其是小于号,会被XML解析器误认为是另一个标签的开始,这样就会造成解析的错误。所以我们的问题是:
所以我们就要想办法绕过。这个时候我们就需要了解一下XML CDATA了,我们先看一下w3school中对他的描述:
其实只用看一个开始,我们就大概知道CDATA的作用了,它可以使得使用其中的数据内容不会被xml解析器解析。然后我们再看其使用方式:
从w3school给出的例子,我们也大概知道了CDATA的使用方式,但是其还需要注意几点:
a. CDATA 部分不能包含字符串 “]]>”。也不允许嵌套的 CDATA 部分,这样会导致异常的闭合,从而使解析器报错。
b. 标记 CDATA 部分结尾的 “]]>” 不能包含空格或换行。
那么了解了这些,我们就可以尝试使用CDATA再次去读取目标文件的内容,我们首先需要把要读取的到的内容放在CDATA中,但是CDATA并没有提供拼接的方法,所以我们暂且使用普通实体进行拼接尝试(注意是尝试):
我们尝试直接使用实体来进行拼接,但是测试失败:
这说明我们的拼接方式不可行,我们现在使用的是一般实体,我们在前面的xml基础知识中介绍过了,一般实体的引用是在xml文档内容中,既然在xml文档内容中拼接不可行,那再dtd中拼接可行吗?我们再次进行尝试,既然再dtd中拼接,那就需要用到参数实体了。
我们再次尝试构造payload:
理论上,我们完美地将这几个参数实体拼接了起来,并将值赋给了一般实体all,但是遗憾的是,我们的payload还是报错了:
那么这又是为什么呢?根据XML规范所描述:“在DTD内部子集中的参数实体调用,不能混掺到标记语言中”,这是什么意思呢?就是不能在实际的标记语言中来调用参数实体,像我们这样,就是在标记语言中进行调用:
但可以在同级别中被当作标记语言调用,就像是参数实体的引用,就是将调用当成了一个标记语言,像这样:
也就是我们所构造的payload这种使用方式,不能在内部DTD中被这样使用,但是幸运的是,XML规范还声明了一点:“外部参数实体不受此限制”,这就告诉我们可以使用外部的DTD来构造payload,将我们的CDATA内容拼接起来:
DTD文件的内容:
我们再次进行攻击尝试,成功读取到文件内容:
Ps:
由于环境资源的关系,我们在进行攻击时,所使用的外部dtd文件,是本地环境的。但是在实际的攻击情况下,这个DTD文件应该是我们自己所掌握的主机的DTD文件,文件的内容是受我们所控的。
命令执行
命令执行漏洞简介
什么是命令执行 :未对用户输入进行严格过滤
其危害:
继承Web服务程序的权限去执行系统命令或读写文件
反弹shell,获得目标服务器的权限
进一步内网渗透
远程命令执行
常见的PHP:eval() assert() preg_replace() creatr_function()
函数
eval() assert()
可以执行参数的代码,且接受的参数时字符串
eval
要求其传入的参数必须为PHP代码,就是要求以分号结尾
assert
是直接把传入的参数当作代码 可以直接执行 不强制要求分号
preg_replace()
其参数形式:('正侧规则','替换字符','目标字符')
1 | <?php |
array_map()
:其参数(函数,命令) ---(function,cmd) (assert,phpinfo())
系统命令执行/本地命令执行
常见函数有;;system() exec() shell_exec() passthru() penti-exec() popen() proc-pen()
system()
:执行外部程序,并且显示输出
exec()
:执行外部程序
shell-exec()
:通过shell环境执行命令,并且将完整的输出以字符串的方式返回
passthru()
:执行linux系统命令并且显示原始输出
系统常用命令执行的特殊字符
1 | cms1|cmd2 无论怎样cmd2都会执行 |
命令执行时常见的绕过手段
黑名单绕过
1 | a=l;b=s;$a$b |
空格过滤
空格可以用以下字符串代替:
< 、<>、%20(space)、%09(tab)、$IFS$9、 ${IFS}、$IFS等
一些命令分隔符
linux中:%0a 、%0d 、; 、& 、| 、&&、||
windows中:%0a、&、|、%1a(一个神奇的角色,作为.bat文件中的命令分隔符)
1、在 shell 中,担任”连续指令”功能的符号就是”;”
2、”&” 放在启动参数后面表示设置此进程为后台进程,默认情况下,进程是前台进程,这时就把Shell给占据了,我们无法进行其他操作,对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个’&’实现这个目的。
3、管道符”|”左边命令的输出就会作为管道符右边命令的输入,所以左边的输出并不显示
在Linux bash中还可以使用{OS_COMMAND,ARGUMENT}
来执行系统命令
linux中直接查看文件内容的工具
cat、tac、more、less、head、tail、nl、sed、sort、uniq、
参考博客: https://blog.csdn.net/silence1_/article/details/96135760
反序列化
序列化指的是 类的对象在传输的时候会变成字符串
而反序列化就是指 字符串可以变成一个对象。
01、序列化和反序列化概述
序列化:把对象转化为字符串
反序列化:字符串转化为对象
通过反序列化在特定条件下可以重建php对象并执行php对象中某些magic函数
反序列化的作用在于有一些非常好的魔法函数。
在反序列化的时候,我们测试知道
1 |
|
他被序列化之后
魔法函数概述
Php对象中有一些特殊的函数,叫做magic函数,他们在特定条件下执行,比如创建、销毁对象的时候
为了更好的理解magic方法是如何工作的,让我们添加一个magic方法在我们的类中。
protected: \0\0name %00%00name
privated: \0类名\0name %00类名%00name
当遇到过滤%00
的时候,可以把s变成S 同时把value的%00变为%5c00。
在我们属性序列化字符串的时候,对类中不同的属性有不同的表述方式,protected ,private ,public 在序列化的时候都不是一样的 【注意 空格的时候可以用%00
来代替。
小tips
还有一个需要提到的点,就是在序列化字符串中,s - non-escaped binary string和 S - escaped binary string是有区别的。对于s就不用说了,这里说一下S属性: S:
也就是说,对于刚才的序列化字符串:
O:4:”Test”:3:{s:2:”s1”;i:111;s:5:”%00*%00s2”;s:9:”protected”;s:8:”%00Test%00s3”;s:7:”private”;}
可以用S去代替s,即:
O:4:”Test”:3:{S:2:”s1”;i:111;S:5:”%00*%00s2”;S:9:”protected”;S:8:”%00Test%00s3”;S:7:”private”;}
但是对于 \00 这种转义了的,只有S才会认,而s并不会正常识别,详细区别见test1.php:
访问:http://127.0.0.1/heetian/test1.php
可以看到,这个结果和我们预期的一样。
我们在平常是如何使用反序列化呢?
下面是一个简单的例子:
反序列化进阶
CTF中的一些小Tips :
像上述的都是直接利用反序列化函数做的
如果没有反序列化函数的话,我们可以利用到phar://流扩展反序列化的方式攻击
下面是收到该函数就会产生反序列化效果的函数
这里就要提问了!!
怎么生成这个文件呢??
下面是一个例子
其中的phar文件有:
下面是利用phar文件的方法 :
好了好了,感觉这篇笔记怎么全是图片
emm总结下phar文件打反序列化的过程
1、我们查看类,找到利用点
2、根据利用点 写phar文件
3、把char文件上传 再利用phar://协议来打反序列化
下面给个例子
下面是patload:
CSRF
csrf概述
跨站请求伪造
1、跨站点的请求
2、请求时伪造的
它是一种挟制用户在当前已登陆的web应用程序上执行非本意的操作的攻击方法
CSRF漏洞的成因就是网站的cookie在浏览器中不会过期,只要不关闭浏览器或者退出登录,那么以后只要是访问这个网站,都是默认你已经登陆的状态
次完整的CSRF攻击,需要受害用户需要完成两个步骤:
1.登录正常网站,并在本地生成Cookie。
2.在不退出正常网站的情况下,访问恶意网站。
csrf的本质就是在不知情的情况下执行请求
分为get类型csrf post型csrf
重点在于利用html构造请求
csrf漏洞利用
csrf分为两类
1、操作类型csrf:模拟人为操作,让受害者执行危险请求
2读取类型csrf:模拟人为请求,获取受害者敏感信息
它可以分为 cars,jsonp。【我看视频看不下去了。他讲的我听不懂。
合天的总结:
看这个好多天了。
但是我真的觉得好恶心。。。 特别是CSRF SSRF这两个 我看的贼懵逼
合天剩下的有逻辑漏洞 ,文件上传,文件包含,sql注入。
后面三个以前就学过,所以我不是很打算再去看。不过我的计划是
一周看一个 ,其余时间全刷题目!!
总结以下;这次合天的培训 我学到了挺多的。就我而言。。
那么我想的是今天18号。在30号之前,我要刷完攻防世界的web,同时刷两套真题!
- 本文标题:合天培训(xss xxe uns FilInc )
- 创建时间:2020-02-26 01:16:52
- 本文链接:2020/02/26/CTFcomig/合天培训/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!