一、爆破-1
在php语言中,所有的已经定义的变量都会保存在GLOBALS全局数组中,比方说你定义了一个$name="李华",那么$GLOBALS['name']就等于“李华”。就是说,你可以通过这个全局数组来访问任何一个变量,所有已经定义过的变量都可以在里面通过变量名索引得到。
preg_match函数返回值为匹配到的次数。
审计代码可以知道,我们可以用GET传值方式?hello=GLOBALS,把所有的变量都打印出来得到flag
二、爆破-2
var_dump()函数:把命令以字符串形式返回
eval()函数:把括号里的字符串,当做PHP命令执行
题目说flag不在变量中,可能在文件中,想到函数
file_get_contents(path),获得指定路径下的文件内容,以字符串的形式返回
即把file_get_contents()函数命令赋值给$a,然后传入var_dump中,var_dump()函数将这个命令以字符串形式返回,进入到eval函数中,让eval函数来执行。
?hello=file_get_contents("flag.php")
查看源代码得到flag
三、爆破-3
有三个SESSION变量 nums:计数 time:记时 whoami:有个初始值 然后将$str_rands 生成的随机字符赋值给它。
$str_rands 就是生成2位随机的26字母
重点就是这个判断语句if($_SESSION['whoami']==($value[0].$value[1]) && substr(md5($value),5,4)==0),可以发现这个whoami最开始是ea,然后当和value前两位相等时就变为另一个随机数,并输出,所以我们每次获取这个输出的随机数赋值给value就好,后半句 只要保证value为数组,substr就会失败,则等号成立。
手动爆破即可得flag。
四、include
发现allow_url_include是on
可以查看输入流(只读) ?path=php://inout
post: 查看有哪些文件,发现 dle345aae.php
post:
另一种解法:利用php://filter/read=convert.base64-encode/resource=[文件路径]读取文件
EXP:
php://filter/read=convert.base64-encode/resource=/var/www/html/dle345aae.php
五、zone
修改login=1没反应,不知道哪里出现了问题,求指正
六、 OneThink
这个题跟着大佬WP做了一晚上也没做出来,过了一天再试了一下又成功了(疑惑了
Google一下OneThink框架的已知漏洞
参考i春秋的一篇文章:https://bbs.ichunqiu.com/thread-4918-1-1.html
本来想自己复现一下,但是我实在太菜了, SentCMS总是搭建不起来QAQ,就利用题目给的环境来做吧
漏洞利用条件:OneThink1.0 、 /Temp/Runtime目录可读可写
漏洞分析:thinkphp的缓存方式缺陷配合onethink过滤不严造成的命令执行漏洞。 thinkphp的默认缓存方式S()是以File方式,在/Runtime/Temp 下生成文件名固定的缓存文件,onethink在/Runtime/Temp生成固定的缓存文件2bb202459c30a1628513f40ab22fa01a.php,其中记录了用户名,由于注册时只限制了用户名长度,没有对内容进行过滤,造成了命令执行漏洞,用户可以利用注册的用户名来执行命令。
因为用户名长度被限制了,注册两个账号分别为%0a$a=$_GET[a];// %0aecho `$a`;//(%0a是换行符的urlencode), 然后依次登录,这里要注意顺序,因为先登录的会先写进缓存文件,顺序写反了就执行不了了。
重点注意的是,注册以及登陆账号时,需要burpsuite抓包将用户名urlencode,并将%250a改成%0a,使之URL解码时可以解码为换行符,否则会把换行符当做字符串来处理了。
最后访问 /Runtime/Temp/2bb202459c30a1628513f40ab22fa01a.php?a=cat ../../flag.php查看源代码得到flag