web新手任务

本文介绍了如何利用Git文件泄露进行信息恢复,并探讨了PHP中的变量覆盖问题,包括$$、extract()、parse_str()和import_request_variables()的不当使用。还讲解了PHP预定义变量、运算符和常见编码方式,如HEX、MD5、BASE32/64、URLENCODE和UNICODE。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内容:
1.学会利用 /.git 文件泄露,/.DS_Store下载地址根据自己配置的环境选择
py2: https://github.com/lijiejie/GitHack
py3: https://github.com/WangYihang/GitHacker
py2:https://github.com/lijiejie/ds_store_exp
py3:https://github.com/gehaxelt/Python-dsstore
2.查看 PHP 官方文档,在前两次对 PHP 学习的基础上,利用代码实现变量覆盖;同时查看预定义变量,重点看一下 $_SERVER $_GET $_POST $_REQUEST (思考一下如果 G E T 和 GET 和 GETPOST 同时对某一变量传参,浏览器最终会选择哪一种方式传的值)
3.学习运算符的相关内容,重点看位运算符、比较运算符和执行运算符
4.熟悉常见的编码方式:hex md5 base32/64 urlencode unicode


git文件泄露

Git是版本控制的一种
管理所有文件和修改历史,实现多人开发。
主要就是分布式版本控制:
所有版本信息仓库都同步到本地每个用户,每个用户都能在本地查看所有版本历史,并可以离线提交,只需要联网的时候放到相应的服务器和其他用户手中。
好处:不会担心因为一个服务器的故障而缺失数据。
弊端:有安全隐患。
当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。攻击者可以利用该漏洞下载git文件夹里的所有内容。如果文件夹内有敏感信息比如站点源码、数据库账户密码等,攻击者可能直接控制服务器。

信息恢复–GitHack

GitHack会自动恢复
Githack是一个.git泄露利用脚本,通过泄露的.git文件夹下的文件,还原重建工程源代码

脚本工作原理

解析.git/index文件,找到工程中所有的: ( 文件名,文件sha1 )
去.git/objects/ 文件夹下下载对应的文件
使用zlib解压文件,按原始的目录结构写入源代码
它的优点

  1. 速度快,默认20个工作线程
  2. 尽量还原所有的源代码,缺失一部分文件不影响脚本工作
  3. 脚本不需要执行额外的git命令,有python就够了
    可能的改进

存在文件被gc打包到git\objects\pack的情况,稍后可测试下看能否直接获取并解压这个文件,还原源代码
版权声明:本文为优快云博主「kkey0930」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/xy_sunny/article/details/107620695


PHP


变量覆盖

变量覆盖指的是可以用我们的传参值替换程序原有的变量值
Eg.设 a = 1 , 利 用 g e t 方 式 传 一 个 a = 6 , 则 有 变 量 覆 盖 的 话 6 就 会 覆 盖 掉 原 来 程 序 有 的 a=1,利用get方式传一个a=6,则有变量覆盖的话6就会覆盖掉原来程序有的 a=1,geta=6,6a=1
经常导致变量覆盖漏洞场景有
1、$$使用不当
2、extract()函数使用不当
3、parse_str()函数使用不当
4、import_request_variables()使用不当,开启了全局变量注册等。
变量覆盖漏洞有的时候可以直接让我们获取Webshell,拿到服务器的权限
补:webshell是什么
在计算机科学中,Shell 俗称壳(用来区别“核”),是指“为使用者提供操作界面”的软件(命令解释器)。类似于windows 系统给的cmd.exe 或者Linux 下bash/sh 等,虽然这些系统的命令解释器不止一种。
WebShell 是一个网站的后门,也是一个命令解释器,不过是以Web 方式(HTTP 协议)通信(传递命令消息),继承了Web 用户的权限。WebShell 本质上是服务器端可运行的脚本文件,后缀名为.php/.asp/.aspx/.jsp 等,也就是说WebShell 接受来自于Web 用的命令,然后在服务器端执行。
————————————————
版权声明:本文为优快云博主「beglage」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/weixin_43252204/article/details/111033698

$$
$$就是将之前定义的变量的值重新定义新的变量

Eg
解析: $ $ a= $ ( $ a)=$b=”c”

extract()函数

extract()函数的作用:将数组中的变量导入到当前的符号表
首先必须要传一个数组
在这里插入图片描述
注:A,b,c,为三个键值赋值给一个变量my-array
所以在这里应该就是变量覆盖将 a 赋 值 c a t 输 出 变 量 a 原 来 是 1 但 变 成 了 c a t 运 行 结 果 : ‘ a赋值cat 输出变量a原来是1但变成了cat 运行结果: ` acata1cat a = Cat; $b = Dog; $c = Horse`;

简单理解来就是把数组中的键赋值成变量,值赋值给变量
不让他被变量覆盖的办法
在不合法或数字变量名前加前缀加pr
也就是在extract( $ my_array);
后加prextract($ my_array,’pr’);

echo "\ $ a = $a; \ $ b = $b; \ $ c = $c";//a前加pr:
echo $ pr-a
Parse-slr()使用不当

在这里插入图片描述

假如加一个

$name=’lin92n’;

在这里插入图片描述
又假如去掉数组
在这里插入图片描述

因为这里相当于$name=’stem’; $ age=’25’虽然从没定义过这个age但通过那个函数使age拥有赋值

import_request_variables()函数

import_request_variables()函数作用是将 GET/POST/Cookie 变量导入到全局作用域中在当前文件可全局调用进行传参。

<?php
$a = 1;
foreach(array('_COOKIE','_POST','_GET') as $_request) {
foreach($$_request as $_key=>$_value) 
{$$_key=addslashes($_value);}}
echo $a;
?>

这里也是一个简单的foreach as 遍历数组将数组的字符串放入 $ _request中去再重新遍历键值分离 $ $ _request成了 $ _COOKIE $ _POST $ _GET 超全局变量接受传参那么这里就成了 $ _key=>$_value 如果我们传参a=123456

$ $ _key=addslashes($ _value);
这句就是吧$ _key重新使用了$ $ 来赋值转义给$ _value 就成了$a=123456

输出的$a也就是123456了。这里就造成了简单的变量覆盖漏洞。
————————————————————————————————————————————————————
版权声明:本文为优快云博主「-stem-」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_33441500/article/details/103041569


——————————————————————————————————————————————————————
本图作者: r0ya1
本图链接: http://r0ya1.gitee.io/r0ya1/2021/03/04/web_sec/web_vul/%E5%8F%98%E9%87%8F%E8%A6%86%E7%9B%96/%E5%8F%98%E9%87%8F%E8%A6%86%E7%9B%96/

预定义变量

对于全部脚本而言,PHP 提供了大量的预定义变量。这些变量将所有的外部变量表示成内建环境变量,并且将错误信息表示成返回头。
超全局变量 — 超全局变量是在全部作用域中始终可用的内置变量
** $GLOBALS** — 引用全局作用域中可用的全部变量
** $_SERVER** — 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。
** $_GET** — HTTP GET 变量通过 URL 参数(又叫 query string)传递给当前脚本的变量的数组。 注意:该数组不仅仅对 method 为 GET 的请求生效,而是会针对所有带 query string 的请求。
** $_POST** — HTTP POST 变量当 HTTP POST 请求的 Content-Type 是 application/x-www-form-urlencoded 或 multipart/form-data 时,会将变量以关联数组形式传入当前脚本。
** $ _REQUEST**默认情况下包含了 $_GET, $_POST 和 $_COOKIE 的数组。

**Q:**如果 $ _GET 和$ _POST 同时对某一变量传参,浏览器最终会选择哪一种方式传的值
$ GET 请求指定的页面信息,并返回实体主体
P O S T 向 指 定 资 源 提 交 数 据 进 行 处 理 请 求 ( 例 如 提 交 表 单 或 者 上 传 文 件 ) 。 数 据 被 包 含 在 请 求 体 中 。 P O S T 请 求 可 能 会 导 致 新 的 资 源 的 建 立 和 / 或 已 有 资 源 的 修 改 。 所 以 我 认 为 浏 览 器 应 该 会 选 择 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 所以我认为浏览器应该会选择 POSTPOST/ GET,因为$POST可能会对原变量造成影响

运算符

位运算符

在这里插入图片描述

赋值运算符

基本的赋值运算符是“=”。一开始可能会以为它是“等于”,其实不是的。它实际上意味着把右边表达式的值赋给左边的运算数。

赋值运算表达式的值也就是所赋的值。也就是说,“$a = 3”的值是 3。

引用运算符

引用赋值
PHP 支持引用赋值,使用“KaTeX parse error: Expected 'EOF', got '&' at position 7: var = &̲othervar;”语法。引用赋值意味着两个变量指向了同一个数据,没有拷贝任何东西。
在这里插入图片描述

比较运算符

在这里插入图片描述

执行运算符

PHP 支持一个执行运算符:反引号(``)。注意这不是单引号!PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回(即,可以赋给一个变量而不是简单地丢弃到标准输出)。使用反引号运算符“`”的效果与函数 shell_exec() 相同。
在这里插入图片描述

逻辑运算符

在这里插入图片描述

字符串运算符

有两个字符串(string)运算符。第一个是连接运算符(“.”),它返回其左右参数连接后的字符串。第二个是连接赋值运算符(“.=”),它将右边参数附加到左边的参数之后。更多信息见赋值运算符。
在这里插入图片描述

常见编码方式

文字符号采用一定位数的二进制数码表示,这种特定的二进制码称为代码,建立这种代码与十进制数值、字母、符号的一一对应关系叫编码

HEX

首先,二进制文件通常不易于人看,因为人会看眼花,所以必须转为其他进制,16进制是最好的,刚好2字符表示一个字节
Hex编码是以4比特作为一个单位编码,用4是因为计算机进位是2的倍数,而为了能把比特串分割开来,最适中就是取16进制;所以Hex编码就是16进制编码;
在这里插入图片描述

————————————————
版权声明:本文为优快云博主「smilejiasmile」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/smilejiasmile/article/details/96311277

MD5

MD5的实际应用是对一段Message(字节串)产生fingerprint(指纹),可以防止被"篡改"。广泛用于加密和解密技术上,在很多操作系统中,用户的密码是以MD5值(或类似的其它算法)的方式保存的,用户Login的时候,系统是把用户输入的密码计算成MD5值,然后再去和系统中保存的MD5值进行比较,来验证该用户的合法性。
MD5编码后显示为一串128bit的特征码,即长度为32的字符串

BASE32/64编码

1.首先将 字符串中的每个字符转为对应于 Ascii 编码表的值
2.将第一步中的 Ascii 值分别转为对应的二进制格式,要求必须是形成8 个 bit,不足8比特位高位补0。例如:1 的二进制是 1,明显不够8位,最终应该显示为:0000 0001。
3.根据base X(这里的 X 代表 16,32,64等编号) 编码算法中所指定的y 个 bit 位为一个字符在表格中的下标 的规则,对第2步的进行划分.
4.将第三步中划分出的每个部分进行10进制转换,得出对应于10进制数的下标值
5.最后一步,将第4步中得出的下标数去查表,得出对应的字符,连在一起,就是编码结果

base32/64是无法完全整数划分的,会出现不能除尽在最终结果后面补充等于号"="符号的情况
补全的限制,拿base32 来说,因为每5位表示一个字符下标值,而原始数据是8位,这就意味着,划分会出现剩下的情况,例如:
8 - 5 = 3,明显有3个 bit 位剩下,那么至少要多少个位才能满足步出现剩下的呢?这是一个最小公倍数问题,就是: 5*8 = 40 位。我们可以验证一下,当两个字符的时候,是16位,16/5 = 1,以此类推。

最终,得出在 base32 的编码中,待编码数据至少要 >= 40 位,其最终的编码结果才能不出现 = 号。例如要被编码的字符是3,很明显,它的结果是:D=======,后面的 = 都是补全的。

同理,base64 的是至少 24 位,24 是 6 和 8 的最小公倍数。
在这里插入图片描述
base32编码表在这里插入图片描述
base36编码表
在这里插入图片描述

URLENCODE编码

URL编码(URL encoding),也称作百分号编码(Percent-encoding), 是特定上下文的统一资源定位符 (URL)的编码机制。
将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式。
比如:
ASCII码是-10544,对应的16进制是D6D0,那么urlencode编码结果是:%D6%D0
部分特殊符号转换规则
在这里插入图片描述

UNICODE编码

Unicode码扩展自ASCII字元集。在严格的ASCII中,每个字元用7位元表示,或者电脑上普遍使用的每字元有8位元宽;而Unicode使用全16位元字元集。Unicode能够表示世界上所有的书写语言中可能用於电脑通讯的字元、象形文字和其他符号。
Unicode只有一个字符集,中、日、韩的三种文字占用了Unicode中0x3000到0x9FFF的部分 Unicode目前普遍采用的是UCS-2,它用两个字节来编码一个字符, 比如汉字"经"的编码是0x7ECF,注意字符编码一般用十六进制来 表示,为了与十进制区分,十六进制以0x开头,0x7ECF转换成十进制 就是32463。

flag的各种编码如下:
HEX:666C6167
BASE32:mzwgczy=
BASE64:ZmxhZw==
MD5: 327a6c4304ad5938eaf0efb6cc3e53dc
unicode:\u0066\u006c\u0061\u0067

admin的各种编码:
HEX:61646D696E
BASE32:Omfsg22lo
BASE64:YWRtaW4=
md5:21232f297a57a5a743894a0e4a801fc3
unicode:\u0061\u0064\u006d\u0069\u006e

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值