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

PHP代码审计

时间:2024-03-24 18:34:08浏览次数:33  
标签:审计 __ PHP string 代码 phar filter 序列化 php

phps,可能可查看该php文件源码

index.php.bak:index.php文件备份名


php7.1+:类型不敏感,反序列化public属性可以直接赋给private


_GET

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

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

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

在url传参时,传入的值都会被当做字符串处理(/?id=0,0不是0,而是"0")


php传参问题

php<8.0时

传入的参数名中.空格都会被替换成下划线_

?a b.=1 --> 后端接收:a_b_=1;

如果参数中出现中括号[,中括号会被转换成下划线_,但是会出现转换错误导致接下来的非法字符不会继续转换成下划线_


sandBox&REMOTE_ADDR

$sandBox = md5($_SERVER['REMOTE_ADDR']);
if(!is_dir($sandBox)){
    mkdir($sandBox,0755,true);
}
if($_FILES){
    move_uploaded_file($_FILES['file']['tmp_name'],$sandBox."/".$_FILES["file"]["name"]);
    echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
    echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
    echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
    echo $sandBox;
}

highlight_file(__FILE__);

本地构造文件上传表单(记得改url):

<form action="http://7b9f6095-2fc9-49bd-804d-b717f89483de.www.polarctf.com:8090/" enctype="multipart/form-data" method="post" >
    
    <input name="file" type="file" />
    <input type="submit" />
   
</form>

提交后访问对应路径下文件即可


PHP弱类型

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

PHP特性的一些笔记-CSDN博客

MD5绕过

[CTF中常见php-MD5()函数漏洞_if((string)$_post'n']!==(string)$_post['o'] &&md5-CSDN博客

md5绕过(sql):ffifdyop


$_GET['name'] != $_GET['password']
MD5($_GET['name']) == MD5($_GET['password'])

md5加密后以0E开头:

QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a

a = QNKCDZO
md5(a) = 0e830400451993494058024219903391

b = 240610708
md5(b) = 0e462097431906509019562988736854

sha1加密后以0E开头:

sha1(‘aaroZmOk’)
sha1(‘aaK1STfY’)
sha1(‘aaO8zKZF’)
sha1(‘aa3OFF9m’)

数组进行md5加密后为NULL

if($_POST['param1']!==$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])

key1[]=1&key2[]=2


MD5强碰撞

if((string)$_GET['md5_1'] !== (string)$_GET['md5_2'] && md5($_GET['md5_1']) === md5($_GET['md5_2']))

要求传入两个MD5相同的不同字符串

md5_1=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
&
md5_2=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2


变量引用

两个变量同时指向同一个内存地址

$a->Polar1=&$a->Polar2;
$a->Night=&$a->Light;

让他们引用相同地址,获得相同的值


文件包含

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

include函数

:伪协议,文件上传

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


file_get_content

file_get_contents会将不存在的协议名作为目录实现目录穿越

if(preg_match('/cyictf\.com/',$url)){...}

payload:
?url=cyictf.com../../../../../flag

session文件包含

open_basedir是php.ini中的一个配置选项,它可将用户访问文件的活动范围限制在指定的区域

假设open_basedir=/var/www/html/:/tmp/,那么通过访问服务器的用户就无法获取服务器上除了/var/www/html/和/tmp/这两个目录以外的文件。

用open_basedir指定的限制实际上是前缀,而不是目录名,如: "open_basedir = /dir/user", 那么目录 “/dir/user” 和 "/dir/user1"都是可以访问的。所以如果要将访问限制在仅为指定的目录,请用斜线结束路径名


php伪协议


php://filter(过滤器)

php:

标签:审计,__,PHP,string,代码,phar,filter,序列化,php
From: https://www.cnblogs.com/xhzccy/p/18092775

相关文章