首页 > 编程语言 >PHP代码审计

PHP代码审计

时间:2023-10-30 18:44:05浏览次数:34  
标签:审计 __ php GET 代码 执行 调用 array PHP

函数用到时再去查用法


_GET

$_GET看成一个键值对数组(关联数组)

$_GET == array(‘id’=>1,‘name’=>‘xiao’)

函数引用 & 可以修改_GET....的值,不能修改_Request的值



PHP弱类型

https://www.cnblogs.com/Mrsm1th/p/6745532.html


文件包含

include()、require()、include_once()、require_once()

include函数

include()函数包含文件时会按路径./../../../../ffffllllaaaagggg来寻找文件

/i/l/?n=20&i=blog/2293037/202104/2293037-20210410174705799-1460846635.png



php://filter

:可查看被注释的php代码

/?file1=php://filter/read=convert.base64-encode/resource=flag.php

意思:用base64编码的方式来读文件flag.php(应该是先编码后给浏览器)

2:read/write

3:过滤器:字符串过滤器,转换过滤器,压缩过滤器,加密过滤器。filter里可以用一或多个过滤器(中间用|隔开)

4:处理的文件名

搭配函数:include()、require()、file_get_contents()、fopen()、readfile()、copy()、unlink()

如include(php://filter/read=convert.base64-encode/resource=flag.php),会将flag.php 包含进来

绕过:详解php://filter以及死亡绕过_w0s1np的博客-CSDN博客


变量覆盖

以下方法都会覆盖原来变量,且得到的变量都是全局变量

$$

/?a='b'
$$_GET['a'] = '456'
会创建一个全局变量 $b='456'


extract

提取内容变成全局变量
$arr = array('a'=>1,'b'=>2);
extract($arr)
会设置全局变量$a=1 $b=2


parse_str

parse_str("name=pe&id=1");
设置全局变量$name=pe $id=1;



任意代码执行

eval

eval(),执行括号内的语句
例1:eval(_GET('cmd'));
/?cmd=phpinfo(),就会打印出php版本界面,一般这个cmd是一个很复杂的字符串

例2:$data=$_GET['data'];
eval("$ret = strtolower('$data');");
构造/?data=haha');phpinfo();// 后成功执行phpinfo
eval 执行字符串时,会直接执行语句,且设置全局变量
原语句:$ret = strtolower(' haha'); phpinfo(); // ')
通过 ' ) 闭合语句,//注释后面没用的东西


assert

assert(GET('cmd'));
/?cmd=phpinfo(),就会打印出php版本界面
可拆分后组成:$a="a"; $b="ss"; $c="ert";
$d=$a.$b.$c; $d(Request['cmd'])


preg_replace()

第一个参数:正则表达式
第二个参数:匹配成功后替换的内容,如果是//0则是替换整个第一个参数,//1表示替换( )里的通配
第三个参数:用来匹配的内容

利用条件:
第三个参数可控
正则表达式后即/ /后用e(代表会执行正则表达式替换后的内容)


create_function()

第一个参数相当于函数的传参
第二个参数相当于函数体
$return_str ='return $a +$b;';
$func = create_function( '$a, $b', $return_str);


array_map()

第一个参数为执行函数
第二个参数为数组
从数组中顺序取值丢给函数执行


array_filter()

第一个传数组,第二个为执行函数
从数组中顺序取值丢给函数执行


call_user_func()

第一个参数传函数名,第二个参数传给函数的值


更多

call_user_func_array()
call_user_func()
array_filter() 
array_walk() array_map()
registregister_shutdown_function()
register_tick_function()
filter_var() 
filter_var_array() 
uasort() 
uksort() 
array_reduce()
array_walk() 
array_walk_recursive()


命令执行

system()

有回显:在命令行执行括号命令


passthru(),exec()

passthru()有回显,exec()回显最后一行,echo输出:执行括号命令,放到一个数组中,php用echo输出内容


shell_exec()

无回显,必须输出


l先判断执行后面,ll先判断执行前面
可构造()l恶意代码ll()(不确定)


反引号``

$a = _GET['a']; echo (`$a`); 构造/?a=dir 会直接执行命令


ob_start()

参数为字符串,是执行其他内容的函数
ob_start(“system”); echo “whoami”;ob_end_flush();
echo把内容输入进一个缓冲区等待执行(缓存区满再一次性执行),ob_end_flush()强制清空执行


popen()

打开文件
需自己手工去指向的区域输出内容
/?command = dir;
$command = $_GET['command']; $handle = popen($command,"r");//打开文件
while(!feof($handle)) echo fread($handle,1024); //读取文件,把command看成文件


proc_open()



php魔术方法

__sleep()

__sleep()返回一个数组,表示想序列化的变量
serialize()执行前先查找该对象是否有__sleep()方法,有的话先调用__sleep()


__wakeup()

unserialize()执行前先查找该对象是否有__wakeup()方法,有的话先调用__wakeup()


__construct()

具有构造函数的类会在每次创建新对象时先调用此方法,初始化工作执行。(构造方法


__destruct ()

对象的所有引用都被删除或者当对象被显式销毁时执行。(析构方法


__toString()

当一个类的实例对象;被当成一个字符串输出时调用
class a{
__toString(){};
};
$obj = new a();
echo $obj; 会调用__toString()


更多

  1. __call()在对象中调用一个不可访问方法时,call() 会被调用。
  2. __callStatic()在静态上下文中调用一个不可访问方法时,callStatic() 会被调用。
  3. __set() 在给不可访问的属性赋值时调用
  4. __get() 读取不可访问的属性值是自动调用
  5. __isset() 当对不可访问的私有属性使用isset或empty时自动调用
  6. __unset() 当对不可访问的私有属性使用unset时;自动调用

反/序列化

serialize($a):序列化a,原本用于传输数据时节省空间

class stu{
public $name="ccy";
protected $group=10;
private $age;
}
O:3:"stu":3:{s:4:"name";s:3:"ccy";s:8:"*group";i:10;s:8:"stuage";N;}
O代表object类,3表示类名长度,3说明类中三个成员变量,s是string,i是int,N是null;里面的顺序是((类型、后面字段长度)变量名,值)

public的变量名长度不变,protected的变量名会在前面加上 %00*%00 ,private的变量名会在前面加上 %00stu%00,stu是类名(反序列化时记得加上)


$obj = "O:3:"stu":3:{s:4:"name";s:3:"ccy";s:8:"*group";i:10;s:8:"stuage";N;}"

unserialize(&obj) 反序列化出一个对象,(如果有__destruct(),销毁时也会像个对象一样调用)。


函数

htmlspecialchars()

将特定字符转义成HTML实体
主要<>,过滤xss


htmlspecialchar_decode()

又将HTML实体转换成字符
"&lt;" --> "<" 和 "&gt;" --> ">"
可能引入xss


addslashes()

' "前添加反斜杠\,过滤sql注入


stripslashes()

删除addslashes添加的 \
可能引入sql注入


in_array()

判断值是否在数组中,如果第三个参数为true,代表要区分大小写,没有则不用


strcmp()

当字符串和数组比较时,返回0


标签:审计,__,php,GET,代码,执行,调用,array,PHP
From: https://www.cnblogs.com/xhzccy/p/17798550.html

相关文章

  • 低代码开发是不是“简易低智”的玩具?看这篇就够了
        低代码的概念自2014年由研究机构Forrester提出以来,已经在国外市场逐渐成熟,形成了稳定的商业模式。而在国内,从2018年开始,这一理念逐渐受到广泛关注,尽管初期伴随着一些质疑的声音,如“简易低智”、“新瓶旧酒”等批评,甚至有观点认为这只是一些“外包公司”贴上的新标签。......
  • 【JAVA】我们该如何规避代码中可能出现的错误?(二)
    个人主页:【......
  • macbook m1 连接gerrit ssh 拉去代码不成功
    记录一下,折腾了一早上~mac系统:macOSSonoma14.0openssh:9.3问题描述:拉代码:gitclone"ssh://XXXX/"报错了:Cloninginto'autotest'[email protected]:Permissiondenied(publickey).fatal:Couldnotreadfromremoterepository.Pleasemakes......
  • PHP 多文件上传功能实例讲解
    PHP文件上传功能是非常普片的需求,而在网站开发过程中,我们可以需要同时上传多个文件,这个时候就需要开发出php多文件上传的功能。在本教程中,我将向您展示如何使用PHP实现多个文件上传。 HTML代码首先,您需要创建一个属性为 enctype='multiple/form-data'的HTML表单。实际上......
  • vsCode格式化代码最优解
    1,设置->搜索vetur.format.defaultFormatter.html->选择js-beautify-html2.打开文件首选项设置点击右上角的文档图标随便找个地儿加上这段代码"vetur.format.defaultFormatterOptions":{"js-beautify-html":{"wrap_line_length":120,"wrap_attributes":......
  • 代码随性训练营第十七天(Python)| 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之
    110.平衡二叉树1、递归法classSolution:defisBalanced(self,root:Optional[TreeNode])->bool:ifself.get_height(root)!=-1:#-1代表高度差大于1returnTrueelse:returnFalsedefget_height(self,root):......
  • 低代码,工业4.0的强力支持者
    工业4.0代表了制造业的一场革命,它将数字化、智能化和自动化引入了制造流程,重新定义了生产方式和企业运营。在这个数字时代,低代码技术崭露头角,成为工业4.0的强力支持者。本文将探讨低代码技术与工业4.0之间的紧密联系,以及它们如何协同推动制造业的数字化转型。工业发展的不同阶段工......
  • java web jsp 分页显示代码
    <%@pagelanguage="java"contentType="text/html;charset=gb2312"pageEncoding="gb2312"%><%@pageimport="java.sql.*,chap03.*"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN&qu......
  • 当java文件被加密时候,通过.class文件查看代码
    使用jadx-gui.exe工具,或者jd-gui.exe工具查看  ......
  • 如何将本地代码上传到github远程仓库?
    在本地建立目录,将想上传的代码放到该文件夹中gitinit###初始化gitadd.###将本地项目工作区的所有文件添加到暂存区gitcommit-m"excu"###将暂存区的文件提交到本地仓库gitremoteaddoriginhttp://github.com/用户名/仓库名.git###将......