原型链污染
什么是原型?
- 所有引用类型都有一个__proto__(隐式原型)属性,属性值是一个普通的对象
- 所有函数都有一个prototype(原型)属性,属性值是一个普通的对象
- 所有引用类型的__proto__属性指向它构造函数的prototype
什么是原型链?
当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找,即它的构造函数的prototype。如果还没有找到就会再在构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链。
什么是原型链污染?
在一个应用中,如果攻击者控制并修改了一个对象的原型,那么将可以影响所有和这个对象来自同一个类、父祖类的对象。这种攻击方式就是原型链污染。只要能够控制数组(对象)的“键名”的操作就可以实现原型链污染。
原型链污染实例
-
对象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。 -
对象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,分为
- 远程命令执行ping
- 远程代码执行evel
出现漏洞原因:没有在输入口做输入处理
漏洞利用: 后端代码为$result.=shell_exec('ping '.$ip);
,此时只有变量并且没有对变量做任何处理,所以我们就可以利用这个接口,将其它语句拼接上去。比如说:127.0.0.1 & net start
就可以查到开启了哪些服务。
RCE在CTF中的解法:
- 命令执行
- 文件包含
解题方法&各种绕过姿势
参考博客: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的目录结构