PHP代码审计分段讲解(14)
30题利用提交数组绕过逻辑
本篇博客是PHP代码审计分段讲解系列题解的最后一篇,对于我这个懒癌患者来说,很多事情知易行难,坚持下去,继续学习和提高自己。
源码如下:
<?php
$role = "guest";
$flag = "flag{test_flag}";
$auth = false;
if(isset($_COOKIE["role"])){
$role = unserialize(base64_decode($_COOKIE["role"]));
if($role === "admin"){
$auth = true;
}
else{
$auth = false;
}
}
else{
$role = base64_encode(serialize($role));
setcookie('role',$role);
}
if($auth){
if(isset($_POST['filename'])){
$filename = $_POST['filename'];
$data = $_POST['data'];
if(preg_match('[<>?]', $data)) {
die('No No No!'.$data);
}
else {
$s = implode($data);
if(!preg_match('[<>?]', $s)){
$flag='None.';
}
$rand = rand(1,10000000);
$tmp="./uploads/".md5(time() + $rand).$filename;
file_put_contents($tmp, $flag);
echo "your file is in " . $tmp;
}
}
else{
echo "Hello admin, now you can upload something you are easy to forget.";
echo "<br />there are the source.<br />";
echo '<textarea rows="10" cols="100">';
echo htmlspecialchars(str_replace($flag,'flag{???}',file_get_contents(__FILE__)));
echo '</textarea>';
}
}
else{
echo "Sorry. You have no permissions.";
}
?>
首先给出了$role和$auth的初始值
$role = "guest";
$auth = false;
如果在COOKIE中没有传值的话,就会进入else,将初始值设定在COOKIE里
else{
$role = base64_encode(serialize($role));
setcookie('role',$role);
}
从后面的逻辑上看,我们需要令
$auth=true
所以需要手动传入role值,通过逻辑
if(isset($_COOKIE["role"])){
$role = unserialize(base64_decode($_COOKIE["role"]));
if($role === "admin"){
$auth = true;
}
else{
$auth = false;
}
}
这里对传入的 role 进行base64解密后反序列化,将结果赋值给$role
$role = unserialize(base64_decode($_COOKIE["role"]));
然后想要令
$auth=true
前提条件为:
$role === "admin"
这个是我们可以控制的
编写代码
<?php
$role='admin';
$role1=base64_encode(serialize($role));
echo $role1;
?>
得到
role=czo1OiJhZG1pbiI7
可以看到成功绕过了第一个点
继续往下看
当 $auth 为 true的时候,进行:
if(isset($_POST['filename'])){
$filename = $_POST['filename'];
$data = $_POST['data'];
if(preg_match('[<>?]', $data)) {
die('No No No!'.$data);
}
else {
$s = implode($data);
if(!preg_match('[<>?]', $s)){
$flag='None.';
}
$rand = rand(1,10000000);
$tmp="./uploads/".md5(time() + $rand).$filename;
file_put_contents($tmp, $flag);
echo "your file is in " . $tmp;
}
}
可以看出来是上传文件的代码,具体为:
传入文件名和文件内容:filename 和 data
if(isset($_POST['filename'])){
$filename = $_POST['filename'];
$data = $_POST['data'];
判断$data中是否有一句话木马标识,有的话则退出
if(preg_match('[<>?]', $data)) {
die('No No No!'.$data);
}
没有的话 else 结构,这里有一句
$s = implode($data);
应该是上传一句话木马的突破点。
关于 implode()函数,有:
定义:
implode()函数返回由数组元素组合成的字符串
示例:
<?php
$arr = array('Hello','World!','Beautiful','Day!');
echo implode(" ",$arr);
?>输出:
Hello World! Beautiful Day!
而我们在前面的代码审计中,知道preg_match()函数只能处理字符串,当传入的变量是数组是会返回false,这里正好满足,可以编写代码测试
<?php
$data[]='<?php phpinfo();?>';
if(preg_match('[<>?]', $data)) {
die('No No No!'.$data);
}else{
echo "yes!";
}
?>
输出为
yes! PHP Warning: preg_match() expects parameter 2 to be string, array given in /usercode/file.php on line 3
虽然有警告,但是还是成功绕过了。
这里的代码
if(!preg_match('[<>?]', $s)){
$flag='None.';
}
表示如果变量$s中没有匹配到特定字符的话就令$flag为空,这样在后面的文件写入时,也不能获取到flag了。
$rand = rand(1,10000000);
$tmp="./uploads/".md5(time() + $rand).$filename;
file_put_contents($tmp, $flag);
这里是生成一个随机的文件名,并且将 flag 内容写进去
最后是输出文件名
echo "your file is in " . $tmp;
我们绕过后 flag 会写入到 文件名随机生成的文件中,该文件名最后是可知的。
按照之前分析的过程,很容易可以构建出payload
访问获取flag
结束
PHP代码审计分段讲解(14)的更多相关文章
- PHP代码审计分段讲解(13)
代码审计分段讲解之29题,代码如下: <?php require("config.php"); $table = $_GET['table']?$_GET['table']: ...
- PHP代码审计分段讲解(11)
后面的题目相对于之前的题目难度稍微提升了一些,所以对每道题进行单独的分析 27题 <?php if(!$_GET['id']) { header('Location: index.php?id= ...
- PHP代码审计分段讲解(6)
14 intval函数四舍五入 <?php if($_GET[id]) { mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_M ...
- PHP代码审计分段讲解(1)
PHP源码来自:https://github.com/bowu678/php_bugs 快乐的暑期学习生活+1 01 extract变量覆盖 <?php $flag='xxx'; extract ...
- PHP代码审计分段讲解(12)
28题 <!DOCTYPE html> <html> <head> <title>Web 350</title> <style typ ...
- PHP代码审计分段讲解(10)
26 unserialize()序列化 <!-- 题目:http://web.jarvisoj.com:32768 --> <!-- index.php --> <?ph ...
- PHP代码审计分段讲解(9)
22 弱类型整数大小比较绕过 <?php error_reporting(0); $flag = "flag{test}"; $temp = $_GET['password' ...
- PHP代码审计分段讲解(8)
20 十六进制与数字比较 源代码为: <?php error_reporting(0); function noother_says_correct($temp) { $flag = 'flag ...
- PHP代码审计分段讲解(7)
17 密码md5比较绕过 <?php if($_POST[user] && $_POST[pass]) { mysql_connect(SAE_MYSQL_HOST_M . ': ...
随机推荐
- 压缩法备份Linux系统文件
在使用Ubuntu之前,相信很多人都有过使用Windows系统的经历.如果你备份过Windows系统,那么你一定记忆犹新:首先需要找到一个备份工 具(通常都是私有软件),然后重启电脑进入备份工具提供的 ...
- gitlab - 解决添加webhook提示Url is blocked: Requests to the local network are not allowed的问题
问题背景 给项目添加 webhook 保存之后报错了 解决方案 进入 admin area 进入 settings-network 保存设置后,重新进入项目并设置 webhook 保存即可成功
- Java多线程技术:实现多用户服务端Socket通信
目录 前言回顾 一.多用户服务器 二.使用线程池实现服务端多线程 1.单线程版本 2.多线程版本 三.多用户与服务端通信演示 四.多用户服务器完整代码 最后 前言回顾 在上一篇<Java多线程实 ...
- Spider--补充--Re模块_2
# @ Author : Collin_PXY # Python 正则表达式的应用(二) # 正则表达式之所以让人头疼,很大程度是因为表达式里有大量的符号及它们的组合,还有很多匹配模式,想要记住比较困 ...
- ubutun 服务器中文设置
在连接到服务器时,我们看不到图形界面,按照常规的安装搜狗输入法行不通,查阅相关的资料找到一篇可以解决的 sudo apt-get update 如果出现 E: 无法下载 404 Not Found I ...
- 设计模式之工厂模式(Factory模式)
在面向对象系统设计中经常遇到以下两类问题: 1)为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口.这样我们可以通过声明一个指向基类的 ...
- 一文带你玩转对象存储COS文档预览
随着"互联网+"的发展,各行各业纷纷"去纸化",商务合同.会议纪要.组织公文.商品图片.培训视频.学习课件.随堂讲义等电子文档无处不在.而要查看文档一般需要先下 ...
- python之路 《六》函数
---恢复内容开始--- 为什么要有函数? 当你的老板要你写一个程序 1 def 函数0(): 2 # 如果cpu占用率>90 3 # 发送邮件 4 # 发出警报 5 6 def 函数1(): ...
- TensorFlow_笔记
Tensorflow 1.基本概念 TensorFlow是一个编程系统,使用图(graphs)来表示计算任务,图(graphs)中的节点称之为op(operation),一个op获得0个或多个Tens ...
- Spring第三天,详解Bean的生命周期,学会后让面试官无话可说!
点击下方链接回顾往期 不要再说不会Spring了!Spring第一天,学会进大厂! Spring第二天,你必须知道容器注册组件的几种方式!学废它吊打面试官! 今天讲解Spring中Bean的生命周期. ...