nepctf——web知识点小记~

本文探讨了原型的概念,包括对象的__proto__和函数的prototype,解释了原型链的工作机制。重点讲解了原型链污染的原理,通过对象merge和clone实例,揭示了如何通过控制__proto__属性实现污染,并介绍了RCE漏洞中的命令执行技巧。最后,提到了ThinkPHP框架简介和相关技术领域标签。

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

原型链污染

什么是原型?

  1. 所有引用类型都有一个__proto__(隐式原型)属性,属性值是一个普通的对象
  2. 所有函数都有一个prototype(原型)属性,属性值是一个普通的对象
  3. 所有引用类型的__proto__属性指向它构造函数的prototype

什么是原型链?

当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找,即它的构造函数的prototype。如果还没有找到就会再在构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链。

什么是原型链污染?

在一个应用中,如果攻击者控制并修改了一个对象的原型,那么将可以影响所有和这个对象来自同一个类、父祖类的对象。这种攻击方式就是原型链污染。只要能够控制数组(对象)的“键名”的操作就可以实现原型链污染。

原型链污染实例

  1. 对象merge(最常见)
    如果这个key是__proto__,就可以原型链污染(保证__proto__是一个key)。
    如果__proto__不是key,可以用JSON.parse()函数进行转化。如果在新建的对象中存在__proto__设置的属性,那么就说明object已经被污染。
    eg:
    let o2 = {a: 1, “proto”: {b: 2}},此时输出的是[a,b],__proto__被认为是原型。
    let o2 = JSON.parse(’{“a”: 1, “proto”: {“b”: 2}}’),此时“proto”是key。

  2. 对象clone

参考:
原型和原型链
原型链污染

PHP执行系统命令

使用``(反引号),反引号中间插代命令,执行系统命令,等价于shell_exec函数。
**shell_exec()**函数通过shell环境执行命令,并且将完整的输出以字符串的方式返回。
shell_exec(string $cmd):string 参数是cmd即要执行的命令
注意关闭了shell_exec()时反引号运算符是无效的。

RCE(远程命令/代码执行漏洞)

什么是RCE漏洞?
我们常见的路由器、防火墙、入侵检测等设备的web管理界面上,一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。其实这就是一个接口,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统,这就是RCE漏洞。

RCE全称为remote command/code execute,分为

  1. 远程命令执行ping
  2. 远程代码执行evel

出现漏洞原因:没有在输入口做输入处理

漏洞利用: 后端代码为$result.=shell_exec('ping '.$ip);,此时只有变量并且没有对变量做任何处理,所以我们就可以利用这个接口,将其它语句拼接上去。比如说:127.0.0.1 & net start就可以查到开启了哪些服务。

RCE在CTF中的解法:

  1. 命令执行
  2. 文件包含
    解题方法&各种绕过姿势
    参考博客:https://blog.youkuaiyun.com/qq_43814486/article/details/90020139

命令执行绕过方式
1.管道符
(1)“;”分号用法:command1;command2 //用“;”号隔开每个命令,每个命令按照从左到右的顺序,顺序执行,所有命令都会执行。
(2)“|”管道符用法:command1 | command2 //用“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。(可连续使用管道)
举个栗子:
利用一个管道:
# rpm -qa|grep licq
这条命令使用一个管道符“|”建立了一个管道。管道将rpm -qa命令的输出(包括系统中所有安装的RPM包)作为grep命令的输入,从而列出带有licq字符的RPM包来。

利用多个管道
# cat /etc/passwd | grep /bin/bash | wc -l
这条命令使用了两个管道,利用第一个管道将cat命令(显示passwd文件的内容)的输出送给grep命令,grep命令找出含有“/bin /bash”的所有行;第二个管道将grep的输出送给wc命令,wc命令统计出输入中的行数。这个命令的功能在于找出系统中有多少个用户使用bash
(3)“&”符号用法:command1 & //“&”放在启动参数后面表示设置此进程为后台进程(先执行
“&”之后的命令再执行“&”之前的命令)默认情况下,进程是前台进程,我们要进行后端交互的时候就可以通过添加"&"来实现
(4)“&&”符号用法:command 1 && command 2 //只有在“&&”左边的命令返回真(命令返回值 $? = = 0),&&右边的命令才会被执行。
(5)“| | ”符号用法: command 1 | | command 2 //只有在“| |”左边的命令返回假(命令返回值 $? = = 1),| |右边的命令才会执行
(6) 通过DNS管道解析
2.网络地址转换为数字地址 (绕过.的ip过滤)
网络地址有另外一种表示形式,就是数字地址比如127.0.0.1可以转化为2130706433,数字地址可以直接访问。

Think PHP框架简单介绍

什么是ThinkPHP?
ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式。
ThinkPHP可以支持windows/Unix/Linux等服务器环境,正式版需要PHP5.0以上版本支持,支持MySql、PgSQL、Sqlite多种数据库以及PDO扩展。
MVC框架即模型(M)、视图(V)、控制器(C)。
模型: 是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中库存数据。即表示应用程序核心(比如数据库记录列表)。模型的定义由Model类来完成。Model类位于项目目录下面的LibModel目录。
视图: 是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。模板的实现是和框架无关的,做到了100%分离,可以独立预览和制作。模板目录位于项目目录下面的Tpl目录。即显示数据(数据库记录)。
控制器:应用控制器(核心控制器)和Action控制器都承担了控制器的角色,区别在于Action控制器完成业务过程,而应用控制器(App类)负责调度控制。Action控制器位于项目目录下面的LibAction目录。即处理输入(写入数据库记录)。
ThinkPHP的目录结构

接入第三方登录是让用户方便快捷地使用已有账号登录你的网站或应用程序,提高用户体验的一种方式。本文将介绍如何使用 PHP 实现微信公众号第三方登录。 1. 获取微信授权 首先,需要获取微信用户的授权。具体步骤如下: 1)引导用户打开微信授权页面: ```php $appid = 'your_appid'; $redirect_uri = urlencode('http://yourdomain.com/callback.php'); $scope = 'snsapi_userinfo'; $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&redirect_uri=$redirect_uri&response_type=code&scope=$scope&state=STATE#wechat_redirect"; header("Location: $url"); ``` 其中,`$appid` 是你的微信公众号的 AppID,`$redirect_uri` 是授权后回调的 URL,`$scope` 是授权作用域,可以是 `snsapi_base` 或 `snsapi_userinfo`,`$state` 是自定义参数,用于防止 CSRF 攻击。 2)获取授权码: 用户同意授权后,会重定向到 `$redirect_uri` 指定的 URL,带上授权码 `code` 和 `state` 参数。 ```php $code = $_GET['code']; $state = $_GET['state']; ``` 3)获取 access_token 和 openid: 使用授权码 `code` 获取 `access_token` 和 `openid`。 ```php $access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appid&secret=$secret&code=$code&grant_type=authorization_code"; $response = file_get_contents($access_token_url); $result = json_decode($response, true); $access_token = $result['access_token']; $openid = $result['openid']; ``` 其中,`$secret` 是你的微信公众号的 AppSecret。 2. 获取用户信息 获取到 `access_token` 和 `openid` 后,可以使用以下代码获取用户信息: ```php $userinfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token=$access_token&openid=$openid&lang=zh_CN"; $response = file_get_contents($userinfo_url); $userinfo = json_decode($response, true); ``` 其中,`$userinfo` 包含用户的昵称、头像等信息。 3. 将用户信息保存到数据库 最后,将获取到的用户信息保存到数据库中,以便下次使用时快速登录。 ```php // 连接数据库 $con = mysqli_connect('localhost', 'username', 'password', 'database'); mysqli_set_charset($con, "utf8"); // 查询用户是否已存在 $sql = "SELECT * FROM users WHERE openid='$openid'"; $result = mysqli_query($con, $sql); if (mysqli_num_rows($result) == 0) { // 用户不存在,插入新用户信息 $nickname = mysqli_real_escape_string($con, $userinfo['nickname']); $headimgurl = mysqli_real_escape_string($con, $userinfo['headimgurl']); $sql = "INSERT INTO users (openid, nickname, headimgurl) VALUES ('$openid', '$nickname', '$headimgurl')"; mysqli_query($con, $sql); } // 保存用户登录状态 $_SESSION['openid'] = $openid; ``` 以上就是使用 PHP 实现微信公众号第三方登录的步骤。需要注意的是,为了确保安全性,应该对用户输入的数据进行过滤和验证,防止 SQL 注入和 XSS 攻击等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值