ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

合天网_web模块实验笔记3

2021-10-17 19:03:28  阅读:163  来源: 互联网

标签:web 00 函数 天网 后缀名 模块 绕过 php 变量


文件上传漏洞实战
总结文件包含漏洞涉及到的php过滤函数:
trim()
str_ireplace() 去除首尾字符串
strtolower() 转换小写
deldot() 删除文件名末尾的点
strrchr() 查找指定字符在字符串中的最后一次出现


使用的靶场upload

实验一:实验关键点fread($file,2) 只读2字节,通过文件的前两个字节判断文件类型
这里通过上传eval.gif完成webshell的上传

实验二:突破getimagesize(),配合文件包含漏洞执行webshell
基础知识补充:getimagesize()简介
这个函数功能会对目标文件的16进制去进行一个读取,去读取头几个字符串是不是符合图片的要求的

解题思路:通过cmd copy /b pic.jpeg + php.php
制作图片木马,然后进行上传,通过蚁剑直接连接

实验三
选择Pass-14,上传eval.php并用burpsuite抓包,修改Content-Type为image/gif,添加GIF图片的文件头GIF89a,然后使用蚁剑进行连接

漏洞修复:
1.将上传的目录设置为不可执行;
2.判断文件类型:结合MIME Type、后缀检查等方式,推荐文件类型检查使用白名单的方式;
3.使用随机数改写文件名和文件路径。


补充知识:00截断
1) 0x00截断
0x00是十六进制表示方法,表示ASCII码为0的字符,在一些函数处理时,会把这个字符当作结束符。

0x00可以用在对文件名的绕过上,具体原理:系统在对文件名进行读取时,如果遇到0x00,就会认为读取已经结束。但要注意是文件的十六进制内容里的00,而不是文件名中的00。也就是说系统是按二进制或十六进制读取文件,遇到ASCII码为0的位置就停止,而这个ASCII码为0的位置在十六进制中是00。

总之就是利用ASCII码为0这个特殊字符,让系统认为字符串已经结束。

2) %00截断
url发送到服务器后被服务器解码,这时还没有传到验证函数,也就是说验证函数里接收到的不是%00字符,而是%00解码后的内容,即解码成了0x00。总之就是%00被服务器解码为0x00发挥了截断作用。

3) 0x0a
0x0a是十六进制表示方法,表示ASCII码为/n的换行字符,具体为换行至下一行行首起始位置。

实验一:直接修改文件类型,将其设置为image就可以进行直接的木马上传

实验二:
源码:$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
使用%00进行截断,因为img_path是直接拼接后缀文件名,所以我们可以直接使用%00
进行截断,传上我们的crake.php

实验三:
其实和pass11是差不多的解题方式,只不过修改了
save_path参数通过POST方式传递,还是利用00截断,因为POST不会像GET对%00进行自动解码,所以需要在二进制中进行修改,需要在hex模块进行修改00

实验四:
发现move_uploaded_file()函数中的img_path是由post参数save_name控制的,因此可以在save_name利用00截断绕过,方法同pass-12

 

绕过黑名单检查实现文件上传——1
所谓的黑名单绕过,其实就是对文件的后缀名进行了一个检测,那么我们通过自己的方式去思考怎么绕开文件名检测的语句

实验一:
相比于pass-4,过滤了.htaccess,但将后缀转换为小写去掉了,因此可以使用大小绕过

实验二:
相比于前两题,这题没有对后缀名进行去空,因此可以在后缀名加空格绕过

实验三:
没有对后缀名末尾的点进行处理,利用windows特性,会自动去掉后缀名中最后的”.”,可在后缀名中加”.”绕过


绕过黑名单检查实现文件上传——1
实验一:没有对后缀名中的’::$DATA’进行过滤。在php+windows的情况下:如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::$DATA"之前的文件名。利用windows特性,可在后缀名中加” ::$DATA”绕过

 

csrf的本质就是欺骗用户(已经获取了系统的信任)点击带有伪造请求的页面,从而执行相关命令,利用的就是cookie保留这一点。

CSRF(Cross-site request forgery)跨站请求伪造,也被称为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。CSRF通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

下图是一次完整的CSRF攻击示意图。用户登录并访问了一正常网站,登录成功后,网站返回用户的身份标识Cookie给用户。当用户访问到恶意网站时,恶意网站强制用户去向正常网站发送恶意请求。由于用户此时拥有正常网站的Cookie,所以就相当于攻击者盗用了用户身份,去访问了正常(目标)网站。

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

1.登录正常网站,并在本地生成Cookie。
2.在不退出正常网站的情况下,访问恶意网站。


简单总结下:
就是csrf漏洞,就是利用你的cookie值被保留,然后第二次访问页面url的时候,自动登录,后恶意链接中的一系列的get,post参数值实现网页信息的恶意篡改

其实本质上get请求和post请求本质上没有特别大的区别,他们构造payload方式会有所不同。向get请求的那种,我们只需要用户加载一个带恶意亲求的url就可以。但是post那种,就需要我们通过构造那种表单来实现post请求的传送


JSONP劫持
JSONP全称JSON with Padding,是基于JSON格式的为解决跨域请求资源而产生的解决方案。其基本原理是利用了HTML里<script>标签,远程调用JSON文件来实现数据传递。

当某网站通过JSONP的方式来跨域传递用户认证后的敏感信息时,攻击者可以构造恶意的JSONP调用页面,诱导被攻击者访问来达到截取用户敏感信息的目的。
总而言之就是用户构造一个恶意的jsonp调用页面,反正就是构造一个假的调用页面实现jsonp调用截取
漏洞修复:对refer进行限制;打乱响应主体内容;使用token。

3. CORS跨域资源读取
跨域资源共享(CORS)定义了在一个域中加载的客户端Web应用程序,与另一个域中的资源交互的方式,需要浏览器和服务器共同支持才能实现。

原理:向header中注入Access-Control-Allow-Origin服务端判断请求头中的参数是否被允许的域,来决定请求源是否有权限获取数据。

CORS允许浏览器向跨域服务器发出XmlHttpRequest请求,CORS是JSONP的升级版,JSONP只能通过get方式请求,而CORS支持get和post请求。

漏洞修复:加强对access-control-allow-origin的控制。
构建一个cors.html 通过ajax 判断页面就绪状态,从而弹出页面文本。

 

php 安全函数特性

1.Is_numeric类型转换缺陷
PHP提供了is_numeric函数,用来判断变量是否为数字。PHP弱类型语言的一个特性,当一个整型和一个其他类型行比较的时候,会先把其他类型intval数字化再比。

当我们通过is_numeric,对输入的变量进行一个数字验证的时候,我们可以通过数字+字母的方式去绕开is_numeric()函数的检测,然后你的变量再与真正的数字进行比较的时候,会因为php的弱类型特性,将变量自动转换为数字。


2.Hash比较缺陷
题目需求,即需要你输入的不是原来的字符串,同时需要md5加密后的值,与原来的字符串的md5相同。

这里我们就可以利用弱类型比较的特性,0e的md5的值在php中都是相同的,所以我们就可以利用这一点让不同字符串加密后的结果也相同

3.parse_str变量覆盖缺陷(会注册一个变量,同时不会验证变量是否存在)
parse_str函数的作用就是解析字符串并注册成变量,在注册变量之前不会验证当前变量是否存在,所以直接覆盖掉已有变量。

$b = $_GET['b'];
@parse_str($b);
b = 1(注:get是从=的右边取值哦)
b = a[0],所以这里就是取a[0]了,a[0]就被拿去注册了,然后就可以给a[0]赋值了

4.switch绕过
题目需求,为4的时候是我们感兴趣的值,但是必须包含字母才可以switch
那么我们还是直接利用弱类型的特点直接带上字母就好了

5.extract()变量覆盖
extract() 函数从数组中将变量导入到当前的符号表。该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。该函数返回成功设置的变量数目。为了拿到flag,需要auth值为1,此处我们利用extract()变量覆盖的缺陷,将auth覆盖为1

6.strcmp()比较字符串
strcmp只会处理字符串参数,如果给个数组的话呢,就会返回NULL,而判断使用的是==,NULL==0是 bool(true),满足if判断的逻辑,就得到flag了

7.sha1()比较绕过
sha1()函数默认的传入参数类型是字符串型,那要是给它传入数组则会出现错误,使sha1()函数返回false。这个和strcmp()是相似的

8.进制绕过
通过十六进制绕过,检验全部是数字的模块,从而实现数字相等

9.ereg()函数绕过
第一种,还是老方法了,传入数组使函数返回null,绕过一些if模块
第二种,通过%00进行截断。

10. session验证绕过
这里session就是系统通过cookie保存的password,那么我们直接手动删除cookie,让session产生的字段为null,从而直接绕过

11.X-Forwarded-For绕过指定IP地址
补充知识:xff 是http的拓展头部,作用是使Web服务器获取访问用户的IP真实地址(可伪造)。由于很多用户通过代理服务器进行访问,服务器只能获取代理服务器的IP地址,而xff的作用在于记录用户的真实IP,以及代理服务器的IP。
通过伪造xff字段,使得系统识别我们的ip地址为一个假的地址,从而实现伪地址登录。


重点php伪协议

1.file//
file://用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响

2.php://filter
通过filter模块可以直接读取到任何我们想要的源码的base64编码

3.php://input
将post请求中的数据作为PHP代码,执行浏览器中访问

4.data://
用于访问数据
payload:http://127.0.0.1/lab13.php?file=data:text/plain,%3C?php%20phpinfo()?%3

5.zip://
payload:http://127.0.0.1/ lab13.php?file=zip://C:\Users\yale\Desktop\test.zip%23zip.txt
简单来说就是直接读取zip文件

6.zlib://
payload
http://127.0.0.1/lab13.php?file=compress.zlib://C:\Users\yale\Desktop\zip.jpg

 

标签:web,00,函数,天网,后缀名,模块,绕过,php,变量
来源: https://www.cnblogs.com/lzwhehe/p/15417703.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有