代码审计之弱类型,变量覆盖,伪协议

 

1.弱类型

2.了解变量覆盖漏洞

3.了解PHP伪协议

File://协议

php://filter

php://input

php://output

data://

zip://, bzip2:/, zlib://协议

 


弱类型

==与===:

<?php
$a == $b;
$a === $b;
?>

php中有两种比较的符号==与===

==在进行比较的时候,会先将字符串类型转化成相同,再比较
===在进行比较的时候,会先判断两种字符串的类型是否相等,再比较
如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行

<?php
var_dump("1admin" == 1);
?>

//输出true


<?php
var_dump("admin1" == 1);
?>
//输出false

php弱类型代码审计学习链接

 了解变量覆盖漏洞

自定义的参数值替换原有变量值的情况称为变量覆盖漏洞
经常导致变量覆盖漏洞场景有: $使用不当,extract()函 数使用不当parse_ str()函数使用不当,
import_ request _variables()使用不当,开启了全局变量注册等。

  • 全局变量覆盖
  • extract()变量覆盖
  • 遍历初始化变量
  • import_ request_ variables变 量覆盖
  • parse_ str()变量覆盖

一、全局变量覆盖(PHP5.3.0废弃,PHP5.4.0移除)
当register_ global=ON时,变量来源可能是各个不同的地方,比如页面的表单,Cookie等 。


<?php
echo "Register_ globals: ".(int)ini_ get("register_globals')."<br/>";
if ($auth){
echo " private!"; 
?>
<?php
echo "Register_ globals:" .(int)ini get("register_ globals')."<br/>";
if (ini get('register_ globals' )) foreach($_ REQUEST as $k=> $v) unset(${$k});
print $a;
print $_GET[b];
?>

二、extract()变量覆盖
PHP extract()函数从数组中把变量导入到当前的符号表中。对于数组中的每个元素,键名用于变量名,键值用于变量值。
 

<?php
$auth = '0';
extract($_GET);
if($auth==1){
echo "private!";
}else{
echo "public!";
?>

三、遍历初始化变量($$变量覆盖)
常见的一些以遍历的方式释放变量的代码,可能会导致变量覆盖。

$a = "hello";
$b = "a";
$$b = "world";
echo "$a";


//输出word

四、import_ request variables变量覆盖
import request variables('G') 指定导入GET请求中的变量,从而导致变量覆盖。

<?php
$auth = '0';
import_request_variables("G'); 
	
if($auth == 1){
	echo "private!";
}else{
	echo "public!";
}
?>

通过添加cookie值:auth=1从而导致变量覆盖

五、parse_ str()变量覆盖
parse_str—— 将字符串解析成多个变量,如果参数str是URI传递入的查询字符串(query string),则将它解析为变量并设置到当前作用域。

 

 

了解PHP伪协议


php流Streams、包装器wrapper
流Streams这个概念是在php4.3引进的,是对流式数据的抽象,用于统一数据操作,比如文件数据、网络数据、压缩数据等,以使可以共享同一套函数。


流是对数据的抽象,它不管是本地文件还是远程文件还是压缩文件等等,只要来的是流式数据,那么操作方式就是一样的有了流这个概念就引申出了包装器wrapper这个概念,每个流都对应一种包装器,流是从统一操作这个角度产生的一个概念,而包装器呢是从理解流数据内容出发产生的一个概念,也就是这个统一的操作方式怎么操作或配置不同的内容;这些内容都是以流的方式呈现,但内容规则是不一样的,比如http协议传来的数据是流的方式,但只有http包装器才理解http协议传来的数据的意思。
流就是一根流水的管子,只不过它流出的是数据,包装器就是套在流这根管子外层的一个解释者,它理解流出的数据的意思,并能操作它。官方手册说:“一个包装器是告诉流怎么处理特殊协议或编码的附加代码”

PHP默认的支持了一些协议和包装器,请用stream get _wrappers()函数查看.也可以自定义一个包装器,用stream_ wrapper_ register()注册。
php只允许://,所以ur|使 用"scheme://target'这样的格式

file://     访问本地文件系统       //allow_ url fopen和allow_ url_ include双Off情况下可正常使用
http://     访问HTTP(s)网址
ftp://      访问FTP(s)URLS
php://      访问各个输入/输出流(I/O streams)  //不需要开启allow_url_fopen(仅php//input,php://stdin,php://memory和php://temp需要allow_url_include=On)

zlib://         压缩流//双Off条件下可使用
data:://        数据(RFC 2397)//双On
glob:://        查找匹配的文件路径模式
phar://         PHP归档
ssh2://         Secure Shell 2
rar://          RAR
ogg://          音频流
expect://       处理交互式的流

File://协议

  • PHP.ini:
  • file://协议在双off的情况下也可以正常使用;
  • allow_url_ fopen : off/on
  • allow_url_ include: off/on
  • file://用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_ url_ fopen 与allow_ url_ include的影响
  • file:// [文件的绝对路径和文件名]
<?php
if(isset($_GET['page']))
{
    include $_GET['page'];
}
?>

php://filter

php://filter是一种元封装器,设计 用于数据流打开时的筛选过滤应用。这对于一体式(all-in-one) 的文件函数非常有用,类似readfile()、file() 和file_ _get. _contents(), 在 数据流内容读取之前没有机会应用其他过滤器。

Resource= <要过滤的数据流>        这个参数是必须的。它指定了你要筛选过滤的数据流。
read=<读链的筛选列表>             该参数可选。可以设定一个或多个过滤器名称,以管道符(|) 分隔。
write=<写链的筛选列表>            该参数可选。 可以设定一个或多个过滤器名称,以管道符(|) 分隔。
<;两个链的筛选列表>               任何没有以read=或write=作前缀的筛选器列表会视情况应用于读或写链。

http://localhost/test/6.php?page=php://filter/read=convert.base64-encode/resource=C:\phpstudy\WWW\phpinfo.php

读取到的文件是base64,解码即可

 

过滤器:过滤器有很多种, 有字符串过滤器、转换过滤器、压缩过滤器、加密过滤器

字符串过滤器
string.rot13
进行rot13转换
string.toupper
将字符全部大写
string.tolower
将字符全部小写
string.strip_tags
去除空字符、HTML和PHP标记后的结果。
功能类似于strip_tags()函数,若不想某些字符不被消除,后面跟上字符,可利用字符串或是数组两种方式

php://input

php://input是个可以访问请求的原始数据的只读流,可以读取到post没有解析的原始数据,将post请求中的数据作为PHP代码执行。因为它不依赖于特定的php.ini 指令。
注: enctype="multipart/form-data" 的时候php://input是无效的
allow_url_fopen: off/on
allow_url_include: on

<?php 
echo file_get_contents($_GET"a"]);
?>

<?php
$test=$_GET['a'];
include($test);
?>


http://127.0.0.1/1.php?a=<?php phpinfo();?>

php://output

是一个只写的数据流,允许你以print 和echo一样的方式写入到输出缓冲区。

<?php
$code=$_GET["a"];
file_put_contents($code,"test' );
?>

data://

data:

  • 资源类型;编码,内容
  • 数据流封装器
  • 当llow_ url include 打开的时候,任意文件包含就会成为任意命令执行

PHP ini:

  • data://协议必须双在on才能正常使用;
  • allow_url_fopen : on
  • allow_url_include: on
  • php版本大于等于php5.2
<?php
$filename=$_GET["a"];
include("$filename');
?>


http://127.0.0.1/test.php?a=data://text/plain, <?php phpinfo();?>

http://127.0.0.1/test.php?a=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+

zip://, bzip2:/, zlib://协议

PHP.ini:

  • zip://, bzip2://, zlib://协议在双off的情况下也可以正常使用;
  • allow url fopen : off/on
  • allow url include: off/on

3个封装协议,都是直接打开压缩文件。

  • co.mpress. zib://file.gz -处理的是'.gz'后缀的压缩包
  • compress. bzip2://file.bz2 -处理的是'.bz2' 后缀的压缩包
  • zip://archive.zip#dir/file.txt -处理的是':zip' 后缀的压缩包里的文件
  • zip://, bzip2://, zlib://均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名。
hello.zip内容为test.txt

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文件包含(LFI)和远程文件包含(RFI)是一种常见的安全漏洞,允许攻击者在应用程序中包含恶意文件或代码。LFI漏洞是指应用程序中允许用户通过文件包含功能来读取本地文件的漏洞。而RFI漏洞则是指应用程序中允许用户通过远程URL来包含外部文件的漏洞。这两种漏洞都可能导致攻击者获取敏感信息或者执行恶意代码。 伪协议编码算法是一种常见的技术,用于绕过安全控制并执行特定的操。在这里提到的伪协议包括"php://filter"和"convert.base64-encode/decode"。通过使用这些伪协议,攻击者可以对文件进行编码和解码,从而绕过安全限制。 代码审计是一种评估应用程序源代码的过程,旨在发现潜在的安全漏洞和其他问题。通过仔细分析应用程序的代码,可以确定是否存在可能导致文件包含漏洞或其他安全问题的缺陷。 总结起来,文件包含漏洞和远程文件包含漏洞是一种常见的安全漏洞,可以通过伪协议编码算法来绕过安全限制。代码审计是一种评估应用程序源代码的方法,可以帮助发现和修复这些漏洞。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [WEB攻防-通用漏洞&文件包含&LFI&RFI&伪协议编码算法&代码审计](https://blog.csdn.net/m0_65336233/article/details/127363413)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [day42 文件包含&LFI&RFI&伪协议编码算法&代码审计](https://blog.csdn.net/hesysd/article/details/128248212)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值