合天培训(xss xxe uns FilInc )
liduoan.efls Engineer

image

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
2
3
4
5
<?php
$file=$_GET['file'];
include($file);
....
>
文件包含漏洞分类

本地文件包含
远程文件包含

伪协议

image

  • 伪协议CTF使用:
1
2
?file=php://filter/read=convert.base64-encode/resource=php_filter.php
?file=php://filter/resource=http://www.example.com
  • file:// 用于访问本地文件系统,在CTF中通常用来读取本地文件的

    file:// [文件的绝对路径和文件名]

    http://127.0.0.1/cmd.php?file=file://D:/soft/phpStudy/WWW/phpcode.txt

    image

  • php://协议

    常用的协议是

    php:??filter用于读取源码 ?file=php://filter/read=convert.base64-encode/resource=./cmd.php

    php://input用于执行php代码 她可以将POST请求的数据作为PHP代码执行 常见的在getconvert

文件包含绕过

就是变量的输入被限制了

绕过的方式有:
1、00截断

1
2
3
4
5
http://127.0.0.1/tst.php?file=file:///c:/user/Thinking/desktop/flag.txt%00

<?php
include($_GET['file']);
?>

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
2
3
<?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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="utf-8"?>
<!--这里是注释-->
<!DOCTYPE books [
<!ELEMENT books (book+)>
<!ELEMENT book (name,author,price)>
<!ATTLIST book id CDATA #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>

]>
<books>
<book id="b01">
<name>Python黑客编程从入门到入狱</name>
<author>张三</author>
<price>$20.00</price>
</book>
</books>

如上,就是一个内部DTD的引用示例,在DTD定义中,要求根元素books的子元素book出现一次及以上,子元素book又有三个子元素,分别为name,author和price,然后声明了元素book的id属性,其类型是CDATA,并且是必须的(#REQUIRED),最后定义了book的三个子元素的数据类型为#PCDATA,这表示这三个元素标签中的内容必须是文本,并能再出现子标签。

外部声明:假如DTD位于XML源文件的外部,应当使用下面的语法封装在一个DOCTYPE定义中

语法:

image

PCDATA

指的是被解析的字符数据

XML解析器通常会解析XML文档中所有的文本

CDATA

CDATA 由“<![CDATA [“开始, 由”]]>” 结束

指的是不应由XML解析器进行解析的文本数据

CDATA部分中的所有内容都会被解析器忽略

DTD实体

实体是用于定义引用普通文本或特殊字符的快捷方式的变量

实体就像是变量,可以用于存储数据,以便后续的使用。

但它的功能又不仅仅是存储。

比如外部实体,除了可以存储数据,还可以从远程文件或远程网络中读取内容或调用数据。至于什么是外部实体,别着急,接着往后看。

从实体被定义的位置来看,实体可以分为内部实体和外部实体。

就像内部DTD和外部DTD一样,内部实体,就是在XML文档内部的DTD进行定义的实体,外部实体就是定义在外部DTD文件中然后被引用到当前XML中的实体。

内部普通实体:

​ 声明 :

​ 引用: 一个实体的引用,由三部分构成: &符号,实体名 , 分号。

1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books [
<!ENTITY test "Hello World">
]>

<books>&test;</books>

外部普通实体

声明:

image

1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books [
<!ENTITY xxe SYSTEM "http://localhost/xmltest.txt">
]>

<books>&xxe;</books>

参数实体

image

XML注入

XML与HTML一样,也存在注入漏洞。比如:一个 web 应用,在进行用户注册时,选择以 xml 来存储数据到 xmldb 数据库中,当用户填写用户名,密码和邮箱时,后台存储的文件格式及内容如下:

image

那么攻击者就可以在注册的时候构造恶意的数据,假设他在用户名与密码的输入框中输入正常的文本,在最后的邮箱输入框中输入如下内容:

image

那么就会多注册一个名为admin的用户。

综合上面的小例子,我们可以知道,能够进行XML注入攻击的前提是,用户能够控制数据的输入,程序没有对输入的内容进行过滤且拼接了数据。那么相应的,破坏掉其中一个前提就可以进行防御了,既然我们无法限制用户的输入,那么就可以对数据进行过滤,将XML语言本身的“保留字符”进行过滤或者转意即可。


XXE 即SML外部实体注入攻击

是一种web常见的安全漏洞,发生在应用程序解析XML输入时,没有

禁止外部实体的加载,导致了攻击者可以通过XML的外部实体获取服务器中本应被保护的数据

产生原因:

在文档类型定义部分,可以引用外部的DTD文件,所以这里容易出现安全问题。

XML解析器解析外部实体支持多种协议。如:使用file协议可以读取本地文件内容

使用http协议可以获取web资源

因此 攻击者可以构建恶意的外部实体,当解析器解析了包含恶意的外部实体的XML文件时

就出现了XXE攻击。

XXE的利用场景

一般分为两大场景

有回显和无回显

有回显的情况下 我们可以直接在页面种中看到payload的执行结果或现象(带内XML外部实体)

即攻击者可以发送带有XXE有效负载的请求并从包含某些数据的web应用程序获取响应

无回显的情况 可以使用外带数据通道提取数据即带外XML外部实体

image


有回显的本地文件读取

漏洞示例代码:

image

测试payload:

image

在浏览器中设置代理,打开burpsuite访问存在漏洞的页面:“xxetest.php”,并抓包,然后发送到Repeater中,构造请求包:

image

​ 这样我们就读取到了windows系统的system.ini的文件内容。

但是这样也不代表这个payload的就适用于任何情况,比如我们更换一个读取的文件xmltest2.txt,内容是:

image

我们再使用刚才的payload测试:

image

这个时候就会如上图一样,报很多错误,主要是因为我们要读取的文件内容中存在很多的特殊字符:大于号、小于号等,我们在前面的XML基础巩固中也提到过,当xml的标签内还存在小于号、大于号等特殊字符时,尤其是小于号,会被XML解析器误认为是另一个标签的开始,这样就会造成解析的错误。所以我们的问题是:

image

所以我们就要想办法绕过。这个时候我们就需要了解一下XML CDATA了,我们先看一下w3school中对他的描述:

image

其实只用看一个开始,我们就大概知道CDATA的作用了,它可以使得使用其中的数据内容不会被xml解析器解析。然后我们再看其使用方式:

image

从w3school给出的例子,我们也大概知道了CDATA的使用方式,但是其还需要注意几点:

a. CDATA 部分不能包含字符串 “]]>”。也不允许嵌套的 CDATA 部分,这样会导致异常的闭合,从而使解析器报错。

b. 标记 CDATA 部分结尾的 “]]>” 不能包含空格或换行。

那么了解了这些,我们就可以尝试使用CDATA再次去读取目标文件的内容,我们首先需要把要读取的到的内容放在CDATA中,但是CDATA并没有提供拼接的方法,所以我们暂且使用普通实体进行拼接尝试(注意是尝试):

image

我们尝试直接使用实体来进行拼接,但是测试失败:

image

这说明我们的拼接方式不可行,我们现在使用的是一般实体,我们在前面的xml基础知识中介绍过了,一般实体的引用是在xml文档内容中,既然在xml文档内容中拼接不可行,那再dtd中拼接可行吗?我们再次进行尝试,既然再dtd中拼接,那就需要用到参数实体了。

我们再次尝试构造payload:

image

理论上,我们完美地将这几个参数实体拼接了起来,并将值赋给了一般实体all,但是遗憾的是,我们的payload还是报错了:

image

那么这又是为什么呢?根据XML规范所描述:“在DTD内部子集中的参数实体调用,不能混掺到标记语言中”,这是什么意思呢?就是不能在实际的标记语言中来调用参数实体,像我们这样,就是在标记语言中进行调用:

image

但可以在同级别中被当作标记语言调用,就像是参数实体的引用,就是将调用当成了一个标记语言,像这样:

image

也就是我们所构造的payload这种使用方式,不能在内部DTD中被这样使用,但是幸运的是,XML规范还声明了一点:“外部参数实体不受此限制”,这就告诉我们可以使用外部的DTD来构造payload,将我们的CDATA内容拼接起来:

image

DTD文件的内容:

image

我们再次进行攻击尝试,成功读取到文件内容:

image

Ps:

由于环境资源的关系,我们在进行攻击时,所使用的外部dtd文件,是本地环境的。但是在实际的攻击情况下,这个DTD文件应该是我们自己所掌握的主机的DTD文件,文件的内容是受我们所控的。


命令执行

命令执行漏洞简介

什么是命令执行 :未对用户输入进行严格过滤

其危害:

继承Web服务程序的权限去执行系统命令或读写文件

反弹shell,获得目标服务器的权限

进一步内网渗透

远程命令执行

常见的PHP:eval() assert() preg_replace() creatr_function()函数

eval() assert()可以执行参数的代码,且接受的参数时字符串

eval要求其传入的参数必须为PHP代码,就是要求以分号结尾

assert是直接把传入的参数当作代码 可以直接执行 不强制要求分号

preg_replace()其参数形式:('正侧规则','替换字符','目标字符')

1
2
3
<?php
preg_replace('/test/e',$_POST['cmd'],'just test');
?>

array_map():其参数(函数,命令) ---(function,cmd) (assert,phpinfo())

系统命令执行/本地命令执行

常见函数有;;system() exec() shell_exec() passthru() penti-exec() popen() proc-pen()

system():执行外部程序,并且显示输出

exec():执行外部程序

shell-exec():通过shell环境执行命令,并且将完整的输出以字符串的方式返回

passthru():执行linux系统命令并且显示原始输出

系统常用命令执行的特殊字符

1
2
3
4
5
6
7
cms1|cmd2  无论怎样cmd2都会执行
cmd1;cmd2 无论怎样cmd2都会执行
cmd1||cmd2 cmd1执行失败时才执行cmd2
cmd1&&cmd2 仅在cmd执行成功后才可以执行cmd2
127.0.0.1&net user IP和net user都可以执行并全部输出
>(cnmd): <(ls)
<(cmd: >(ls)

命令执行时常见的绕过手段

黑名单绕过

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函数

​ 反序列化的作用在于有一些非常好的魔法函数。

image

​ 在反序列化的时候,我们测试知道

1
2
3
4
5
6
7
<?php
class Test{
public $s1=111;
protected $s2='protected';
private $s3 ='private'
}
?>

​ 他被序列化之后

image

魔法函数概述

Php对象中有一些特殊的函数,叫做magic函数,他们在特定条件下执行,比如创建、销毁对象的时候

为了更好的理解magic方法是如何工作的,让我们添加一个magic方法在我们的类中。

image

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::”“ 其中 是源字符串的长度,而非 的长度。 是非负整数,数字前可以带有正号(+)。 为经过转义之后的字符串。它的转义规则是,对于 ASCII 码小于 128 的字符(但不包括 \),按照单个字节写入(与 s 标识的相同),对于 128~255 的字符和 \ 字符,则将其 ASCII 码值转化为 16 进制编码的字符串,以 \ 作为开头,后面两个字节分别是这个字符的 16 进制编码,顺序按照由高位到低位排列,也就是第 8-5 位所对应的16进制数字字符(abcdef 这几个字母是小写)作为第一个字节,第 4-1 位作为第二个字节。依次编码下来,得到的就是 的内容了。

也就是说,对于刚才的序列化字符串:

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:

image

访问:http://127.0.0.1/heetian/test1.php

image

可以看到,这个结果和我们预期的一样。


image

image

我们在平常是如何使用反序列化呢?

image

下面是一个简单的例子:

image


反序列化进阶

CTF中的一些小Tips :

image

image

像上述的都是直接利用反序列化函数做的

如果没有反序列化函数的话,我们可以利用到phar://流扩展反序列化的方式攻击

image

image

下面是收到该函数就会产生反序列化效果的函数

image

这里就要提问了!!

怎么生成这个文件呢??

下面是一个例子

image

其中的phar文件有:

image

下面是利用phar文件的方法 :

image

好了好了,感觉这篇笔记怎么全是图片

emm总结下phar文件打反序列化的过程

1、我们查看类,找到利用点

2、根据利用点 写phar文件

3、把char文件上传 再利用phar://协议来打反序列化

下面给个例子

image

下面是patload:

image

CSRF

csrf概述

跨站请求伪造

1、跨站点的请求

2、请求时伪造的

它是一种挟制用户在当前已登陆的web应用程序上执行非本意的操作的攻击方法

CSRF漏洞的成因就是网站的cookie在浏览器中不会过期,只要不关闭浏览器或者退出登录,那么以后只要是访问这个网站,都是默认你已经登陆的状态

次完整的CSRF攻击,需要受害用户需要完成两个步骤:

​ 1.登录正常网站,并在本地生成Cookie。

​ 2.在不退出正常网站的情况下,访问恶意网站。

image

csrf的本质就是在不知情的情况下执行请求

分为get类型csrf post型csrf

重点在于利用html构造请求

csrf漏洞利用

csrf分为两类

1、操作类型csrf:模拟人为操作,让受害者执行危险请求

2读取类型csrf:模拟人为请求,获取受害者敏感信息

它可以分为 cars,jsonp。【我看视频看不下去了。他讲的我听不懂。

合天的总结:

看这个好多天了。

但是我真的觉得好恶心。。。 特别是CSRF SSRF这两个 我看的贼懵逼

合天剩下的有逻辑漏洞 ,文件上传,文件包含,sql注入。

后面三个以前就学过,所以我不是很打算再去看。不过我的计划是

一周看一个 ,其余时间全刷题目!!

总结以下;这次合天的培训 我学到了挺多的。就我而言。。

那么我想的是今天18号。在30号之前,我要刷完攻防世界的web,同时刷两套真题!